| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515 |  /* * # Semantic UI - 2.4.2 * https://github.com/Semantic-Org/Semantic-UI * http://www.semantic-ui.com/ * * Copyright 2014 Contributors * Released under the MIT license * http://opensource.org/licenses/MIT * *//*! * # Semantic UI 2.4.2 - Site * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {$.site = $.fn.site = function(parameters) {  var    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    settings        = ( $.isPlainObject(parameters) )      ? $.extend(true, {}, $.site.settings, parameters)      : $.extend({}, $.site.settings),    namespace       = settings.namespace,    error           = settings.error,    eventNamespace  = '.' + namespace,    moduleNamespace = 'module-' + namespace,    $document       = $(document),    $module         = $document,    element         = this,    instance        = $module.data(moduleNamespace),    module,    returnedValue  ;  module = {    initialize: function() {      module.instantiate();    },    instantiate: function() {      module.verbose('Storing instance of site', module);      instance = module;      $module        .data(moduleNamespace, module)      ;    },    normalize: function() {      module.fix.console();      module.fix.requestAnimationFrame();    },    fix: {      console: function() {        module.debug('Normalizing window.console');        if (console === undefined || console.log === undefined) {          module.verbose('Console not available, normalizing events');          module.disable.console();        }        if (typeof console.group == 'undefined' || typeof console.groupEnd == 'undefined' || typeof console.groupCollapsed == 'undefined') {          module.verbose('Console group not available, normalizing events');          window.console.group = function() {};          window.console.groupEnd = function() {};          window.console.groupCollapsed = function() {};        }        if (typeof console.markTimeline == 'undefined') {          module.verbose('Mark timeline not available, normalizing events');          window.console.markTimeline = function() {};        }      },      consoleClear: function() {        module.debug('Disabling programmatic console clearing');        window.console.clear = function() {};      },      requestAnimationFrame: function() {        module.debug('Normalizing requestAnimationFrame');        if(window.requestAnimationFrame === undefined) {          module.debug('RequestAnimationFrame not available, normalizing event');          window.requestAnimationFrame = window.requestAnimationFrame            || window.mozRequestAnimationFrame            || window.webkitRequestAnimationFrame            || window.msRequestAnimationFrame            || function(callback) { setTimeout(callback, 0); }          ;        }      }    },    moduleExists: function(name) {      return ($.fn[name] !== undefined && $.fn[name].settings !== undefined);    },    enabled: {      modules: function(modules) {        var          enabledModules = []        ;        modules = modules || settings.modules;        $.each(modules, function(index, name) {          if(module.moduleExists(name)) {            enabledModules.push(name);          }        });        return enabledModules;      }    },    disabled: {      modules: function(modules) {        var          disabledModules = []        ;        modules = modules || settings.modules;        $.each(modules, function(index, name) {          if(!module.moduleExists(name)) {            disabledModules.push(name);          }        });        return disabledModules;      }    },    change: {      setting: function(setting, value, modules, modifyExisting) {        modules = (typeof modules === 'string')          ? (modules === 'all')            ? settings.modules            : [modules]          : modules || settings.modules        ;        modifyExisting = (modifyExisting !== undefined)          ? modifyExisting          : true        ;        $.each(modules, function(index, name) {          var            namespace = (module.moduleExists(name))              ? $.fn[name].settings.namespace || false              : true,            $existingModules          ;          if(module.moduleExists(name)) {            module.verbose('Changing default setting', setting, value, name);            $.fn[name].settings[setting] = value;            if(modifyExisting && namespace) {              $existingModules = $(':data(module-' + namespace + ')');              if($existingModules.length > 0) {                module.verbose('Modifying existing settings', $existingModules);                $existingModules[name]('setting', setting, value);              }            }          }        });      },      settings: function(newSettings, modules, modifyExisting) {        modules = (typeof modules === 'string')          ? [modules]          : modules || settings.modules        ;        modifyExisting = (modifyExisting !== undefined)          ? modifyExisting          : true        ;        $.each(modules, function(index, name) {          var            $existingModules          ;          if(module.moduleExists(name)) {            module.verbose('Changing default setting', newSettings, name);            $.extend(true, $.fn[name].settings, newSettings);            if(modifyExisting && namespace) {              $existingModules = $(':data(module-' + namespace + ')');              if($existingModules.length > 0) {                module.verbose('Modifying existing settings', $existingModules);                $existingModules[name]('setting', newSettings);              }            }          }        });      }    },    enable: {      console: function() {        module.console(true);      },      debug: function(modules, modifyExisting) {        modules = modules || settings.modules;        module.debug('Enabling debug for modules', modules);        module.change.setting('debug', true, modules, modifyExisting);      },      verbose: function(modules, modifyExisting) {        modules = modules || settings.modules;        module.debug('Enabling verbose debug for modules', modules);        module.change.setting('verbose', true, modules, modifyExisting);      }    },    disable: {      console: function() {        module.console(false);      },      debug: function(modules, modifyExisting) {        modules = modules || settings.modules;        module.debug('Disabling debug for modules', modules);        module.change.setting('debug', false, modules, modifyExisting);      },      verbose: function(modules, modifyExisting) {        modules = modules || settings.modules;        module.debug('Disabling verbose debug for modules', modules);        module.change.setting('verbose', false, modules, modifyExisting);      }    },    console: function(enable) {      if(enable) {        if(instance.cache.console === undefined) {          module.error(error.console);          return;        }        module.debug('Restoring console function');        window.console = instance.cache.console;      }      else {        module.debug('Disabling console function');        instance.cache.console = window.console;        window.console = {          clear          : function(){},          error          : function(){},          group          : function(){},          groupCollapsed : function(){},          groupEnd       : function(){},          info           : function(){},          log            : function(){},          markTimeline   : function(){},          warn           : function(){}        };      }    },    destroy: function() {      module.verbose('Destroying previous site for', $module);      $module        .removeData(moduleNamespace)      ;    },    cache: {},    setting: function(name, value) {      if( $.isPlainObject(name) ) {        $.extend(true, settings, name);      }      else if(value !== undefined) {        settings[name] = value;      }      else {        return settings[name];      }    },    internal: function(name, value) {      if( $.isPlainObject(name) ) {        $.extend(true, module, name);      }      else if(value !== undefined) {        module[name] = value;      }      else {        return module[name];      }    },    debug: function() {      if(settings.debug) {        if(settings.performance) {          module.performance.log(arguments);        }        else {          module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');          module.debug.apply(console, arguments);        }      }    },    verbose: function() {      if(settings.verbose && settings.debug) {        if(settings.performance) {          module.performance.log(arguments);        }        else {          module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');          module.verbose.apply(console, arguments);        }      }    },    error: function() {      module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');      module.error.apply(console, arguments);    },    performance: {      log: function(message) {        var          currentTime,          executionTime,          previousTime        ;        if(settings.performance) {          currentTime   = new Date().getTime();          previousTime  = time || currentTime;          executionTime = currentTime - previousTime;          time          = currentTime;          performance.push({            'Element'        : element,            'Name'           : message[0],            'Arguments'      : [].slice.call(message, 1) || '',            'Execution Time' : executionTime          });        }        clearTimeout(module.performance.timer);        module.performance.timer = setTimeout(module.performance.display, 500);      },      display: function() {        var          title = settings.name + ':',          totalTime = 0        ;        time = false;        clearTimeout(module.performance.timer);        $.each(performance, function(index, data) {          totalTime += data['Execution Time'];        });        title += ' ' + totalTime + 'ms';        if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {          console.groupCollapsed(title);          if(console.table) {            console.table(performance);          }          else {            $.each(performance, function(index, data) {              console.log(data['Name'] + ': ' + data['Execution Time']+'ms');            });          }          console.groupEnd();        }        performance = [];      }    },    invoke: function(query, passedArguments, context) {      var        object = instance,        maxDepth,        found,        response      ;      passedArguments = passedArguments || queryArguments;      context         = element         || context;      if(typeof query == 'string' && object !== undefined) {        query    = query.split(/[\. ]/);        maxDepth = query.length - 1;        $.each(query, function(depth, value) {          var camelCaseValue = (depth != maxDepth)            ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)            : query          ;          if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {            object = object[camelCaseValue];          }          else if( object[camelCaseValue] !== undefined ) {            found = object[camelCaseValue];            return false;          }          else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {            object = object[value];          }          else if( object[value] !== undefined ) {            found = object[value];            return false;          }          else {            module.error(error.method, query);            return false;          }        });      }      if ( $.isFunction( found ) ) {        response = found.apply(context, passedArguments);      }      else if(found !== undefined) {        response = found;      }      if($.isArray(returnedValue)) {        returnedValue.push(response);      }      else if(returnedValue !== undefined) {        returnedValue = [returnedValue, response];      }      else if(response !== undefined) {        returnedValue = response;      }      return found;    }  };  if(methodInvoked) {    if(instance === undefined) {      module.initialize();    }    module.invoke(query);  }  else {    if(instance !== undefined) {      module.destroy();    }    module.initialize();  }  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.site.settings = {  name        : 'Site',  namespace   : 'site',  error : {    console : 'Console cannot be restored, most likely it was overwritten outside of module',    method : 'The method you called is not defined.'  },  debug       : false,  verbose     : false,  performance : true,  modules: [    'accordion',    'api',    'checkbox',    'dimmer',    'dropdown',    'embed',    'form',    'modal',    'nag',    'popup',    'rating',    'shape',    'sidebar',    'state',    'sticky',    'tab',    'transition',    'visit',    'visibility'  ],  siteNamespace   : 'site',  namespaceStub   : {    cache     : {},    config    : {},    sections  : {},    section   : {},    utilities : {}  }};// allows for selection of elements with data attributes$.extend($.expr[ ":" ], {  data: ($.expr.createPseudo)    ? $.expr.createPseudo(function(dataName) {        return function(elem) {          return !!$.data(elem, dataName);        };      })    : function(elem, i, match) {      // support: jQuery < 1.8      return !!$.data(elem, match[ 3 ]);    }});})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Form Validation * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.form = function(parameters) {  var    $allModules      = $(this),    moduleSelector   = $allModules.selector || '',    time             = new Date().getTime(),    performance      = [],    query            = arguments[0],    legacyParameters = arguments[1],    methodInvoked    = (typeof query == 'string'),    queryArguments   = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        $module     = $(this),        element     = this,        formErrors  = [],        keyHeldDown = false,        // set at run-time        $field,        $group,        $message,        $prompt,        $submit,        $clear,        $reset,        settings,        validation,        metadata,        selector,        className,        regExp,        error,        namespace,        moduleNamespace,        eventNamespace,        instance,        module      ;      module      = {        initialize: function() {          // settings grabbed at run time          module.get.settings();          if(methodInvoked) {            if(instance === undefined) {              module.instantiate();            }            module.invoke(query);          }          else {            if(instance !== undefined) {              instance.invoke('destroy');            }            module.verbose('Initializing form validation', $module, settings);            module.bindEvents();            module.set.defaults();            module.instantiate();          }        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous module', instance);          module.removeEvents();          $module            .removeData(moduleNamespace)          ;        },        refresh: function() {          module.verbose('Refreshing selector cache');          $field      = $module.find(selector.field);          $group      = $module.find(selector.group);          $message    = $module.find(selector.message);          $prompt     = $module.find(selector.prompt);          $submit     = $module.find(selector.submit);          $clear      = $module.find(selector.clear);          $reset      = $module.find(selector.reset);        },        submit: function() {          module.verbose('Submitting form', $module);          $module            .submit()          ;        },        attachEvents: function(selector, action) {          action = action || 'submit';          $(selector)            .on('click' + eventNamespace, function(event) {              module[action]();              event.preventDefault();            })          ;        },        bindEvents: function() {          module.verbose('Attaching form events');          $module            .on('submit' + eventNamespace, module.validate.form)            .on('blur'   + eventNamespace, selector.field, module.event.field.blur)            .on('click'  + eventNamespace, selector.submit, module.submit)            .on('click'  + eventNamespace, selector.reset, module.reset)            .on('click'  + eventNamespace, selector.clear, module.clear)          ;          if(settings.keyboardShortcuts) {            $module              .on('keydown' + eventNamespace, selector.field, module.event.field.keydown)            ;          }          $field            .each(function() {              var                $input     = $(this),                type       = $input.prop('type'),                inputEvent = module.get.changeEvent(type, $input)              ;              $(this)                .on(inputEvent + eventNamespace, module.event.field.change)              ;            })          ;        },        clear: function() {          $field            .each(function () {              var                $field       = $(this),                $element     = $field.parent(),                $fieldGroup  = $field.closest($group),                $prompt      = $fieldGroup.find(selector.prompt),                defaultValue = $field.data(metadata.defaultValue) || '',                isCheckbox   = $element.is(selector.uiCheckbox),                isDropdown   = $element.is(selector.uiDropdown),                isErrored    = $fieldGroup.hasClass(className.error)              ;              if(isErrored) {                module.verbose('Resetting error on field', $fieldGroup);                $fieldGroup.removeClass(className.error);                $prompt.remove();              }              if(isDropdown) {                module.verbose('Resetting dropdown value', $element, defaultValue);                $element.dropdown('clear');              }              else if(isCheckbox) {                $field.prop('checked', false);              }              else {                module.verbose('Resetting field value', $field, defaultValue);                $field.val('');              }            })          ;        },        reset: function() {          $field            .each(function () {              var                $field       = $(this),                $element     = $field.parent(),                $fieldGroup  = $field.closest($group),                $prompt      = $fieldGroup.find(selector.prompt),                defaultValue = $field.data(metadata.defaultValue),                isCheckbox   = $element.is(selector.uiCheckbox),                isDropdown   = $element.is(selector.uiDropdown),                isErrored    = $fieldGroup.hasClass(className.error)              ;              if(defaultValue === undefined) {                return;              }              if(isErrored) {                module.verbose('Resetting error on field', $fieldGroup);                $fieldGroup.removeClass(className.error);                $prompt.remove();              }              if(isDropdown) {                module.verbose('Resetting dropdown value', $element, defaultValue);                $element.dropdown('restore defaults');              }              else if(isCheckbox) {                module.verbose('Resetting checkbox value', $element, defaultValue);                $field.prop('checked', defaultValue);              }              else {                module.verbose('Resetting field value', $field, defaultValue);                $field.val(defaultValue);              }            })          ;        },        determine: {          isValid: function() {            var              allValid = true            ;            $.each(validation, function(fieldName, field) {              if( !( module.validate.field(field, fieldName, true) ) ) {                allValid = false;              }            });            return allValid;          }        },        is: {          bracketedRule: function(rule) {            return (rule.type && rule.type.match(settings.regExp.bracket));          },          shorthandFields: function(fields) {            var              fieldKeys = Object.keys(fields),              firstRule = fields[fieldKeys[0]]            ;            return module.is.shorthandRules(firstRule);          },          // duck type rule test          shorthandRules: function(rules) {            return (typeof rules == 'string' || $.isArray(rules));          },          empty: function($field) {            if(!$field || $field.length === 0) {              return true;            }            else if($field.is('input[type="checkbox"]')) {              return !$field.is(':checked');            }            else {              return module.is.blank($field);            }          },          blank: function($field) {            return $.trim($field.val()) === '';          },          valid: function(field) {            var              allValid = true            ;            if(field) {              module.verbose('Checking if field is valid', field);              return module.validate.field(validation[field], field, false);            }            else {              module.verbose('Checking if form is valid');              $.each(validation, function(fieldName, field) {                if( !module.is.valid(fieldName) ) {                  allValid = false;                }              });              return allValid;            }          }        },        removeEvents: function() {          $module            .off(eventNamespace)          ;          $field            .off(eventNamespace)          ;          $submit            .off(eventNamespace)          ;          $field            .off(eventNamespace)          ;        },        event: {          field: {            keydown: function(event) {              var                $field       = $(this),                key          = event.which,                isInput      = $field.is(selector.input),                isCheckbox   = $field.is(selector.checkbox),                isInDropdown = ($field.closest(selector.uiDropdown).length > 0),                keyCode      = {                  enter  : 13,                  escape : 27                }              ;              if( key == keyCode.escape) {                module.verbose('Escape key pressed blurring field');                $field                  .blur()                ;              }              if(!event.ctrlKey && key == keyCode.enter && isInput && !isInDropdown && !isCheckbox) {                if(!keyHeldDown) {                  $field                    .one('keyup' + eventNamespace, module.event.field.keyup)                  ;                  module.submit();                  module.debug('Enter pressed on input submitting form');                }                keyHeldDown = true;              }            },            keyup: function() {              keyHeldDown = false;            },            blur: function(event) {              var                $field          = $(this),                $fieldGroup     = $field.closest($group),                validationRules = module.get.validation($field)              ;              if( $fieldGroup.hasClass(className.error) ) {                module.debug('Revalidating field', $field, validationRules);                if(validationRules) {                  module.validate.field( validationRules );                }              }              else if(settings.on == 'blur') {                if(validationRules) {                  module.validate.field( validationRules );                }              }            },            change: function(event) {              var                $field      = $(this),                $fieldGroup = $field.closest($group),                validationRules = module.get.validation($field)              ;              if(validationRules && (settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) )) {                clearTimeout(module.timer);                module.timer = setTimeout(function() {                  module.debug('Revalidating field', $field,  module.get.validation($field));                  module.validate.field( validationRules );                }, settings.delay);              }            }          }        },        get: {          ancillaryValue: function(rule) {            if(!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {              return false;            }            return (rule.value !== undefined)              ? rule.value              : rule.type.match(settings.regExp.bracket)[1] + ''            ;          },          ruleName: function(rule) {            if( module.is.bracketedRule(rule) ) {              return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');            }            return rule.type;          },          changeEvent: function(type, $input) {            if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {              return 'change';            }            else {              return module.get.inputEvent();            }          },          inputEvent: function() {            return (document.createElement('input').oninput !== undefined)              ? 'input'              : (document.createElement('input').onpropertychange !== undefined)                ? 'propertychange'                : 'keyup'            ;          },          fieldsFromShorthand: function(fields) {            var              fullFields = {}            ;            $.each(fields, function(name, rules) {              if(typeof rules == 'string') {                rules = [rules];              }              fullFields[name] = {                rules: []              };              $.each(rules, function(index, rule) {                fullFields[name].rules.push({ type: rule });              });            });            return fullFields;          },          prompt: function(rule, field) {            var              ruleName      = module.get.ruleName(rule),              ancillary     = module.get.ancillaryValue(rule),              $field        = module.get.field(field.identifier),              value         = $field.val(),              prompt        = $.isFunction(rule.prompt)                ? rule.prompt(value)                : rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,              requiresValue = (prompt.search('{value}') !== -1),              requiresName  = (prompt.search('{name}') !== -1),              $label,              name            ;            if(requiresValue) {              prompt = prompt.replace('{value}', $field.val());            }            if(requiresName) {              $label = $field.closest(selector.group).find('label').eq(0);              name = ($label.length == 1)                ? $label.text()                : $field.prop('placeholder') || settings.text.unspecifiedField              ;              prompt = prompt.replace('{name}', name);            }            prompt = prompt.replace('{identifier}', field.identifier);            prompt = prompt.replace('{ruleValue}', ancillary);            if(!rule.prompt) {              module.verbose('Using default validation prompt for type', prompt, ruleName);            }            return prompt;          },          settings: function() {            if($.isPlainObject(parameters)) {              var                keys     = Object.keys(parameters),                isLegacySettings = (keys.length > 0)                  ? (parameters[keys[0]].identifier !== undefined && parameters[keys[0]].rules !== undefined)                  : false,                ruleKeys              ;              if(isLegacySettings) {                // 1.x (ducktyped)                settings   = $.extend(true, {}, $.fn.form.settings, legacyParameters);                validation = $.extend({}, $.fn.form.settings.defaults, parameters);                module.error(settings.error.oldSyntax, element);                module.verbose('Extending settings from legacy parameters', validation, settings);              }              else {                // 2.x                if(parameters.fields && module.is.shorthandFields(parameters.fields)) {                  parameters.fields = module.get.fieldsFromShorthand(parameters.fields);                }                settings   = $.extend(true, {}, $.fn.form.settings, parameters);                validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);                module.verbose('Extending settings', validation, settings);              }            }            else {              settings   = $.fn.form.settings;              validation = $.fn.form.settings.defaults;              module.verbose('Using default form validation', validation, settings);            }            // shorthand            namespace       = settings.namespace;            metadata        = settings.metadata;            selector        = settings.selector;            className       = settings.className;            regExp          = settings.regExp;            error           = settings.error;            moduleNamespace = 'module-' + namespace;            eventNamespace  = '.' + namespace;            // grab instance            instance = $module.data(moduleNamespace);            // refresh selector cache            module.refresh();          },          field: function(identifier) {            module.verbose('Finding field with identifier', identifier);            identifier = module.escape.string(identifier);            if($field.filter('#' + identifier).length > 0 ) {              return $field.filter('#' + identifier);            }            else if( $field.filter('[name="' + identifier +'"]').length > 0 ) {              return $field.filter('[name="' + identifier +'"]');            }            else if( $field.filter('[name="' + identifier +'[]"]').length > 0 ) {              return $field.filter('[name="' + identifier +'[]"]');            }            else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').length > 0 ) {              return $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]');            }            return $('<input/>');          },          fields: function(fields) {            var              $fields = $()            ;            $.each(fields, function(index, name) {              $fields = $fields.add( module.get.field(name) );            });            return $fields;          },          validation: function($field) {            var              fieldValidation,              identifier            ;            if(!validation) {              return false;            }            $.each(validation, function(fieldName, field) {              identifier = field.identifier || fieldName;              if( module.get.field(identifier)[0] == $field[0] ) {                field.identifier = identifier;                fieldValidation = field;              }            });            return fieldValidation || false;          },          value: function (field) {            var              fields = [],              results            ;            fields.push(field);            results = module.get.values.call(element, fields);            return results[field];          },          values: function (fields) {            var              $fields = $.isArray(fields)                ? module.get.fields(fields)                : $field,              values = {}            ;            $fields.each(function(index, field) {              var                $field     = $(field),                type       = $field.prop('type'),                name       = $field.prop('name'),                value      = $field.val(),                isCheckbox = $field.is(selector.checkbox),                isRadio    = $field.is(selector.radio),                isMultiple = (name.indexOf('[]') !== -1),                isChecked  = (isCheckbox)                  ? $field.is(':checked')                  : false              ;              if(name) {                if(isMultiple) {                  name = name.replace('[]', '');                  if(!values[name]) {                    values[name] = [];                  }                  if(isCheckbox) {                    if(isChecked) {                      values[name].push(value || true);                    }                    else {                      values[name].push(false);                    }                  }                  else {                    values[name].push(value);                  }                }                else {                  if(isRadio) {                    if(values[name] === undefined || values[name] == false) {                      values[name] = (isChecked)                        ? value || true                        : false                      ;                    }                  }                  else if(isCheckbox) {                    if(isChecked) {                      values[name] = value || true;                    }                    else {                      values[name] = false;                    }                  }                  else {                    values[name] = value;                  }                }              }            });            return values;          }        },        has: {          field: function(identifier) {            module.verbose('Checking for existence of a field with identifier', identifier);            identifier = module.escape.string(identifier);            if(typeof identifier !== 'string') {              module.error(error.identifier, identifier);            }            if($field.filter('#' + identifier).length > 0 ) {              return true;            }            else if( $field.filter('[name="' + identifier +'"]').length > 0 ) {              return true;            }            else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').length > 0 ) {              return true;            }            return false;          }        },        escape: {          string: function(text) {            text =  String(text);            return text.replace(regExp.escape, '\\$&');          }        },        add: {          // alias          rule: function(name, rules) {            module.add.field(name, rules);          },          field: function(name, rules) {            var              newValidation = {}            ;            if(module.is.shorthandRules(rules)) {              rules = $.isArray(rules)                ? rules                : [rules]              ;              newValidation[name] = {                rules: []              };              $.each(rules, function(index, rule) {                newValidation[name].rules.push({ type: rule });              });            }            else {              newValidation[name] = rules;            }            validation = $.extend({}, validation, newValidation);            module.debug('Adding rules', newValidation, validation);          },          fields: function(fields) {            var              newValidation            ;            if(fields && module.is.shorthandFields(fields)) {              newValidation = module.get.fieldsFromShorthand(fields);            }            else {              newValidation = fields;            }            validation = $.extend({}, validation, newValidation);          },          prompt: function(identifier, errors) {            var              $field       = module.get.field(identifier),              $fieldGroup  = $field.closest($group),              $prompt      = $fieldGroup.children(selector.prompt),              promptExists = ($prompt.length !== 0)            ;            errors = (typeof errors == 'string')              ? [errors]              : errors            ;            module.verbose('Adding field error state', identifier);            $fieldGroup              .addClass(className.error)            ;            if(settings.inline) {              if(!promptExists) {                $prompt = settings.templates.prompt(errors);                $prompt                  .appendTo($fieldGroup)                ;              }              $prompt                .html(errors[0])              ;              if(!promptExists) {                if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {                  module.verbose('Displaying error with css transition', settings.transition);                  $prompt.transition(settings.transition + ' in', settings.duration);                }                else {                  module.verbose('Displaying error with fallback javascript animation');                  $prompt                    .fadeIn(settings.duration)                  ;                }              }              else {                module.verbose('Inline errors are disabled, no inline error added', identifier);              }            }          },          errors: function(errors) {            module.debug('Adding form error messages', errors);            module.set.error();            $message              .html( settings.templates.error(errors) )            ;          }        },        remove: {          rule: function(field, rule) {            var              rules = $.isArray(rule)                ? rule                : [rule]            ;            if(rule == undefined) {              module.debug('Removed all rules');              validation[field].rules = [];              return;            }            if(validation[field] == undefined || !$.isArray(validation[field].rules)) {              return;            }            $.each(validation[field].rules, function(index, rule) {              if(rules.indexOf(rule.type) !== -1) {                module.debug('Removed rule', rule.type);                validation[field].rules.splice(index, 1);              }            });          },          field: function(field) {            var              fields = $.isArray(field)                ? field                : [field]            ;            $.each(fields, function(index, field) {              module.remove.rule(field);            });          },          // alias          rules: function(field, rules) {            if($.isArray(field)) {              $.each(fields, function(index, field) {                module.remove.rule(field, rules);              });            }            else {              module.remove.rule(field, rules);            }          },          fields: function(fields) {            module.remove.field(fields);          },          prompt: function(identifier) {            var              $field      = module.get.field(identifier),              $fieldGroup = $field.closest($group),              $prompt     = $fieldGroup.children(selector.prompt)            ;            $fieldGroup              .removeClass(className.error)            ;            if(settings.inline && $prompt.is(':visible')) {              module.verbose('Removing prompt for field', identifier);              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {                $prompt.transition(settings.transition + ' out', settings.duration, function() {                  $prompt.remove();                });              }              else {                $prompt                  .fadeOut(settings.duration, function(){                    $prompt.remove();                  })                ;              }            }          }        },        set: {          success: function() {            $module              .removeClass(className.error)              .addClass(className.success)            ;          },          defaults: function () {            $field              .each(function () {                var                  $field     = $(this),                  isCheckbox = ($field.filter(selector.checkbox).length > 0),                  value      = (isCheckbox)                    ? $field.is(':checked')                    : $field.val()                ;                $field.data(metadata.defaultValue, value);              })            ;          },          error: function() {            $module              .removeClass(className.success)              .addClass(className.error)            ;          },          value: function (field, value) {            var              fields = {}            ;            fields[field] = value;            return module.set.values.call(element, fields);          },          values: function (fields) {            if($.isEmptyObject(fields)) {              return;            }            $.each(fields, function(key, value) {              var                $field      = module.get.field(key),                $element    = $field.parent(),                isMultiple  = $.isArray(value),                isCheckbox  = $element.is(selector.uiCheckbox),                isDropdown  = $element.is(selector.uiDropdown),                isRadio     = ($field.is(selector.radio) && isCheckbox),                fieldExists = ($field.length > 0),                $multipleField              ;              if(fieldExists) {                if(isMultiple && isCheckbox) {                  module.verbose('Selecting multiple', value, $field);                  $element.checkbox('uncheck');                  $.each(value, function(index, value) {                    $multipleField = $field.filter('[value="' + value + '"]');                    $element       = $multipleField.parent();                    if($multipleField.length > 0) {                      $element.checkbox('check');                    }                  });                }                else if(isRadio) {                  module.verbose('Selecting radio value', value, $field);                  $field.filter('[value="' + value + '"]')                    .parent(selector.uiCheckbox)                      .checkbox('check')                  ;                }                else if(isCheckbox) {                  module.verbose('Setting checkbox value', value, $element);                  if(value === true) {                    $element.checkbox('check');                  }                  else {                    $element.checkbox('uncheck');                  }                }                else if(isDropdown) {                  module.verbose('Setting dropdown value', value, $element);                  $element.dropdown('set selected', value);                }                else {                  module.verbose('Setting field value', value, $field);                  $field.val(value);                }              }            });          }        },        validate: {          form: function(event, ignoreCallbacks) {            var              values = module.get.values(),              apiRequest            ;            // input keydown event will fire submit repeatedly by browser default            if(keyHeldDown) {              return false;            }            // reset errors            formErrors = [];            if( module.determine.isValid() ) {              module.debug('Form has no validation errors, submitting');              module.set.success();              if(ignoreCallbacks !== true) {                return settings.onSuccess.call(element, event, values);              }            }            else {              module.debug('Form has errors');              module.set.error();              if(!settings.inline) {                module.add.errors(formErrors);              }              // prevent ajax submit              if($module.data('moduleApi') !== undefined) {                event.stopImmediatePropagation();              }              if(ignoreCallbacks !== true) {                return settings.onFailure.call(element, formErrors, values);              }            }          },          // takes a validation object and returns whether field passes validation          field: function(field, fieldName, showErrors) {            showErrors = (showErrors !== undefined)              ? showErrors              : true            ;            if(typeof field == 'string') {              module.verbose('Validating field', field);              fieldName = field;              field     = validation[field];            }            var              identifier    = field.identifier || fieldName,              $field        = module.get.field(identifier),              $dependsField = (field.depends)                ? module.get.field(field.depends)                : false,              fieldValid  = true,              fieldErrors = []            ;            if(!field.identifier) {              module.debug('Using field name as identifier', identifier);              field.identifier = identifier;            }            if($field.prop('disabled')) {              module.debug('Field is disabled. Skipping', identifier);              fieldValid = true;            }            else if(field.optional && module.is.blank($field)){              module.debug('Field is optional and blank. Skipping', identifier);              fieldValid = true;            }            else if(field.depends && module.is.empty($dependsField)) {              module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);              fieldValid = true;            }            else if(field.rules !== undefined) {              $.each(field.rules, function(index, rule) {                if( module.has.field(identifier) && !( module.validate.rule(field, rule) ) ) {                  module.debug('Field is invalid', identifier, rule.type);                  fieldErrors.push(module.get.prompt(rule, field));                  fieldValid = false;                }              });            }            if(fieldValid) {              if(showErrors) {                module.remove.prompt(identifier, fieldErrors);                settings.onValid.call($field);              }            }            else {              if(showErrors) {                formErrors = formErrors.concat(fieldErrors);                module.add.prompt(identifier, fieldErrors);                settings.onInvalid.call($field, fieldErrors);              }              return false;            }            return true;          },          // takes validation rule and returns whether field passes rule          rule: function(field, rule) {            var              $field       = module.get.field(field.identifier),              type         = rule.type,              value        = $field.val(),              isValid      = true,              ancillary    = module.get.ancillaryValue(rule),              ruleName     = module.get.ruleName(rule),              ruleFunction = settings.rules[ruleName]            ;            if( !$.isFunction(ruleFunction) ) {              module.error(error.noRule, ruleName);              return;            }            // cast to string avoiding encoding special values            value = (value === undefined || value === '' || value === null)              ? ''              : $.trim(value + '')            ;            return ruleFunction.call($field, value, ancillary);          }        },        setting: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            settings[name] = value;          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      module.initialize();    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.form.settings = {  name              : 'Form',  namespace         : 'form',  debug             : false,  verbose           : false,  performance       : true,  fields            : false,  keyboardShortcuts : true,  on                : 'submit',  inline            : false,  delay             : 200,  revalidate        : true,  transition        : 'scale',  duration          : 200,  onValid           : function() {},  onInvalid         : function() {},  onSuccess         : function() { return true; },  onFailure         : function() { return false; },  metadata : {    defaultValue : 'default',    validate     : 'validate'  },  regExp: {    htmlID  : /^[a-zA-Z][\w:.-]*$/g,    bracket : /\[(.*)\]/i,    decimal : /^\d+\.?\d*$/,    email   : /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,    escape  : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,    flags   : /^\/(.*)\/(.*)?/,    integer : /^\-?\d+$/,    number  : /^\-?\d*(\.\d+)?$/,    url     : /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/i  },  text: {    unspecifiedRule  : 'Please enter a valid value',    unspecifiedField : 'This field'  },  prompt: {    empty                : '{name} must have a value',    checked              : '{name} must be checked',    email                : '{name} must be a valid e-mail',    url                  : '{name} must be a valid url',    regExp               : '{name} is not formatted correctly',    integer              : '{name} must be an integer',    decimal              : '{name} must be a decimal number',    number               : '{name} must be set to a number',    is                   : '{name} must be "{ruleValue}"',    isExactly            : '{name} must be exactly "{ruleValue}"',    not                  : '{name} cannot be set to "{ruleValue}"',    notExactly           : '{name} cannot be set to exactly "{ruleValue}"',    contain              : '{name} must contain "{ruleValue}"',    containExactly       : '{name} must contain exactly "{ruleValue}"',    doesntContain        : '{name} cannot contain  "{ruleValue}"',    doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',    minLength            : '{name} must be at least {ruleValue} characters',    length               : '{name} must be at least {ruleValue} characters',    exactLength          : '{name} must be exactly {ruleValue} characters',    maxLength            : '{name} cannot be longer than {ruleValue} characters',    match                : '{name} must match {ruleValue} field',    different            : '{name} must have a different value than {ruleValue} field',    creditCard           : '{name} must be a valid credit card number',    minCount             : '{name} must have at least {ruleValue} choices',    exactCount           : '{name} must have exactly {ruleValue} choices',    maxCount             : '{name} must have {ruleValue} or less choices'  },  selector : {    checkbox   : 'input[type="checkbox"], input[type="radio"]',    clear      : '.clear',    field      : 'input, textarea, select',    group      : '.field',    input      : 'input',    message    : '.error.message',    prompt     : '.prompt.label',    radio      : 'input[type="radio"]',    reset      : '.reset:not([type="reset"])',    submit     : '.submit:not([type="submit"])',    uiCheckbox : '.ui.checkbox',    uiDropdown : '.ui.dropdown'  },  className : {    error   : 'error',    label   : 'ui prompt label',    pressed : 'down',    success : 'success'  },  error: {    identifier : 'You must specify a string identifier for each field',    method     : 'The method you called is not defined.',    noRule     : 'There is no rule matching the one you specified',    oldSyntax  : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.'  },  templates: {    // template that produces error message    error: function(errors) {      var        html = '<ul class="list">'      ;      $.each(errors, function(index, value) {        html += '<li>' + value + '</li>';      });      html += '</ul>';      return $(html);    },    // template that produces label    prompt: function(errors) {      return $('<div/>')        .addClass('ui basic red pointing prompt label')        .html(errors[0])      ;    }  },  rules: {    // is not empty or blank string    empty: function(value) {      return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);    },    // checkbox checked    checked: function() {      return ($(this).filter(':checked').length > 0);    },    // is most likely an email    email: function(value){      return $.fn.form.settings.regExp.email.test(value);    },    // value is most likely url    url: function(value) {      return $.fn.form.settings.regExp.url.test(value);    },    // matches specified regExp    regExp: function(value, regExp) {      if(regExp instanceof RegExp) {        return value.match(regExp);      }      var        regExpParts = regExp.match($.fn.form.settings.regExp.flags),        flags      ;      // regular expression specified as /baz/gi (flags)      if(regExpParts) {        regExp = (regExpParts.length >= 2)          ? regExpParts[1]          : regExp        ;        flags = (regExpParts.length >= 3)          ? regExpParts[2]          : ''        ;      }      return value.match( new RegExp(regExp, flags) );    },    // is valid integer or matches range    integer: function(value, range) {      var        intRegExp = $.fn.form.settings.regExp.integer,        min,        max,        parts      ;      if( !range || ['', '..'].indexOf(range) !== -1) {        // do nothing      }      else if(range.indexOf('..') == -1) {        if(intRegExp.test(range)) {          min = max = range - 0;        }      }      else {        parts = range.split('..', 2);        if(intRegExp.test(parts[0])) {          min = parts[0] - 0;        }        if(intRegExp.test(parts[1])) {          max = parts[1] - 0;        }      }      return (        intRegExp.test(value) &&        (min === undefined || value >= min) &&        (max === undefined || value <= max)      );    },    // is valid number (with decimal)    decimal: function(value) {      return $.fn.form.settings.regExp.decimal.test(value);    },    // is valid number    number: function(value) {      return $.fn.form.settings.regExp.number.test(value);    },    // is value (case insensitive)    is: function(value, text) {      text = (typeof text == 'string')        ? text.toLowerCase()        : text      ;      value = (typeof value == 'string')        ? value.toLowerCase()        : value      ;      return (value == text);    },    // is value    isExactly: function(value, text) {      return (value == text);    },    // value is not another value (case insensitive)    not: function(value, notValue) {      value = (typeof value == 'string')        ? value.toLowerCase()        : value      ;      notValue = (typeof notValue == 'string')        ? notValue.toLowerCase()        : notValue      ;      return (value != notValue);    },    // value is not another value (case sensitive)    notExactly: function(value, notValue) {      return (value != notValue);    },    // value contains text (insensitive)    contains: function(value, text) {      // escape regex characters      text = text.replace($.fn.form.settings.regExp.escape, "\\$&");      return (value.search( new RegExp(text, 'i') ) !== -1);    },    // value contains text (case sensitive)    containsExactly: function(value, text) {      // escape regex characters      text = text.replace($.fn.form.settings.regExp.escape, "\\$&");      return (value.search( new RegExp(text) ) !== -1);    },    // value contains text (insensitive)    doesntContain: function(value, text) {      // escape regex characters      text = text.replace($.fn.form.settings.regExp.escape, "\\$&");      return (value.search( new RegExp(text, 'i') ) === -1);    },    // value contains text (case sensitive)    doesntContainExactly: function(value, text) {      // escape regex characters      text = text.replace($.fn.form.settings.regExp.escape, "\\$&");      return (value.search( new RegExp(text) ) === -1);    },    // is at least string length    minLength: function(value, requiredLength) {      return (value !== undefined)        ? (value.length >= requiredLength)        : false      ;    },    // see rls notes for 2.0.6 (this is a duplicate of minLength)    length: function(value, requiredLength) {      return (value !== undefined)        ? (value.length >= requiredLength)        : false      ;    },    // is exactly length    exactLength: function(value, requiredLength) {      return (value !== undefined)        ? (value.length == requiredLength)        : false      ;    },    // is less than length    maxLength: function(value, maxLength) {      return (value !== undefined)        ? (value.length <= maxLength)        : false      ;    },    // matches another field    match: function(value, identifier) {      var        $form = $(this),        matchingValue      ;      if( $('[data-validate="'+ identifier +'"]').length > 0 ) {        matchingValue = $('[data-validate="'+ identifier +'"]').val();      }      else if($('#' + identifier).length > 0) {        matchingValue = $('#' + identifier).val();      }      else if($('[name="' + identifier +'"]').length > 0) {        matchingValue = $('[name="' + identifier + '"]').val();      }      else if( $('[name="' + identifier +'[]"]').length > 0 ) {        matchingValue = $('[name="' + identifier +'[]"]');      }      return (matchingValue !== undefined)        ? ( value.toString() == matchingValue.toString() )        : false      ;    },    // different than another field    different: function(value, identifier) {      // use either id or name of field      var        $form = $(this),        matchingValue      ;      if( $('[data-validate="'+ identifier +'"]').length > 0 ) {        matchingValue = $('[data-validate="'+ identifier +'"]').val();      }      else if($('#' + identifier).length > 0) {        matchingValue = $('#' + identifier).val();      }      else if($('[name="' + identifier +'"]').length > 0) {        matchingValue = $('[name="' + identifier + '"]').val();      }      else if( $('[name="' + identifier +'[]"]').length > 0 ) {        matchingValue = $('[name="' + identifier +'[]"]');      }      return (matchingValue !== undefined)        ? ( value.toString() !== matchingValue.toString() )        : false      ;    },    creditCard: function(cardNumber, cardTypes) {      var        cards = {          visa: {            pattern : /^4/,            length  : [16]          },          amex: {            pattern : /^3[47]/,            length  : [15]          },          mastercard: {            pattern : /^5[1-5]/,            length  : [16]          },          discover: {            pattern : /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,            length  : [16]          },          unionPay: {            pattern : /^(62|88)/,            length  : [16, 17, 18, 19]          },          jcb: {            pattern : /^35(2[89]|[3-8][0-9])/,            length  : [16]          },          maestro: {            pattern : /^(5018|5020|5038|6304|6759|676[1-3])/,            length  : [12, 13, 14, 15, 16, 17, 18, 19]          },          dinersClub: {            pattern : /^(30[0-5]|^36)/,            length  : [14]          },          laser: {            pattern : /^(6304|670[69]|6771)/,            length  : [16, 17, 18, 19]          },          visaElectron: {            pattern : /^(4026|417500|4508|4844|491(3|7))/,            length  : [16]          }        },        valid         = {},        validCard     = false,        requiredTypes = (typeof cardTypes == 'string')          ? cardTypes.split(',')          : false,        unionPay,        validation      ;      if(typeof cardNumber !== 'string' || cardNumber.length === 0) {        return;      }      // allow dashes in card      cardNumber = cardNumber.replace(/[\-]/g, '');      // verify card types      if(requiredTypes) {        $.each(requiredTypes, function(index, type){          // verify each card type          validation = cards[type];          if(validation) {            valid = {              length  : ($.inArray(cardNumber.length, validation.length) !== -1),              pattern : (cardNumber.search(validation.pattern) !== -1)            };            if(valid.length && valid.pattern) {              validCard = true;            }          }        });        if(!validCard) {          return false;        }      }      // skip luhn for UnionPay      unionPay = {        number  : ($.inArray(cardNumber.length, cards.unionPay.length) !== -1),        pattern : (cardNumber.search(cards.unionPay.pattern) !== -1)      };      if(unionPay.number && unionPay.pattern) {        return true;      }      // verify luhn, adapted from  <https://gist.github.com/2134376>      var        length        = cardNumber.length,        multiple      = 0,        producedValue = [          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],          [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]        ],        sum           = 0      ;      while (length--) {        sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];        multiple ^= 1;      }      return (sum % 10 === 0 && sum > 0);    },    minCount: function(value, minCount) {      if(minCount == 0) {        return true;      }      if(minCount == 1) {        return (value !== '');      }      return (value.split(',').length >= minCount);    },    exactCount: function(value, exactCount) {      if(exactCount == 0) {        return (value === '');      }      if(exactCount == 1) {        return (value !== '' && value.search(',') === -1);      }      return (value.split(',').length == exactCount);    },    maxCount: function(value, maxCount) {      if(maxCount == 0) {        return false;      }      if(maxCount == 1) {        return (value.search(',') === -1);      }      return (value.split(',').length <= maxCount);    }  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Accordion * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.accordion = function(parameters) {  var    $allModules     = $(this),    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    requestAnimationFrame = window.requestAnimationFrame      || window.mozRequestAnimationFrame      || window.webkitRequestAnimationFrame      || window.msRequestAnimationFrame      || function(callback) { setTimeout(callback, 0); },    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.accordion.settings, parameters)          : $.extend({}, $.fn.accordion.settings),        className       = settings.className,        namespace       = settings.namespace,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        moduleSelector  = $allModules.selector || '',        $module  = $(this),        $title   = $module.find(selector.title),        $content = $module.find(selector.content),        element  = this,        instance = $module.data(moduleNamespace),        observer,        module      ;      module = {        initialize: function() {          module.debug('Initializing', $module);          module.bind.events();          if(settings.observeChanges) {            module.observeChanges();          }          module.instantiate();        },        instantiate: function() {          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.debug('Destroying previous instance', $module);          $module            .off(eventNamespace)            .removeData(moduleNamespace)          ;        },        refresh: function() {          $title   = $module.find(selector.title);          $content = $module.find(selector.content);        },        observeChanges: function() {          if('MutationObserver' in window) {            observer = new MutationObserver(function(mutations) {              module.debug('DOM tree modified, updating selector cache');              module.refresh();            });            observer.observe(element, {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', observer);          }        },        bind: {          events: function() {            module.debug('Binding delegated events');            $module              .on(settings.on + eventNamespace, selector.trigger, module.event.click)            ;          }        },        event: {          click: function() {            module.toggle.call(this);          }        },        toggle: function(query) {          var            $activeTitle = (query !== undefined)              ? (typeof query === 'number')                ? $title.eq(query)                : $(query).closest(selector.title)              : $(this).closest(selector.title),            $activeContent = $activeTitle.next($content),            isAnimating = $activeContent.hasClass(className.animating),            isActive    = $activeContent.hasClass(className.active),            isOpen      = (isActive && !isAnimating),            isOpening   = (!isActive && isAnimating)          ;          module.debug('Toggling visibility of content', $activeTitle);          if(isOpen || isOpening) {            if(settings.collapsible) {              module.close.call($activeTitle);            }            else {              module.debug('Cannot close accordion content collapsing is disabled');            }          }          else {            module.open.call($activeTitle);          }        },        open: function(query) {          var            $activeTitle = (query !== undefined)              ? (typeof query === 'number')                ? $title.eq(query)                : $(query).closest(selector.title)              : $(this).closest(selector.title),            $activeContent = $activeTitle.next($content),            isAnimating = $activeContent.hasClass(className.animating),            isActive    = $activeContent.hasClass(className.active),            isOpen      = (isActive || isAnimating)          ;          if(isOpen) {            module.debug('Accordion already open, skipping', $activeContent);            return;          }          module.debug('Opening accordion content', $activeTitle);          settings.onOpening.call($activeContent);          settings.onChanging.call($activeContent);          if(settings.exclusive) {            module.closeOthers.call($activeTitle);          }          $activeTitle            .addClass(className.active)          ;          $activeContent            .stop(true, true)            .addClass(className.animating)          ;          if(settings.animateChildren) {            if($.fn.transition !== undefined && $module.transition('is supported')) {              $activeContent                .children()                  .transition({                    animation   : 'fade in',                    queue       : false,                    useFailSafe : true,                    debug       : settings.debug,                    verbose     : settings.verbose,                    duration    : settings.duration                  })              ;            }            else {              $activeContent                .children()                  .stop(true, true)                  .animate({                    opacity: 1                  }, settings.duration, module.resetOpacity)              ;            }          }          $activeContent            .slideDown(settings.duration, settings.easing, function() {              $activeContent                .removeClass(className.animating)                .addClass(className.active)              ;              module.reset.display.call(this);              settings.onOpen.call(this);              settings.onChange.call(this);            })          ;        },        close: function(query) {          var            $activeTitle = (query !== undefined)              ? (typeof query === 'number')                ? $title.eq(query)                : $(query).closest(selector.title)              : $(this).closest(selector.title),            $activeContent = $activeTitle.next($content),            isAnimating    = $activeContent.hasClass(className.animating),            isActive       = $activeContent.hasClass(className.active),            isOpening      = (!isActive && isAnimating),            isClosing      = (isActive && isAnimating)          ;          if((isActive || isOpening) && !isClosing) {            module.debug('Closing accordion content', $activeContent);            settings.onClosing.call($activeContent);            settings.onChanging.call($activeContent);            $activeTitle              .removeClass(className.active)            ;            $activeContent              .stop(true, true)              .addClass(className.animating)            ;            if(settings.animateChildren) {              if($.fn.transition !== undefined && $module.transition('is supported')) {                $activeContent                  .children()                    .transition({                      animation   : 'fade out',                      queue       : false,                      useFailSafe : true,                      debug       : settings.debug,                      verbose     : settings.verbose,                      duration    : settings.duration                    })                ;              }              else {                $activeContent                  .children()                    .stop(true, true)                    .animate({                      opacity: 0                    }, settings.duration, module.resetOpacity)                ;              }            }            $activeContent              .slideUp(settings.duration, settings.easing, function() {                $activeContent                  .removeClass(className.animating)                  .removeClass(className.active)                ;                module.reset.display.call(this);                settings.onClose.call(this);                settings.onChange.call(this);              })            ;          }        },        closeOthers: function(index) {          var            $activeTitle = (index !== undefined)              ? $title.eq(index)              : $(this).closest(selector.title),            $parentTitles    = $activeTitle.parents(selector.content).prev(selector.title),            $activeAccordion = $activeTitle.closest(selector.accordion),            activeSelector   = selector.title + '.' + className.active + ':visible',            activeContent    = selector.content + '.' + className.active + ':visible',            $openTitles,            $nestedTitles,            $openContents          ;          if(settings.closeNested) {            $openTitles   = $activeAccordion.find(activeSelector).not($parentTitles);            $openContents = $openTitles.next($content);          }          else {            $openTitles   = $activeAccordion.find(activeSelector).not($parentTitles);            $nestedTitles = $activeAccordion.find(activeContent).find(activeSelector).not($parentTitles);            $openTitles   = $openTitles.not($nestedTitles);            $openContents = $openTitles.next($content);          }          if( ($openTitles.length > 0) ) {            module.debug('Exclusive enabled, closing other content', $openTitles);            $openTitles              .removeClass(className.active)            ;            $openContents              .removeClass(className.animating)              .stop(true, true)            ;            if(settings.animateChildren) {              if($.fn.transition !== undefined && $module.transition('is supported')) {                $openContents                  .children()                    .transition({                      animation   : 'fade out',                      useFailSafe : true,                      debug       : settings.debug,                      verbose     : settings.verbose,                      duration    : settings.duration                    })                ;              }              else {                $openContents                  .children()                    .stop(true, true)                    .animate({                      opacity: 0                    }, settings.duration, module.resetOpacity)                ;              }            }            $openContents              .slideUp(settings.duration , settings.easing, function() {                $(this).removeClass(className.active);                module.reset.display.call(this);              })            ;          }        },        reset: {          display: function() {            module.verbose('Removing inline display from element', this);            $(this).css('display', '');            if( $(this).attr('style') === '') {              $(this)                .attr('style', '')                .removeAttr('style')              ;            }          },          opacity: function() {            module.verbose('Removing inline opacity from element', this);            $(this).css('opacity', '');            if( $(this).attr('style') === '') {              $(this)                .attr('style', '')                .removeAttr('style')              ;            }          },        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          module.debug('Changing internal', name, value);          if(value !== undefined) {            if( $.isPlainObject(name) ) {              $.extend(true, module, name);            }            else {              module[name] = value;            }          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.accordion.settings = {  name            : 'Accordion',  namespace       : 'accordion',  silent          : false,  debug           : false,  verbose         : false,  performance     : true,  on              : 'click', // event on title that opens accordion  observeChanges  : true,  // whether accordion should automatically refresh on DOM insertion  exclusive       : true,  // whether a single accordion content panel should be open at once  collapsible     : true,  // whether accordion content can be closed  closeNested     : false, // whether nested content should be closed when a panel is closed  animateChildren : true,  // whether children opacity should be animated  duration        : 350, // duration of animation  easing          : 'easeOutQuad', // easing equation for animation  onOpening       : function(){}, // callback before open animation  onClosing       : function(){}, // callback before closing animation  onChanging      : function(){}, // callback before closing or opening animation  onOpen          : function(){}, // callback after open animation  onClose         : function(){}, // callback after closing animation  onChange        : function(){}, // callback after closing or opening animation  error: {    method : 'The method you called is not defined'  },  className   : {    active    : 'active',    animating : 'animating'  },  selector    : {    accordion : '.accordion',    title     : '.title',    trigger   : '.title',    content   : '.content'  }};// Adds easing$.extend( $.easing, {  easeOutQuad: function (x, t, b, c, d) {    return -c *(t/=d)*(t-2) + b;  }});})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Checkbox * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.checkbox = function(parameters) {  var    $allModules    = $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings        = $.extend(true, {}, $.fn.checkbox.settings, parameters),        className       = settings.className,        namespace       = settings.namespace,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $module         = $(this),        $label          = $(this).children(selector.label),        $input          = $(this).children(selector.input),        input           = $input[0],        initialLoad     = false,        shortcutPressed = false,        instance        = $module.data(moduleNamespace),        observer,        element         = this,        module      ;      module      = {        initialize: function() {          module.verbose('Initializing checkbox', settings);          module.create.label();          module.bind.events();          module.set.tabbable();          module.hide.input();          module.observeChanges();          module.instantiate();          module.setup();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying module');          module.unbind.events();          module.show.input();          $module.removeData(moduleNamespace);        },        fix: {          reference: function() {            if( $module.is(selector.input) ) {              module.debug('Behavior called on <input> adjusting invoked element');              $module = $module.closest(selector.checkbox);              module.refresh();            }          }        },        setup: function() {          module.set.initialLoad();          if( module.is.indeterminate() ) {            module.debug('Initial value is indeterminate');            module.indeterminate();          }          else if( module.is.checked() ) {            module.debug('Initial value is checked');            module.check();          }          else {            module.debug('Initial value is unchecked');            module.uncheck();          }          module.remove.initialLoad();        },        refresh: function() {          $label = $module.children(selector.label);          $input = $module.children(selector.input);          input  = $input[0];        },        hide: {          input: function() {            module.verbose('Modifying <input> z-index to be unselectable');            $input.addClass(className.hidden);          }        },        show: {          input: function() {            module.verbose('Modifying <input> z-index to be selectable');            $input.removeClass(className.hidden);          }        },        observeChanges: function() {          if('MutationObserver' in window) {            observer = new MutationObserver(function(mutations) {              module.debug('DOM tree modified, updating selector cache');              module.refresh();            });            observer.observe(element, {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', observer);          }        },        attachEvents: function(selector, event) {          var            $element = $(selector)          ;          event = $.isFunction(module[event])            ? module[event]            : module.toggle          ;          if($element.length > 0) {            module.debug('Attaching checkbox events to element', selector, event);            $element              .on('click' + eventNamespace, event)            ;          }          else {            module.error(error.notFound);          }        },        event: {          click: function(event) {            var              $target = $(event.target)            ;            if( $target.is(selector.input) ) {              module.verbose('Using default check action on initialized checkbox');              return;            }            if( $target.is(selector.link) ) {              module.debug('Clicking link inside checkbox, skipping toggle');              return;            }            module.toggle();            $input.focus();            event.preventDefault();          },          keydown: function(event) {            var              key     = event.which,              keyCode = {                enter  : 13,                space  : 32,                escape : 27              }            ;            if(key == keyCode.escape) {              module.verbose('Escape key pressed blurring field');              $input.blur();              shortcutPressed = true;            }            else if(!event.ctrlKey && ( key == keyCode.space || key == keyCode.enter) ) {              module.verbose('Enter/space key pressed, toggling checkbox');              module.toggle();              shortcutPressed = true;            }            else {              shortcutPressed = false;            }          },          keyup: function(event) {            if(shortcutPressed) {              event.preventDefault();            }          }        },        check: function() {          if( !module.should.allowCheck() ) {            return;          }          module.debug('Checking checkbox', $input);          module.set.checked();          if( !module.should.ignoreCallbacks() ) {            settings.onChecked.call(input);            settings.onChange.call(input);          }        },        uncheck: function() {          if( !module.should.allowUncheck() ) {            return;          }          module.debug('Unchecking checkbox');          module.set.unchecked();          if( !module.should.ignoreCallbacks() ) {            settings.onUnchecked.call(input);            settings.onChange.call(input);          }        },        indeterminate: function() {          if( module.should.allowIndeterminate() ) {            module.debug('Checkbox is already indeterminate');            return;          }          module.debug('Making checkbox indeterminate');          module.set.indeterminate();          if( !module.should.ignoreCallbacks() ) {            settings.onIndeterminate.call(input);            settings.onChange.call(input);          }        },        determinate: function() {          if( module.should.allowDeterminate() ) {            module.debug('Checkbox is already determinate');            return;          }          module.debug('Making checkbox determinate');          module.set.determinate();          if( !module.should.ignoreCallbacks() ) {            settings.onDeterminate.call(input);            settings.onChange.call(input);          }        },        enable: function() {          if( module.is.enabled() ) {            module.debug('Checkbox is already enabled');            return;          }          module.debug('Enabling checkbox');          module.set.enabled();          settings.onEnable.call(input);          // preserve legacy callbacks          settings.onEnabled.call(input);        },        disable: function() {          if( module.is.disabled() ) {            module.debug('Checkbox is already disabled');            return;          }          module.debug('Disabling checkbox');          module.set.disabled();          settings.onDisable.call(input);          // preserve legacy callbacks          settings.onDisabled.call(input);        },        get: {          radios: function() {            var              name = module.get.name()            ;            return $('input[name="' + name + '"]').closest(selector.checkbox);          },          otherRadios: function() {            return module.get.radios().not($module);          },          name: function() {            return $input.attr('name');          }        },        is: {          initialLoad: function() {            return initialLoad;          },          radio: function() {            return ($input.hasClass(className.radio) || $input.attr('type') == 'radio');          },          indeterminate: function() {            return $input.prop('indeterminate') !== undefined && $input.prop('indeterminate');          },          checked: function() {            return $input.prop('checked') !== undefined && $input.prop('checked');          },          disabled: function() {            return $input.prop('disabled') !== undefined && $input.prop('disabled');          },          enabled: function() {            return !module.is.disabled();          },          determinate: function() {            return !module.is.indeterminate();          },          unchecked: function() {            return !module.is.checked();          }        },        should: {          allowCheck: function() {            if(module.is.determinate() && module.is.checked() && !module.should.forceCallbacks() ) {              module.debug('Should not allow check, checkbox is already checked');              return false;            }            if(settings.beforeChecked.apply(input) === false) {              module.debug('Should not allow check, beforeChecked cancelled');              return false;            }            return true;          },          allowUncheck: function() {            if(module.is.determinate() && module.is.unchecked() && !module.should.forceCallbacks() ) {              module.debug('Should not allow uncheck, checkbox is already unchecked');              return false;            }            if(settings.beforeUnchecked.apply(input) === false) {              module.debug('Should not allow uncheck, beforeUnchecked cancelled');              return false;            }            return true;          },          allowIndeterminate: function() {            if(module.is.indeterminate() && !module.should.forceCallbacks() ) {              module.debug('Should not allow indeterminate, checkbox is already indeterminate');              return false;            }            if(settings.beforeIndeterminate.apply(input) === false) {              module.debug('Should not allow indeterminate, beforeIndeterminate cancelled');              return false;            }            return true;          },          allowDeterminate: function() {            if(module.is.determinate() && !module.should.forceCallbacks() ) {              module.debug('Should not allow determinate, checkbox is already determinate');              return false;            }            if(settings.beforeDeterminate.apply(input) === false) {              module.debug('Should not allow determinate, beforeDeterminate cancelled');              return false;            }            return true;          },          forceCallbacks: function() {            return (module.is.initialLoad() && settings.fireOnInit);          },          ignoreCallbacks: function() {            return (initialLoad && !settings.fireOnInit);          }        },        can: {          change: function() {            return !( $module.hasClass(className.disabled) || $module.hasClass(className.readOnly) || $input.prop('disabled') || $input.prop('readonly') );          },          uncheck: function() {            return (typeof settings.uncheckable === 'boolean')              ? settings.uncheckable              : !module.is.radio()            ;          }        },        set: {          initialLoad: function() {            initialLoad = true;          },          checked: function() {            module.verbose('Setting class to checked');            $module              .removeClass(className.indeterminate)              .addClass(className.checked)            ;            if( module.is.radio() ) {              module.uncheckOthers();            }            if(!module.is.indeterminate() && module.is.checked()) {              module.debug('Input is already checked, skipping input property change');              return;            }            module.verbose('Setting state to checked', input);            $input              .prop('indeterminate', false)              .prop('checked', true)            ;            module.trigger.change();          },          unchecked: function() {            module.verbose('Removing checked class');            $module              .removeClass(className.indeterminate)              .removeClass(className.checked)            ;            if(!module.is.indeterminate() &&  module.is.unchecked() ) {              module.debug('Input is already unchecked');              return;            }            module.debug('Setting state to unchecked');            $input              .prop('indeterminate', false)              .prop('checked', false)            ;            module.trigger.change();          },          indeterminate: function() {            module.verbose('Setting class to indeterminate');            $module              .addClass(className.indeterminate)            ;            if( module.is.indeterminate() ) {              module.debug('Input is already indeterminate, skipping input property change');              return;            }            module.debug('Setting state to indeterminate');            $input              .prop('indeterminate', true)            ;            module.trigger.change();          },          determinate: function() {            module.verbose('Removing indeterminate class');            $module              .removeClass(className.indeterminate)            ;            if( module.is.determinate() ) {              module.debug('Input is already determinate, skipping input property change');              return;            }            module.debug('Setting state to determinate');            $input              .prop('indeterminate', false)            ;          },          disabled: function() {            module.verbose('Setting class to disabled');            $module              .addClass(className.disabled)            ;            if( module.is.disabled() ) {              module.debug('Input is already disabled, skipping input property change');              return;            }            module.debug('Setting state to disabled');            $input              .prop('disabled', 'disabled')            ;            module.trigger.change();          },          enabled: function() {            module.verbose('Removing disabled class');            $module.removeClass(className.disabled);            if( module.is.enabled() ) {              module.debug('Input is already enabled, skipping input property change');              return;            }            module.debug('Setting state to enabled');            $input              .prop('disabled', false)            ;            module.trigger.change();          },          tabbable: function() {            module.verbose('Adding tabindex to checkbox');            if( $input.attr('tabindex') === undefined) {              $input.attr('tabindex', 0);            }          }        },        remove: {          initialLoad: function() {            initialLoad = false;          }        },        trigger: {          change: function() {            var              events       = document.createEvent('HTMLEvents'),              inputElement = $input[0]            ;            if(inputElement) {              module.verbose('Triggering native change event');              events.initEvent('change', true, false);              inputElement.dispatchEvent(events);            }          }        },        create: {          label: function() {            if($input.prevAll(selector.label).length > 0) {              $input.prev(selector.label).detach().insertAfter($input);              module.debug('Moving existing label', $label);            }            else if( !module.has.label() ) {              $label = $('<label>').insertAfter($input);              module.debug('Creating label', $label);            }          }        },        has: {          label: function() {            return ($label.length > 0);          }        },        bind: {          events: function() {            module.verbose('Attaching checkbox events');            $module              .on('click'   + eventNamespace, module.event.click)              .on('keydown' + eventNamespace, selector.input, module.event.keydown)              .on('keyup'   + eventNamespace, selector.input, module.event.keyup)            ;          }        },        unbind: {          events: function() {            module.debug('Removing events');            $module              .off(eventNamespace)            ;          }        },        uncheckOthers: function() {          var            $radios = module.get.otherRadios()          ;          module.debug('Unchecking other radios', $radios);          $radios.removeClass(className.checked);        },        toggle: function() {          if( !module.can.change() ) {            if(!module.is.radio()) {              module.debug('Checkbox is read-only or disabled, ignoring toggle');            }            return;          }          if( module.is.indeterminate() || module.is.unchecked() ) {            module.debug('Currently unchecked');            module.check();          }          else if( module.is.checked() && module.can.uncheck() ) {            module.debug('Currently checked');            module.uncheck();          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.checkbox.settings = {  name                : 'Checkbox',  namespace           : 'checkbox',  silent              : false,  debug               : false,  verbose             : true,  performance         : true,  // delegated event context  uncheckable         : 'auto',  fireOnInit          : false,  onChange            : function(){},  beforeChecked       : function(){},  beforeUnchecked     : function(){},  beforeDeterminate   : function(){},  beforeIndeterminate : function(){},  onChecked           : function(){},  onUnchecked         : function(){},  onDeterminate       : function() {},  onIndeterminate     : function() {},  onEnable            : function(){},  onDisable           : function(){},  // preserve misspelled callbacks (will be removed in 3.0)  onEnabled           : function(){},  onDisabled          : function(){},  className       : {    checked       : 'checked',    indeterminate : 'indeterminate',    disabled      : 'disabled',    hidden        : 'hidden',    radio         : 'radio',    readOnly      : 'read-only'  },  error     : {    method       : 'The method you called is not defined'  },  selector : {    checkbox : '.ui.checkbox',    label    : 'label, .box',    input    : 'input[type="checkbox"], input[type="radio"]',    link     : 'a[href]'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Dimmer * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.dimmer = function(parameters) {  var    $allModules     = $(this),    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.dimmer.settings, parameters)          : $.extend({}, $.fn.dimmer.settings),        selector        = settings.selector,        namespace       = settings.namespace,        className       = settings.className,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        moduleSelector  = $allModules.selector || '',        clickEvent      = ('ontouchstart' in document.documentElement)          ? 'touchstart'          : 'click',        $module = $(this),        $dimmer,        $dimmable,        element   = this,        instance  = $module.data(moduleNamespace),        module      ;      module = {        preinitialize: function() {          if( module.is.dimmer() ) {            $dimmable = $module.parent();            $dimmer   = $module;          }          else {            $dimmable = $module;            if( module.has.dimmer() ) {              if(settings.dimmerName) {                $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);              }              else {                $dimmer = $dimmable.find(selector.dimmer);              }            }            else {              $dimmer = module.create();            }          }        },        initialize: function() {          module.debug('Initializing dimmer', settings);          module.bind.events();          module.set.dimmable();          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        destroy: function() {          module.verbose('Destroying previous module', $dimmer);          module.unbind.events();          module.remove.variation();          $dimmable            .off(eventNamespace)          ;        },        bind: {          events: function() {            if(settings.on == 'hover') {              $dimmable                .on('mouseenter' + eventNamespace, module.show)                .on('mouseleave' + eventNamespace, module.hide)              ;            }            else if(settings.on == 'click') {              $dimmable                .on(clickEvent + eventNamespace, module.toggle)              ;            }            if( module.is.page() ) {              module.debug('Setting as a page dimmer', $dimmable);              module.set.pageDimmer();            }            if( module.is.closable() ) {              module.verbose('Adding dimmer close event', $dimmer);              $dimmable                .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)              ;            }          }        },        unbind: {          events: function() {            $module              .removeData(moduleNamespace)            ;            $dimmable              .off(eventNamespace)            ;          }        },        event: {          click: function(event) {            module.verbose('Determining if event occured on dimmer', event);            if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {              module.hide();              event.stopImmediatePropagation();            }          },        },        addContent: function(element) {          var            $content = $(element)          ;          module.debug('Add content to dimmer', $content);          if($content.parent()[0] !== $dimmer[0]) {            $content.detach().appendTo($dimmer);          }        },        create: function() {          var            $element = $( settings.template.dimmer() )          ;          if(settings.dimmerName) {            module.debug('Creating named dimmer', settings.dimmerName);            $element.addClass(settings.dimmerName);          }          $element            .appendTo($dimmable)          ;          return $element;        },        show: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          module.debug('Showing dimmer', $dimmer, settings);          module.set.variation();          if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {            module.animate.show(callback);            settings.onShow.call(element);            settings.onChange.call(element);          }          else {            module.debug('Dimmer is already shown or disabled');          }        },        hide: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( module.is.dimmed() || module.is.animating() ) {            module.debug('Hiding dimmer', $dimmer);            module.animate.hide(callback);            settings.onHide.call(element);            settings.onChange.call(element);          }          else {            module.debug('Dimmer is not visible');          }        },        toggle: function() {          module.verbose('Toggling dimmer visibility', $dimmer);          if( !module.is.dimmed() ) {            module.show();          }          else {            module.hide();          }        },        animate: {          show: function(callback) {            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {              if(settings.useFlex) {                module.debug('Using flex dimmer');                module.remove.legacy();              }              else {                module.debug('Using legacy non-flex dimmer');                module.set.legacy();              }              if(settings.opacity !== 'auto') {                module.set.opacity();              }              $dimmer                .transition({                  displayType : settings.useFlex                    ? 'flex'                    : 'block',                  animation   : settings.transition + ' in',                  queue       : false,                  duration    : module.get.duration(),                  useFailSafe : true,                  onStart     : function() {                    module.set.dimmed();                  },                  onComplete  : function() {                    module.set.active();                    callback();                  }                })              ;            }            else {              module.verbose('Showing dimmer animation with javascript');              module.set.dimmed();              if(settings.opacity == 'auto') {                settings.opacity = 0.8;              }              $dimmer                .stop()                .css({                  opacity : 0,                  width   : '100%',                  height  : '100%'                })                .fadeTo(module.get.duration(), settings.opacity, function() {                  $dimmer.removeAttr('style');                  module.set.active();                  callback();                })              ;            }          },          hide: function(callback) {            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {              module.verbose('Hiding dimmer with css');              $dimmer                .transition({                  displayType : settings.useFlex                    ? 'flex'                    : 'block',                  animation   : settings.transition + ' out',                  queue       : false,                  duration    : module.get.duration(),                  useFailSafe : true,                  onStart     : function() {                    module.remove.dimmed();                  },                  onComplete  : function() {                    module.remove.variation();                    module.remove.active();                    callback();                  }                })              ;            }            else {              module.verbose('Hiding dimmer with javascript');              module.remove.dimmed();              $dimmer                .stop()                .fadeOut(module.get.duration(), function() {                  module.remove.active();                  $dimmer.removeAttr('style');                  callback();                })              ;            }          }        },        get: {          dimmer: function() {            return $dimmer;          },          duration: function() {            if(typeof settings.duration == 'object') {              if( module.is.active() ) {                return settings.duration.hide;              }              else {                return settings.duration.show;              }            }            return settings.duration;          }        },        has: {          dimmer: function() {            if(settings.dimmerName) {              return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);            }            else {              return ( $module.find(selector.dimmer).length > 0 );            }          }        },        is: {          active: function() {            return $dimmer.hasClass(className.active);          },          animating: function() {            return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );          },          closable: function() {            if(settings.closable == 'auto') {              if(settings.on == 'hover') {                return false;              }              return true;            }            return settings.closable;          },          dimmer: function() {            return $module.hasClass(className.dimmer);          },          dimmable: function() {            return $module.hasClass(className.dimmable);          },          dimmed: function() {            return $dimmable.hasClass(className.dimmed);          },          disabled: function() {            return $dimmable.hasClass(className.disabled);          },          enabled: function() {            return !module.is.disabled();          },          page: function () {            return $dimmable.is('body');          },          pageDimmer: function() {            return $dimmer.hasClass(className.pageDimmer);          }        },        can: {          show: function() {            return !$dimmer.hasClass(className.disabled);          }        },        set: {          opacity: function(opacity) {            var              color      = $dimmer.css('background-color'),              colorArray = color.split(','),              isRGB      = (colorArray && colorArray.length == 3),              isRGBA     = (colorArray && colorArray.length == 4)            ;            opacity    = settings.opacity === 0 ? 0 : settings.opacity || opacity;            if(isRGB || isRGBA) {              colorArray[3] = opacity + ')';              color         = colorArray.join(',');            }            else {              color = 'rgba(0, 0, 0, ' + opacity + ')';            }            module.debug('Setting opacity to', opacity);            $dimmer.css('background-color', color);          },          legacy: function() {            $dimmer.addClass(className.legacy);          },          active: function() {            $dimmer.addClass(className.active);          },          dimmable: function() {            $dimmable.addClass(className.dimmable);          },          dimmed: function() {            $dimmable.addClass(className.dimmed);          },          pageDimmer: function() {            $dimmer.addClass(className.pageDimmer);          },          disabled: function() {            $dimmer.addClass(className.disabled);          },          variation: function(variation) {            variation = variation || settings.variation;            if(variation) {              $dimmer.addClass(variation);            }          }        },        remove: {          active: function() {            $dimmer              .removeClass(className.active)            ;          },          legacy: function() {            $dimmer.removeClass(className.legacy);          },          dimmed: function() {            $dimmable.removeClass(className.dimmed);          },          disabled: function() {            $dimmer.removeClass(className.disabled);          },          variation: function(variation) {            variation = variation || settings.variation;            if(variation) {              $dimmer.removeClass(variation);            }          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      module.preinitialize();      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.dimmer.settings = {  name        : 'Dimmer',  namespace   : 'dimmer',  silent      : false,  debug       : false,  verbose     : false,  performance : true,  // whether should use flex layout  useFlex     : true,  // name to distinguish between multiple dimmers in context  dimmerName  : false,  // whether to add a variation type  variation   : false,  // whether to bind close events  closable    : 'auto',  // whether to use css animations  useCSS      : true,  // css animation to use  transition  : 'fade',  // event to bind to  on          : false,  // overriding opacity value  opacity     : 'auto',  // transition durations  duration    : {    show : 500,    hide : 500  },  onChange    : function(){},  onShow      : function(){},  onHide      : function(){},  error   : {    method   : 'The method you called is not defined.'  },  className : {    active     : 'active',    animating  : 'animating',    dimmable   : 'dimmable',    dimmed     : 'dimmed',    dimmer     : 'dimmer',    disabled   : 'disabled',    hide       : 'hide',    legacy     : 'legacy',    pageDimmer : 'page',    show       : 'show'  },  selector: {    dimmer   : '> .ui.dimmer',    content  : '.ui.dimmer > .content, .ui.dimmer > .content > .center'  },  template: {    dimmer: function() {     return $('<div />').attr('class', 'ui dimmer');    }  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Dropdown * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.dropdown = function(parameters) {  var    $allModules    = $(this),    $document      = $(document),    moduleSelector = $allModules.selector || '',    hasTouch       = ('ontouchstart' in document.documentElement),    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function(elementIndex) {      var        settings          = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.dropdown.settings, parameters)          : $.extend({}, $.fn.dropdown.settings),        className       = settings.className,        message         = settings.message,        fields          = settings.fields,        keys            = settings.keys,        metadata        = settings.metadata,        namespace       = settings.namespace,        regExp          = settings.regExp,        selector        = settings.selector,        error           = settings.error,        templates       = settings.templates,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $module         = $(this),        $context        = $(settings.context),        $text           = $module.find(selector.text),        $search         = $module.find(selector.search),        $sizer          = $module.find(selector.sizer),        $input          = $module.find(selector.input),        $icon           = $module.find(selector.icon),        $combo = ($module.prev().find(selector.text).length > 0)          ? $module.prev().find(selector.text)          : $module.prev(),        $menu           = $module.children(selector.menu),        $item           = $menu.find(selector.item),        activated       = false,        itemActivated   = false,        internalChange  = false,        element         = this,        instance        = $module.data(moduleNamespace),        initialLoad,        pageLostFocus,        willRefocus,        elementNamespace,        id,        selectObserver,        menuObserver,        module      ;      module = {        initialize: function() {          module.debug('Initializing dropdown', settings);          if( module.is.alreadySetup() ) {            module.setup.reference();          }          else {            module.setup.layout();            if(settings.values) {              module.change.values(settings.values);            }            module.refreshData();            module.save.defaults();            module.restore.selected();            module.create.id();            module.bind.events();            module.observeChanges();            module.instantiate();          }        },        instantiate: function() {          module.verbose('Storing instance of dropdown', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous dropdown', $module);          module.remove.tabbable();          $module            .off(eventNamespace)            .removeData(moduleNamespace)          ;          $menu            .off(eventNamespace)          ;          $document            .off(elementNamespace)          ;          module.disconnect.menuObserver();          module.disconnect.selectObserver();        },        observeChanges: function() {          if('MutationObserver' in window) {            selectObserver = new MutationObserver(module.event.select.mutation);            menuObserver   = new MutationObserver(module.event.menu.mutation);            module.debug('Setting up mutation observer', selectObserver, menuObserver);            module.observe.select();            module.observe.menu();          }        },        disconnect: {          menuObserver: function() {            if(menuObserver) {              menuObserver.disconnect();            }          },          selectObserver: function() {            if(selectObserver) {              selectObserver.disconnect();            }          }        },        observe: {          select: function() {            if(module.has.input()) {              selectObserver.observe($module[0], {                childList : true,                subtree   : true              });            }          },          menu: function() {            if(module.has.menu()) {              menuObserver.observe($menu[0], {                childList : true,                subtree   : true              });            }          }        },        create: {          id: function() {            id = (Math.random().toString(16) + '000000000').substr(2, 8);            elementNamespace = '.' + id;            module.verbose('Creating unique id for element', id);          },          userChoice: function(values) {            var              $userChoices,              $userChoice,              isUserValue,              html            ;            values = values || module.get.userValues();            if(!values) {              return false;            }            values = $.isArray(values)              ? values              : [values]            ;            $.each(values, function(index, value) {              if(module.get.item(value) === false) {                html         = settings.templates.addition( module.add.variables(message.addResult, value) );                $userChoice  = $('<div />')                  .html(html)                  .attr('data-' + metadata.value, value)                  .attr('data-' + metadata.text, value)                  .addClass(className.addition)                  .addClass(className.item)                ;                if(settings.hideAdditions) {                  $userChoice.addClass(className.hidden);                }                $userChoices = ($userChoices === undefined)                  ? $userChoice                  : $userChoices.add($userChoice)                ;                module.verbose('Creating user choices for value', value, $userChoice);              }            });            return $userChoices;          },          userLabels: function(value) {            var              userValues = module.get.userValues()            ;            if(userValues) {              module.debug('Adding user labels', userValues);              $.each(userValues, function(index, value) {                module.verbose('Adding custom user value');                module.add.label(value, value);              });            }          },          menu: function() {            $menu = $('<div />')              .addClass(className.menu)              .appendTo($module)            ;          },          sizer: function() {            $sizer = $('<span />')              .addClass(className.sizer)              .insertAfter($search)            ;          }        },        search: function(query) {          query = (query !== undefined)            ? query            : module.get.query()          ;          module.verbose('Searching for query', query);          if(module.has.minCharacters(query)) {            module.filter(query);          }          else {            module.hide();          }        },        select: {          firstUnfiltered: function() {            module.verbose('Selecting first non-filtered element');            module.remove.selectedItem();            $item              .not(selector.unselectable)              .not(selector.addition + selector.hidden)                .eq(0)                .addClass(className.selected)            ;          },          nextAvailable: function($selected) {            $selected = $selected.eq(0);            var              $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),              $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),              hasNext        = ($nextAvailable.length > 0)            ;            if(hasNext) {              module.verbose('Moving selection to', $nextAvailable);              $nextAvailable.addClass(className.selected);            }            else {              module.verbose('Moving selection to', $prevAvailable);              $prevAvailable.addClass(className.selected);            }          }        },        setup: {          api: function() {            var              apiSettings = {                debug   : settings.debug,                urlData : {                  value : module.get.value(),                  query : module.get.query()                },                on    : false              }            ;            module.verbose('First request, initializing API');            $module              .api(apiSettings)            ;          },          layout: function() {            if( $module.is('select') ) {              module.setup.select();              module.setup.returnedObject();            }            if( !module.has.menu() ) {              module.create.menu();            }            if( module.is.search() && !module.has.search() ) {              module.verbose('Adding search input');              $search = $('<input />')                .addClass(className.search)                .prop('autocomplete', 'off')                .insertBefore($text)              ;            }            if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {              module.create.sizer();            }            if(settings.allowTab) {              module.set.tabbable();            }          },          select: function() {            var              selectValues  = module.get.selectValues()            ;            module.debug('Dropdown initialized on a select', selectValues);            if( $module.is('select') ) {              $input = $module;            }            // see if select is placed correctly already            if($input.parent(selector.dropdown).length > 0) {              module.debug('UI dropdown already exists. Creating dropdown menu only');              $module = $input.closest(selector.dropdown);              if( !module.has.menu() ) {                module.create.menu();              }              $menu = $module.children(selector.menu);              module.setup.menu(selectValues);            }            else {              module.debug('Creating entire dropdown from select');              $module = $('<div />')                .attr('class', $input.attr('class') )                .addClass(className.selection)                .addClass(className.dropdown)                .html( templates.dropdown(selectValues) )                .insertBefore($input)              ;              if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {                module.error(error.missingMultiple);                $input.prop('multiple', true);              }              if($input.is('[multiple]')) {                module.set.multiple();              }              if ($input.prop('disabled')) {                module.debug('Disabling dropdown');                $module.addClass(className.disabled);              }              $input                .removeAttr('class')                .detach()                .prependTo($module)              ;            }            module.refresh();          },          menu: function(values) {            $menu.html( templates.menu(values, fields));            $item = $menu.find(selector.item);          },          reference: function() {            module.debug('Dropdown behavior was called on select, replacing with closest dropdown');            // replace module reference            $module  = $module.parent(selector.dropdown);            instance = $module.data(moduleNamespace);            element  = $module.get(0);            module.refresh();            module.setup.returnedObject();          },          returnedObject: function() {            var              $firstModules = $allModules.slice(0, elementIndex),              $lastModules  = $allModules.slice(elementIndex + 1)            ;            // adjust all modules to use correct reference            $allModules = $firstModules.add($module).add($lastModules);          }        },        refresh: function() {          module.refreshSelectors();          module.refreshData();        },        refreshItems: function() {          $item = $menu.find(selector.item);        },        refreshSelectors: function() {          module.verbose('Refreshing selector cache');          $text   = $module.find(selector.text);          $search = $module.find(selector.search);          $input  = $module.find(selector.input);          $icon   = $module.find(selector.icon);          $combo  = ($module.prev().find(selector.text).length > 0)            ? $module.prev().find(selector.text)            : $module.prev()          ;          $menu    = $module.children(selector.menu);          $item    = $menu.find(selector.item);        },        refreshData: function() {          module.verbose('Refreshing cached metadata');          $item            .removeData(metadata.text)            .removeData(metadata.value)          ;        },        clearData: function() {          module.verbose('Clearing metadata');          $item            .removeData(metadata.text)            .removeData(metadata.value)          ;          $module            .removeData(metadata.defaultText)            .removeData(metadata.defaultValue)            .removeData(metadata.placeholderText)          ;        },        toggle: function() {          module.verbose('Toggling menu visibility');          if( !module.is.active() ) {            module.show();          }          else {            module.hide();          }        },        show: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if(!module.can.show() && module.is.remote()) {            module.debug('No API results retrieved, searching before show');            module.queryRemote(module.get.query(), module.show);          }          if( module.can.show() && !module.is.active() ) {            module.debug('Showing dropdown');            if(module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered()) ) {              module.remove.message();            }            if(module.is.allFiltered()) {              return true;            }            if(settings.onShow.call(element) !== false) {              module.animate.show(function() {                if( module.can.click() ) {                  module.bind.intent();                }                if(module.has.menuSearch()) {                  module.focusSearch();                }                module.set.visible();                callback.call(element);              });            }          }        },        hide: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( module.is.active() && !module.is.animatingOutward() ) {            module.debug('Hiding dropdown');            if(settings.onHide.call(element) !== false) {              module.animate.hide(function() {                module.remove.visible();                callback.call(element);              });            }          }        },        hideOthers: function() {          module.verbose('Finding other dropdowns to hide');          $allModules            .not($module)              .has(selector.menu + '.' + className.visible)                .dropdown('hide')          ;        },        hideMenu: function() {          module.verbose('Hiding menu  instantaneously');          module.remove.active();          module.remove.visible();          $menu.transition('hide');        },        hideSubMenus: function() {          var            $subMenus = $menu.children(selector.item).find(selector.menu)          ;          module.verbose('Hiding sub menus', $subMenus);          $subMenus.transition('hide');        },        bind: {          events: function() {            if(hasTouch) {              module.bind.touchEvents();            }            module.bind.keyboardEvents();            module.bind.inputEvents();            module.bind.mouseEvents();          },          touchEvents: function() {            module.debug('Touch device detected binding additional touch events');            if( module.is.searchSelection() ) {              // do nothing special yet            }            else if( module.is.single() ) {              $module                .on('touchstart' + eventNamespace, module.event.test.toggle)              ;            }            $menu              .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)            ;          },          keyboardEvents: function() {            module.verbose('Binding keyboard events');            $module              .on('keydown' + eventNamespace, module.event.keydown)            ;            if( module.has.search() ) {              $module                .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)              ;            }            if( module.is.multiple() ) {              $document                .on('keydown' + elementNamespace, module.event.document.keydown)              ;            }          },          inputEvents: function() {            module.verbose('Binding input change events');            $module              .on('change' + eventNamespace, selector.input, module.event.change)            ;          },          mouseEvents: function() {            module.verbose('Binding mouse events');            if(module.is.multiple()) {              $module                .on('click'   + eventNamespace, selector.label,  module.event.label.click)                .on('click'   + eventNamespace, selector.remove, module.event.remove.click)              ;            }            if( module.is.searchSelection() ) {              $module                .on('mousedown' + eventNamespace, module.event.mousedown)                .on('mouseup'   + eventNamespace, module.event.mouseup)                .on('mousedown' + eventNamespace, selector.menu,   module.event.menu.mousedown)                .on('mouseup'   + eventNamespace, selector.menu,   module.event.menu.mouseup)                .on('click'     + eventNamespace, selector.icon,   module.event.icon.click)                .on('focus'     + eventNamespace, selector.search, module.event.search.focus)                .on('click'     + eventNamespace, selector.search, module.event.search.focus)                .on('blur'      + eventNamespace, selector.search, module.event.search.blur)                .on('click'     + eventNamespace, selector.text,   module.event.text.focus)              ;              if(module.is.multiple()) {                $module                  .on('click' + eventNamespace, module.event.click)                ;              }            }            else {              if(settings.on == 'click') {                $module                  .on('click' + eventNamespace, module.event.test.toggle)                ;              }              else if(settings.on == 'hover') {                $module                  .on('mouseenter' + eventNamespace, module.delay.show)                  .on('mouseleave' + eventNamespace, module.delay.hide)                ;              }              else {                $module                  .on(settings.on + eventNamespace, module.toggle)                ;              }              $module                .on('click' + eventNamespace, selector.icon, module.event.icon.click)                .on('mousedown' + eventNamespace, module.event.mousedown)                .on('mouseup'   + eventNamespace, module.event.mouseup)                .on('focus'     + eventNamespace, module.event.focus)              ;              if(module.has.menuSearch() ) {                $module                  .on('blur' + eventNamespace, selector.search, module.event.search.blur)                ;              }              else {                $module                  .on('blur' + eventNamespace, module.event.blur)                ;              }            }            $menu              .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)              .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)              .on('click'      + eventNamespace, selector.item, module.event.item.click)            ;          },          intent: function() {            module.verbose('Binding hide intent event to document');            if(hasTouch) {              $document                .on('touchstart' + elementNamespace, module.event.test.touch)                .on('touchmove'  + elementNamespace, module.event.test.touch)              ;            }            $document              .on('click' + elementNamespace, module.event.test.hide)            ;          }        },        unbind: {          intent: function() {            module.verbose('Removing hide intent event from document');            if(hasTouch) {              $document                .off('touchstart' + elementNamespace)                .off('touchmove' + elementNamespace)              ;            }            $document              .off('click' + elementNamespace)            ;          }        },        filter: function(query) {          var            searchTerm = (query !== undefined)              ? query              : module.get.query(),            afterFiltered = function() {              if(module.is.multiple()) {                module.filterActive();              }              if(query || (!query && module.get.activeItem().length == 0)) {                module.select.firstUnfiltered();              }              if( module.has.allResultsFiltered() ) {                if( settings.onNoResults.call(element, searchTerm) ) {                  if(settings.allowAdditions) {                    if(settings.hideAdditions) {                      module.verbose('User addition with no menu, setting empty style');                      module.set.empty();                      module.hideMenu();                    }                  }                  else {                    module.verbose('All items filtered, showing message', searchTerm);                    module.add.message(message.noResults);                  }                }                else {                  module.verbose('All items filtered, hiding dropdown', searchTerm);                  module.hideMenu();                }              }              else {                module.remove.empty();                module.remove.message();              }              if(settings.allowAdditions) {                module.add.userSuggestion(query);              }              if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {                module.show();              }            }          ;          if(settings.useLabels && module.has.maxSelections()) {            return;          }          if(settings.apiSettings) {            if( module.can.useAPI() ) {              module.queryRemote(searchTerm, function() {                if(settings.filterRemoteData) {                  module.filterItems(searchTerm);                }                afterFiltered();              });            }            else {              module.error(error.noAPI);            }          }          else {            module.filterItems(searchTerm);            afterFiltered();          }        },        queryRemote: function(query, callback) {          var            apiSettings = {              errorDuration : false,              cache         : 'local',              throttle      : settings.throttle,              urlData       : {                query: query              },              onError: function() {                module.add.message(message.serverError);                callback();              },              onFailure: function() {                module.add.message(message.serverError);                callback();              },              onSuccess : function(response) {                var                  values          = response[fields.remoteValues],                  hasRemoteValues = ($.isArray(values) && values.length > 0)                ;                if(hasRemoteValues) {                  module.remove.message();                  module.setup.menu({                    values: response[fields.remoteValues]                  });                }                else {                  module.add.message(message.noResults);                }                callback();              }            }          ;          if( !$module.api('get request') ) {            module.setup.api();          }          apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);          $module            .api('setting', apiSettings)            .api('query')          ;        },        filterItems: function(query) {          var            searchTerm = (query !== undefined)              ? query              : module.get.query(),            results          =  null,            escapedTerm      = module.escape.string(searchTerm),            beginsWithRegExp = new RegExp('^' + escapedTerm, 'igm')          ;          // avoid loop if we're matching nothing          if( module.has.query() ) {            results = [];            module.verbose('Searching for matching values', searchTerm);            $item              .each(function(){                var                  $choice = $(this),                  text,                  value                ;                if(settings.match == 'both' || settings.match == 'text') {                  text = String(module.get.choiceText($choice, false));                  if(text.search(beginsWithRegExp) !== -1) {                    results.push(this);                    return true;                  }                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {                    results.push(this);                    return true;                  }                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {                    results.push(this);                    return true;                  }                }                if(settings.match == 'both' || settings.match == 'value') {                  value = String(module.get.choiceValue($choice, text));                  if(value.search(beginsWithRegExp) !== -1) {                    results.push(this);                    return true;                  }                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {                    results.push(this);                    return true;                  }                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {                    results.push(this);                    return true;                  }                }              })            ;          }          module.debug('Showing only matched items', searchTerm);          module.remove.filteredItem();          if(results) {            $item              .not(results)              .addClass(className.filtered)            ;          }        },        fuzzySearch: function(query, term) {          var            termLength  = term.length,            queryLength = query.length          ;          query = query.toLowerCase();          term  = term.toLowerCase();          if(queryLength > termLength) {            return false;          }          if(queryLength === termLength) {            return (query === term);          }          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {            var              queryCharacter = query.charCodeAt(characterIndex)            ;            while(nextCharacterIndex < termLength) {              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {                continue search;              }            }            return false;          }          return true;        },        exactSearch: function (query, term) {          query = query.toLowerCase();          term  = term.toLowerCase();          if(term.indexOf(query) > -1) {             return true;          }          return false;        },        filterActive: function() {          if(settings.useLabels) {            $item.filter('.' + className.active)              .addClass(className.filtered)            ;          }        },        focusSearch: function(skipHandler) {          if( module.has.search() && !module.is.focusedOnSearch() ) {            if(skipHandler) {              $module.off('focus' + eventNamespace, selector.search);              $search.focus();              $module.on('focus'  + eventNamespace, selector.search, module.event.search.focus);            }            else {              $search.focus();            }          }        },        forceSelection: function() {          var            $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),            $activeItem        = $item.not(className.filtered).filter('.' + className.active).eq(0),            $selectedItem      = ($currentlySelected.length > 0)              ? $currentlySelected              : $activeItem,            hasSelected = ($selectedItem.length > 0)          ;          if(hasSelected && !module.is.multiple()) {            module.debug('Forcing partial selection to selected item', $selectedItem);            module.event.item.click.call($selectedItem, {}, true);            return;          }          else {            if(settings.allowAdditions) {              module.set.selected(module.get.query());              module.remove.searchTerm();            }            else {              module.remove.searchTerm();            }          }        },        change: {          values: function(values) {            if(!settings.allowAdditions) {              module.clear();            }            module.debug('Creating dropdown with specified values', values);            module.setup.menu({values: values});            $.each(values, function(index, item) {              if(item.selected == true) {                module.debug('Setting initial selection to', item.value);                module.set.selected(item.value);                return true;              }            });          }        },        event: {          change: function() {            if(!internalChange) {              module.debug('Input changed, updating selection');              module.set.selected();            }          },          focus: function() {            if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {              module.show();            }          },          blur: function(event) {            pageLostFocus = (document.activeElement === this);            if(!activated && !pageLostFocus) {              module.remove.activeLabel();              module.hide();            }          },          mousedown: function() {            if(module.is.searchSelection()) {              // prevent menu hiding on immediate re-focus              willRefocus = true;            }            else {              // prevents focus callback from occurring on mousedown              activated = true;            }          },          mouseup: function() {            if(module.is.searchSelection()) {              // prevent menu hiding on immediate re-focus              willRefocus = false;            }            else {              activated = false;            }          },          click: function(event) {            var              $target = $(event.target)            ;            // focus search            if($target.is($module)) {              if(!module.is.focusedOnSearch()) {                module.focusSearch();              }              else {                module.show();              }            }          },          search: {            focus: function() {              activated = true;              if(module.is.multiple()) {                module.remove.activeLabel();              }              if(settings.showOnFocus) {                module.search();              }            },            blur: function(event) {              pageLostFocus = (document.activeElement === this);              if(module.is.searchSelection() && !willRefocus) {                if(!itemActivated && !pageLostFocus) {                  if(settings.forceSelection) {                    module.forceSelection();                  }                  module.hide();                }              }              willRefocus = false;            }          },          icon: {            click: function(event) {              if($icon.hasClass(className.clear)) {                module.clear();              }              else if (module.can.click()) {                module.toggle();              }            }          },          text: {            focus: function(event) {              activated = true;              module.focusSearch();            }          },          input: function(event) {            if(module.is.multiple() || module.is.searchSelection()) {              module.set.filtered();            }            clearTimeout(module.timer);            module.timer = setTimeout(module.search, settings.delay.search);          },          label: {            click: function(event) {              var                $label        = $(this),                $labels       = $module.find(selector.label),                $activeLabels = $labels.filter('.' + className.active),                $nextActive   = $label.nextAll('.' + className.active),                $prevActive   = $label.prevAll('.' + className.active),                $range = ($nextActive.length > 0)                  ? $label.nextUntil($nextActive).add($activeLabels).add($label)                  : $label.prevUntil($prevActive).add($activeLabels).add($label)              ;              if(event.shiftKey) {                $activeLabels.removeClass(className.active);                $range.addClass(className.active);              }              else if(event.ctrlKey) {                $label.toggleClass(className.active);              }              else {                $activeLabels.removeClass(className.active);                $label.addClass(className.active);              }              settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));            }          },          remove: {            click: function() {              var                $label = $(this).parent()              ;              if( $label.hasClass(className.active) ) {                // remove all selected labels                module.remove.activeLabels();              }              else {                // remove this label only                module.remove.activeLabels( $label );              }            }          },          test: {            toggle: function(event) {              var                toggleBehavior = (module.is.multiple())                  ? module.show                  : module.toggle              ;              if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {                return;              }              if( module.determine.eventOnElement(event, toggleBehavior) ) {                event.preventDefault();              }            },            touch: function(event) {              module.determine.eventOnElement(event, function() {                if(event.type == 'touchstart') {                  module.timer = setTimeout(function() {                    module.hide();                  }, settings.delay.touch);                }                else if(event.type == 'touchmove') {                  clearTimeout(module.timer);                }              });              event.stopPropagation();            },            hide: function(event) {              module.determine.eventInModule(event, module.hide);            }          },          select: {            mutation: function(mutations) {              module.debug('<select> modified, recreating menu');              var                isSelectMutation = false              ;              $.each(mutations, function(index, mutation) {                if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {                  isSelectMutation = true;                  return true;                }              });              if(isSelectMutation) {                module.disconnect.selectObserver();                module.refresh();                module.setup.select();                module.set.selected();                module.observe.select();              }            }          },          menu: {            mutation: function(mutations) {              var                mutation   = mutations[0],                $addedNode = mutation.addedNodes                  ? $(mutation.addedNodes[0])                  : $(false),                $removedNode = mutation.removedNodes                  ? $(mutation.removedNodes[0])                  : $(false),                $changedNodes  = $addedNode.add($removedNode),                isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,                isMessage      = $changedNodes.is(selector.message)  || $changedNodes.closest(selector.message).length > 0              ;              if(isUserAddition || isMessage) {                module.debug('Updating item selector cache');                module.refreshItems();              }              else {                module.debug('Menu modified, updating selector cache');                module.refresh();              }            },            mousedown: function() {              itemActivated = true;            },            mouseup: function() {              itemActivated = false;            }          },          item: {            mouseenter: function(event) {              var                $target        = $(event.target),                $item          = $(this),                $subMenu       = $item.children(selector.menu),                $otherMenus    = $item.siblings(selector.item).children(selector.menu),                hasSubMenu     = ($subMenu.length > 0),                isBubbledEvent = ($subMenu.find($target).length > 0)              ;              if( !isBubbledEvent && hasSubMenu ) {                clearTimeout(module.itemTimer);                module.itemTimer = setTimeout(function() {                  module.verbose('Showing sub-menu', $subMenu);                  $.each($otherMenus, function() {                    module.animate.hide(false, $(this));                  });                  module.animate.show(false, $subMenu);                }, settings.delay.show);                event.preventDefault();              }            },            mouseleave: function(event) {              var                $subMenu = $(this).children(selector.menu)              ;              if($subMenu.length > 0) {                clearTimeout(module.itemTimer);                module.itemTimer = setTimeout(function() {                  module.verbose('Hiding sub-menu', $subMenu);                  module.animate.hide(false, $subMenu);                }, settings.delay.hide);              }            },            click: function (event, skipRefocus) {              var                $choice        = $(this),                $target        = (event)                  ? $(event.target)                  : $(''),                $subMenu       = $choice.find(selector.menu),                text           = module.get.choiceText($choice),                value          = module.get.choiceValue($choice, text),                hasSubMenu     = ($subMenu.length > 0),                isBubbledEvent = ($subMenu.find($target).length > 0)              ;              // prevents IE11 bug where menu receives focus even though `tabindex=-1`              if(module.has.menuSearch()) {                $(document.activeElement).blur();              }              if(!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {                if(module.is.searchSelection()) {                  if(settings.allowAdditions) {                    module.remove.userAddition();                  }                  module.remove.searchTerm();                  if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {                    module.focusSearch(true);                  }                }                if(!settings.useLabels) {                  module.remove.filteredItem();                  module.set.scrollPosition($choice);                }                module.determine.selectAction.call(this, text, value);              }            }          },          document: {            // label selection should occur even when element has no focus            keydown: function(event) {              var                pressedKey    = event.which,                isShortcutKey = module.is.inObject(pressedKey, keys)              ;              if(isShortcutKey) {                var                  $label            = $module.find(selector.label),                  $activeLabel      = $label.filter('.' + className.active),                  activeValue       = $activeLabel.data(metadata.value),                  labelIndex        = $label.index($activeLabel),                  labelCount        = $label.length,                  hasActiveLabel    = ($activeLabel.length > 0),                  hasMultipleActive = ($activeLabel.length > 1),                  isFirstLabel      = (labelIndex === 0),                  isLastLabel       = (labelIndex + 1 == labelCount),                  isSearch          = module.is.searchSelection(),                  isFocusedOnSearch = module.is.focusedOnSearch(),                  isFocused         = module.is.focused(),                  caretAtStart      = (isFocusedOnSearch && module.get.caretPosition() === 0),                  $nextLabel                ;                if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {                  return;                }                if(pressedKey == keys.leftArrow) {                  // activate previous label                  if((isFocused || caretAtStart) && !hasActiveLabel) {                    module.verbose('Selecting previous label');                    $label.last().addClass(className.active);                  }                  else if(hasActiveLabel) {                    if(!event.shiftKey) {                      module.verbose('Selecting previous label');                      $label.removeClass(className.active);                    }                    else {                      module.verbose('Adding previous label to selection');                    }                    if(isFirstLabel && !hasMultipleActive) {                      $activeLabel.addClass(className.active);                    }                    else {                      $activeLabel.prev(selector.siblingLabel)                        .addClass(className.active)                        .end()                      ;                    }                    event.preventDefault();                  }                }                else if(pressedKey == keys.rightArrow) {                  // activate first label                  if(isFocused && !hasActiveLabel) {                    $label.first().addClass(className.active);                  }                  // activate next label                  if(hasActiveLabel) {                    if(!event.shiftKey) {                      module.verbose('Selecting next label');                      $label.removeClass(className.active);                    }                    else {                      module.verbose('Adding next label to selection');                    }                    if(isLastLabel) {                      if(isSearch) {                        if(!isFocusedOnSearch) {                          module.focusSearch();                        }                        else {                          $label.removeClass(className.active);                        }                      }                      else if(hasMultipleActive) {                        $activeLabel.next(selector.siblingLabel).addClass(className.active);                      }                      else {                        $activeLabel.addClass(className.active);                      }                    }                    else {                      $activeLabel.next(selector.siblingLabel).addClass(className.active);                    }                    event.preventDefault();                  }                }                else if(pressedKey == keys.deleteKey || pressedKey == keys.backspace) {                  if(hasActiveLabel) {                    module.verbose('Removing active labels');                    if(isLastLabel) {                      if(isSearch && !isFocusedOnSearch) {                        module.focusSearch();                      }                    }                    $activeLabel.last().next(selector.siblingLabel).addClass(className.active);                    module.remove.activeLabels($activeLabel);                    event.preventDefault();                  }                  else if(caretAtStart && !hasActiveLabel && pressedKey == keys.backspace) {                    module.verbose('Removing last label on input backspace');                    $activeLabel = $label.last().addClass(className.active);                    module.remove.activeLabels($activeLabel);                  }                }                else {                  $activeLabel.removeClass(className.active);                }              }            }          },          keydown: function(event) {            var              pressedKey    = event.which,              isShortcutKey = module.is.inObject(pressedKey, keys)            ;            if(isShortcutKey) {              var                $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),                $activeItem        = $menu.children('.' + className.active).eq(0),                $selectedItem      = ($currentlySelected.length > 0)                  ? $currentlySelected                  : $activeItem,                $visibleItems = ($selectedItem.length > 0)                  ? $selectedItem.siblings(':not(.' + className.filtered +')').addBack()                  : $menu.children(':not(.' + className.filtered +')'),                $subMenu              = $selectedItem.children(selector.menu),                $parentMenu           = $selectedItem.closest(selector.menu),                inVisibleMenu         = ($parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0),                hasSubMenu            = ($subMenu.length> 0),                hasSelectedItem       = ($selectedItem.length > 0),                selectedIsSelectable  = ($selectedItem.not(selector.unselectable).length > 0),                delimiterPressed      = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),                isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),                $nextItem,                isSubMenuItem,                newIndex              ;              // allow selection with menu closed              if(isAdditionWithoutMenu) {                module.verbose('Selecting item from keyboard shortcut', $selectedItem);                module.event.item.click.call($selectedItem, event);                if(module.is.searchSelection()) {                  module.remove.searchTerm();                }              }              // visible menu keyboard shortcuts              if( module.is.visible() ) {                // enter (select or open sub-menu)                if(pressedKey == keys.enter || delimiterPressed) {                  if(pressedKey == keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {                    module.verbose('Pressed enter on unselectable category, opening sub menu');                    pressedKey = keys.rightArrow;                  }                  else if(selectedIsSelectable) {                    module.verbose('Selecting item from keyboard shortcut', $selectedItem);                    module.event.item.click.call($selectedItem, event);                    if(module.is.searchSelection()) {                      module.remove.searchTerm();                    }                  }                  event.preventDefault();                }                // sub-menu actions                if(hasSelectedItem) {                  if(pressedKey == keys.leftArrow) {                    isSubMenuItem = ($parentMenu[0] !== $menu[0]);                    if(isSubMenuItem) {                      module.verbose('Left key pressed, closing sub-menu');                      module.animate.hide(false, $parentMenu);                      $selectedItem                        .removeClass(className.selected)                      ;                      $parentMenu                        .closest(selector.item)                          .addClass(className.selected)                      ;                      event.preventDefault();                    }                  }                  // right arrow (show sub-menu)                  if(pressedKey == keys.rightArrow) {                    if(hasSubMenu) {                      module.verbose('Right key pressed, opening sub-menu');                      module.animate.show(false, $subMenu);                      $selectedItem                        .removeClass(className.selected)                      ;                      $subMenu                        .find(selector.item).eq(0)                          .addClass(className.selected)                      ;                      event.preventDefault();                    }                  }                }                // up arrow (traverse menu up)                if(pressedKey == keys.upArrow) {                  $nextItem = (hasSelectedItem && inVisibleMenu)                    ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)                    : $item.eq(0)                  ;                  if($visibleItems.index( $nextItem ) < 0) {                    module.verbose('Up key pressed but reached top of current menu');                    event.preventDefault();                    return;                  }                  else {                    module.verbose('Up key pressed, changing active item');                    $selectedItem                      .removeClass(className.selected)                    ;                    $nextItem                      .addClass(className.selected)                    ;                    module.set.scrollPosition($nextItem);                    if(settings.selectOnKeydown && module.is.single()) {                      module.set.selectedItem($nextItem);                    }                  }                  event.preventDefault();                }                // down arrow (traverse menu down)                if(pressedKey == keys.downArrow) {                  $nextItem = (hasSelectedItem && inVisibleMenu)                    ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)                    : $item.eq(0)                  ;                  if($nextItem.length === 0) {                    module.verbose('Down key pressed but reached bottom of current menu');                    event.preventDefault();                    return;                  }                  else {                    module.verbose('Down key pressed, changing active item');                    $item                      .removeClass(className.selected)                    ;                    $nextItem                      .addClass(className.selected)                    ;                    module.set.scrollPosition($nextItem);                    if(settings.selectOnKeydown && module.is.single()) {                      module.set.selectedItem($nextItem);                    }                  }                  event.preventDefault();                }                // page down (show next page)                if(pressedKey == keys.pageUp) {                  module.scrollPage('up');                  event.preventDefault();                }                if(pressedKey == keys.pageDown) {                  module.scrollPage('down');                  event.preventDefault();                }                // escape (close menu)                if(pressedKey == keys.escape) {                  module.verbose('Escape key pressed, closing dropdown');                  module.hide();                }              }              else {                // delimiter key                if(delimiterPressed) {                  event.preventDefault();                }                // down arrow (open menu)                if(pressedKey == keys.downArrow && !module.is.visible()) {                  module.verbose('Down key pressed, showing dropdown');                  module.show();                  event.preventDefault();                }              }            }            else {              if( !module.has.search() ) {                module.set.selectedLetter( String.fromCharCode(pressedKey) );              }            }          }        },        trigger: {          change: function() {            var              events       = document.createEvent('HTMLEvents'),              inputElement = $input[0]            ;            if(inputElement) {              module.verbose('Triggering native change event');              events.initEvent('change', true, false);              inputElement.dispatchEvent(events);            }          }        },        determine: {          selectAction: function(text, value) {            module.verbose('Determining action', settings.action);            if( $.isFunction( module.action[settings.action] ) ) {              module.verbose('Triggering preset action', settings.action, text, value);              module.action[ settings.action ].call(element, text, value, this);            }            else if( $.isFunction(settings.action) ) {              module.verbose('Triggering user action', settings.action, text, value);              settings.action.call(element, text, value, this);            }            else {              module.error(error.action, settings.action);            }          },          eventInModule: function(event, callback) {            var              $target    = $(event.target),              inDocument = ($target.closest(document.documentElement).length > 0),              inModule   = ($target.closest($module).length > 0)            ;            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if(inDocument && !inModule) {              module.verbose('Triggering event', callback);              callback();              return true;            }            else {              module.verbose('Event occurred in dropdown, canceling callback');              return false;            }          },          eventOnElement: function(event, callback) {            var              $target      = $(event.target),              $label       = $target.closest(selector.siblingLabel),              inVisibleDOM = document.body.contains(event.target),              notOnLabel   = ($module.find($label).length === 0),              notInMenu    = ($target.closest($menu).length === 0)            ;            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if(inVisibleDOM && notOnLabel && notInMenu) {              module.verbose('Triggering event', callback);              callback();              return true;            }            else {              module.verbose('Event occurred in dropdown menu, canceling callback');              return false;            }          }        },        action: {          nothing: function() {},          activate: function(text, value, element) {            value = (value !== undefined)              ? value              : text            ;            if( module.can.activate( $(element) ) ) {              module.set.selected(value, $(element));              if(module.is.multiple() && !module.is.allFiltered()) {                return;              }              else {                module.hideAndClear();              }            }          },          select: function(text, value, element) {            value = (value !== undefined)              ? value              : text            ;            if( module.can.activate( $(element) ) ) {              module.set.value(value, text, $(element));              if(module.is.multiple() && !module.is.allFiltered()) {                return;              }              else {                module.hideAndClear();              }            }          },          combo: function(text, value, element) {            value = (value !== undefined)              ? value              : text            ;            module.set.selected(value, $(element));            module.hideAndClear();          },          hide: function(text, value, element) {            module.set.value(value, text, $(element));            module.hideAndClear();          }        },        get: {          id: function() {            return id;          },          defaultText: function() {            return $module.data(metadata.defaultText);          },          defaultValue: function() {            return $module.data(metadata.defaultValue);          },          placeholderText: function() {            if(settings.placeholder != 'auto' && typeof settings.placeholder == 'string') {              return settings.placeholder;            }            return $module.data(metadata.placeholderText) || '';          },          text: function() {            return $text.text();          },          query: function() {            return $.trim($search.val());          },          searchWidth: function(value) {            value = (value !== undefined)              ? value              : $search.val()            ;            $sizer.text(value);            // prevent rounding issues            return Math.ceil( $sizer.width() + 1);          },          selectionCount: function() {            var              values = module.get.values(),              count            ;            count = ( module.is.multiple() )              ? $.isArray(values)                ? values.length                : 0              : (module.get.value() !== '')                ? 1                : 0            ;            return count;          },          transition: function($subMenu) {            return (settings.transition == 'auto')              ? module.is.upward($subMenu)                ? 'slide up'                : 'slide down'              : settings.transition            ;          },          userValues: function() {            var              values = module.get.values()            ;            if(!values) {              return false;            }            values = $.isArray(values)              ? values              : [values]            ;            return $.grep(values, function(value) {              return (module.get.item(value) === false);            });          },          uniqueArray: function(array) {            return $.grep(array, function (value, index) {                return $.inArray(value, array) === index;            });          },          caretPosition: function() {            var              input = $search.get(0),              range,              rangeLength            ;            if('selectionStart' in input) {              return input.selectionStart;            }            else if (document.selection) {              input.focus();              range       = document.selection.createRange();              rangeLength = range.text.length;              range.moveStart('character', -input.value.length);              return range.text.length - rangeLength;            }          },          value: function() {            var              value = ($input.length > 0)                ? $input.val()                : $module.data(metadata.value),              isEmptyMultiselect = ($.isArray(value) && value.length === 1 && value[0] === '')            ;            // prevents placeholder element from being selected when multiple            return (value === undefined || isEmptyMultiselect)              ? ''              : value            ;          },          values: function() {            var              value = module.get.value()            ;            if(value === '') {              return '';            }            return ( !module.has.selectInput() && module.is.multiple() )              ? (typeof value == 'string') // delimited string                ? value.split(settings.delimiter)                : ''              : value            ;          },          remoteValues: function() {            var              values = module.get.values(),              remoteValues = false            ;            if(values) {              if(typeof values == 'string') {                values = [values];              }              $.each(values, function(index, value) {                var                  name = module.read.remoteData(value)                ;                module.verbose('Restoring value from session data', name, value);                if(name) {                  if(!remoteValues) {                    remoteValues = {};                  }                  remoteValues[value] = name;                }              });            }            return remoteValues;          },          choiceText: function($choice, preserveHTML) {            preserveHTML = (preserveHTML !== undefined)              ? preserveHTML              : settings.preserveHTML            ;            if($choice) {              if($choice.find(selector.menu).length > 0) {                module.verbose('Retrieving text of element with sub-menu');                $choice = $choice.clone();                $choice.find(selector.menu).remove();                $choice.find(selector.menuIcon).remove();              }              return ($choice.data(metadata.text) !== undefined)                ? $choice.data(metadata.text)                : (preserveHTML)                  ? $.trim($choice.html())                  : $.trim($choice.text())              ;            }          },          choiceValue: function($choice, choiceText) {            choiceText = choiceText || module.get.choiceText($choice);            if(!$choice) {              return false;            }            return ($choice.data(metadata.value) !== undefined)              ? String( $choice.data(metadata.value) )              : (typeof choiceText === 'string')                ? $.trim(choiceText.toLowerCase())                : String(choiceText)            ;          },          inputEvent: function() {            var              input = $search[0]            ;            if(input) {              return (input.oninput !== undefined)                ? 'input'                : (input.onpropertychange !== undefined)                  ? 'propertychange'                  : 'keyup'              ;            }            return false;          },          selectValues: function() {            var              select = {}            ;            select.values = [];            $module              .find('option')                .each(function() {                  var                    $option  = $(this),                    name     = $option.html(),                    disabled = $option.attr('disabled'),                    value    = ( $option.attr('value') !== undefined )                      ? $option.attr('value')                      : name                  ;                  if(settings.placeholder === 'auto' && value === '') {                    select.placeholder = name;                  }                  else {                    select.values.push({                      name     : name,                      value    : value,                      disabled : disabled                    });                  }                })            ;            if(settings.placeholder && settings.placeholder !== 'auto') {              module.debug('Setting placeholder value to', settings.placeholder);              select.placeholder = settings.placeholder;            }            if(settings.sortSelect) {              select.values.sort(function(a, b) {                return (a.name > b.name)                  ? 1                  : -1                ;              });              module.debug('Retrieved and sorted values from select', select);            }            else {              module.debug('Retrieved values from select', select);            }            return select;          },          activeItem: function() {            return $item.filter('.'  + className.active);          },          selectedItem: function() {            var              $selectedItem = $item.not(selector.unselectable).filter('.'  + className.selected)            ;            return ($selectedItem.length > 0)              ? $selectedItem              : $item.eq(0)            ;          },          itemWithAdditions: function(value) {            var              $items       = module.get.item(value),              $userItems   = module.create.userChoice(value),              hasUserItems = ($userItems && $userItems.length > 0)            ;            if(hasUserItems) {              $items = ($items.length > 0)                ? $items.add($userItems)                : $userItems              ;            }            return $items;          },          item: function(value, strict) {            var              $selectedItem = false,              shouldSearch,              isMultiple            ;            value = (value !== undefined)              ? value              : ( module.get.values() !== undefined)                ? module.get.values()                : module.get.text()            ;            shouldSearch = (isMultiple)              ? (value.length > 0)              : (value !== undefined && value !== null)            ;            isMultiple = (module.is.multiple() && $.isArray(value));            strict     = (value === '' || value === 0)              ? true              : strict || false            ;            if(shouldSearch) {              $item                .each(function() {                  var                    $choice       = $(this),                    optionText    = module.get.choiceText($choice),                    optionValue   = module.get.choiceValue($choice, optionText)                  ;                  // safe early exit                  if(optionValue === null || optionValue === undefined) {                    return;                  }                  if(isMultiple) {                    if($.inArray( String(optionValue), value) !== -1 || $.inArray(optionText, value) !== -1) {                      $selectedItem = ($selectedItem)                        ? $selectedItem.add($choice)                        : $choice                      ;                    }                  }                  else if(strict) {                    module.verbose('Ambiguous dropdown value using strict type check', $choice, value);                    if( optionValue === value || optionText === value) {                      $selectedItem = $choice;                      return true;                    }                  }                  else {                    if( String(optionValue) == String(value) || optionText == value) {                      module.verbose('Found select item by value', optionValue, value);                      $selectedItem = $choice;                      return true;                    }                  }                })              ;            }            return $selectedItem;          }        },        check: {          maxSelections: function(selectionCount) {            if(settings.maxSelections) {              selectionCount = (selectionCount !== undefined)                ? selectionCount                : module.get.selectionCount()              ;              if(selectionCount >= settings.maxSelections) {                module.debug('Maximum selection count reached');                if(settings.useLabels) {                  $item.addClass(className.filtered);                  module.add.message(message.maxSelections);                }                return true;              }              else {                module.verbose('No longer at maximum selection count');                module.remove.message();                module.remove.filteredItem();                if(module.is.searchSelection()) {                  module.filterItems();                }                return false;              }            }            return true;          }        },        restore: {          defaults: function() {            module.clear();            module.restore.defaultText();            module.restore.defaultValue();          },          defaultText: function() {            var              defaultText     = module.get.defaultText(),              placeholderText = module.get.placeholderText            ;            if(defaultText === placeholderText) {              module.debug('Restoring default placeholder text', defaultText);              module.set.placeholderText(defaultText);            }            else {              module.debug('Restoring default text', defaultText);              module.set.text(defaultText);            }          },          placeholderText: function() {            module.set.placeholderText();          },          defaultValue: function() {            var              defaultValue = module.get.defaultValue()            ;            if(defaultValue !== undefined) {              module.debug('Restoring default value', defaultValue);              if(defaultValue !== '') {                module.set.value(defaultValue);                module.set.selected();              }              else {                module.remove.activeItem();                module.remove.selectedItem();              }            }          },          labels: function() {            if(settings.allowAdditions) {              if(!settings.useLabels) {                module.error(error.labels);                settings.useLabels = true;              }              module.debug('Restoring selected values');              module.create.userLabels();            }            module.check.maxSelections();          },          selected: function() {            module.restore.values();            if(module.is.multiple()) {              module.debug('Restoring previously selected values and labels');              module.restore.labels();            }            else {              module.debug('Restoring previously selected values');            }          },          values: function() {            // prevents callbacks from occurring on initial load            module.set.initialLoad();            if(settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {              module.restore.remoteValues();            }            else {              module.set.selected();            }            module.remove.initialLoad();          },          remoteValues: function() {            var              values = module.get.remoteValues()            ;            module.debug('Recreating selected from session data', values);            if(values) {              if( module.is.single() ) {                $.each(values, function(value, name) {                  module.set.text(name);                });              }              else {                $.each(values, function(value, name) {                  module.add.label(value, name);                });              }            }          }        },        read: {          remoteData: function(value) {            var              name            ;            if(window.Storage === undefined) {              module.error(error.noStorage);              return;            }            name = sessionStorage.getItem(value);            return (name !== undefined)              ? name              : false            ;          }        },        save: {          defaults: function() {            module.save.defaultText();            module.save.placeholderText();            module.save.defaultValue();          },          defaultValue: function() {            var              value = module.get.value()            ;            module.verbose('Saving default value as', value);            $module.data(metadata.defaultValue, value);          },          defaultText: function() {            var              text = module.get.text()            ;            module.verbose('Saving default text as', text);            $module.data(metadata.defaultText, text);          },          placeholderText: function() {            var              text            ;            if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {              text = module.get.text();              module.verbose('Saving placeholder text as', text);              $module.data(metadata.placeholderText, text);            }          },          remoteData: function(name, value) {            if(window.Storage === undefined) {              module.error(error.noStorage);              return;            }            module.verbose('Saving remote data to session storage', value, name);            sessionStorage.setItem(value, name);          }        },        clear: function() {          if(module.is.multiple() && settings.useLabels) {            module.remove.labels();          }          else {            module.remove.activeItem();            module.remove.selectedItem();          }          module.set.placeholderText();          module.clearValue();        },        clearValue: function() {          module.set.value('');        },        scrollPage: function(direction, $selectedItem) {          var            $currentItem  = $selectedItem || module.get.selectedItem(),            $menu         = $currentItem.closest(selector.menu),            menuHeight    = $menu.outerHeight(),            currentScroll = $menu.scrollTop(),            itemHeight    = $item.eq(0).outerHeight(),            itemsPerPage  = Math.floor(menuHeight / itemHeight),            maxScroll     = $menu.prop('scrollHeight'),            newScroll     = (direction == 'up')              ? currentScroll - (itemHeight * itemsPerPage)              : currentScroll + (itemHeight * itemsPerPage),            $selectableItem = $item.not(selector.unselectable),            isWithinRange,            $nextSelectedItem,            elementIndex          ;          elementIndex      = (direction == 'up')            ? $selectableItem.index($currentItem) - itemsPerPage            : $selectableItem.index($currentItem) + itemsPerPage          ;          isWithinRange = (direction == 'up')            ? (elementIndex >= 0)            : (elementIndex < $selectableItem.length)          ;          $nextSelectedItem = (isWithinRange)            ? $selectableItem.eq(elementIndex)            : (direction == 'up')              ? $selectableItem.first()              : $selectableItem.last()          ;          if($nextSelectedItem.length > 0) {            module.debug('Scrolling page', direction, $nextSelectedItem);            $currentItem              .removeClass(className.selected)            ;            $nextSelectedItem              .addClass(className.selected)            ;            if(settings.selectOnKeydown && module.is.single()) {              module.set.selectedItem($nextSelectedItem);            }            $menu              .scrollTop(newScroll)            ;          }        },        set: {          filtered: function() {            var              isMultiple       = module.is.multiple(),              isSearch         = module.is.searchSelection(),              isSearchMultiple = (isMultiple && isSearch),              searchValue      = (isSearch)                ? module.get.query()                : '',              hasSearchValue   = (typeof searchValue === 'string' && searchValue.length > 0),              searchWidth      = module.get.searchWidth(),              valueIsSet       = searchValue !== ''            ;            if(isMultiple && hasSearchValue) {              module.verbose('Adjusting input width', searchWidth, settings.glyphWidth);              $search.css('width', searchWidth);            }            if(hasSearchValue || (isSearchMultiple && valueIsSet)) {              module.verbose('Hiding placeholder text');              $text.addClass(className.filtered);            }            else if(!isMultiple || (isSearchMultiple && !valueIsSet)) {              module.verbose('Showing placeholder text');              $text.removeClass(className.filtered);            }          },          empty: function() {            $module.addClass(className.empty);          },          loading: function() {            $module.addClass(className.loading);          },          placeholderText: function(text) {            text = text || module.get.placeholderText();            module.debug('Setting placeholder text', text);            module.set.text(text);            $text.addClass(className.placeholder);          },          tabbable: function() {            if( module.is.searchSelection() ) {              module.debug('Added tabindex to searchable dropdown');              $search                .val('')                .attr('tabindex', 0)              ;              $menu                .attr('tabindex', -1)              ;            }            else {              module.debug('Added tabindex to dropdown');              if( $module.attr('tabindex') === undefined) {                $module                  .attr('tabindex', 0)                ;                $menu                  .attr('tabindex', -1)                ;              }            }          },          initialLoad: function() {            module.verbose('Setting initial load');            initialLoad = true;          },          activeItem: function($item) {            if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {              $item.addClass(className.filtered);            }            else {              $item.addClass(className.active);            }          },          partialSearch: function(text) {            var              length = module.get.query().length            ;            $search.val( text.substr(0, length));          },          scrollPosition: function($item, forceScroll) {            var              edgeTolerance = 5,              $menu,              hasActive,              offset,              itemHeight,              itemOffset,              menuOffset,              menuScroll,              menuHeight,              abovePage,              belowPage            ;            $item       = $item || module.get.selectedItem();            $menu       = $item.closest(selector.menu);            hasActive   = ($item && $item.length > 0);            forceScroll = (forceScroll !== undefined)              ? forceScroll              : false            ;            if($item && $menu.length > 0 && hasActive) {              itemOffset = $item.position().top;              $menu.addClass(className.loading);              menuScroll = $menu.scrollTop();              menuOffset = $menu.offset().top;              itemOffset = $item.offset().top;              offset     = menuScroll - menuOffset + itemOffset;              if(!forceScroll) {                menuHeight = $menu.height();                belowPage  = menuScroll + menuHeight < (offset + edgeTolerance);                abovePage  = ((offset - edgeTolerance) < menuScroll);              }              module.debug('Scrolling to active item', offset);              if(forceScroll || abovePage || belowPage) {                $menu.scrollTop(offset);              }              $menu.removeClass(className.loading);            }          },          text: function(text) {            if(settings.action !== 'select') {              if(settings.action == 'combo') {                module.debug('Changing combo button text', text, $combo);                if(settings.preserveHTML) {                  $combo.html(text);                }                else {                  $combo.text(text);                }              }              else {                if(text !== module.get.placeholderText()) {                  $text.removeClass(className.placeholder);                }                module.debug('Changing text', text, $text);                $text                  .removeClass(className.filtered)                ;                if(settings.preserveHTML) {                  $text.html(text);                }                else {                  $text.text(text);                }              }            }          },          selectedItem: function($item) {            var              value      = module.get.choiceValue($item),              searchText = module.get.choiceText($item, false),              text       = module.get.choiceText($item, true)            ;            module.debug('Setting user selection to item', $item);            module.remove.activeItem();            module.set.partialSearch(searchText);            module.set.activeItem($item);            module.set.selected(value, $item);            module.set.text(text);          },          selectedLetter: function(letter) {            var              $selectedItem         = $item.filter('.' + className.selected),              alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),              $nextValue            = false,              $nextItem            ;            // check next of same letter            if(alreadySelectedLetter) {              $nextItem = $selectedItem.nextAll($item).eq(0);              if( module.has.firstLetter($nextItem, letter) ) {                $nextValue  = $nextItem;              }            }            // check all values            if(!$nextValue) {              $item                .each(function(){                  if(module.has.firstLetter($(this), letter)) {                    $nextValue = $(this);                    return false;                  }                })              ;            }            // set next value            if($nextValue) {              module.verbose('Scrolling to next value with letter', letter);              module.set.scrollPosition($nextValue);              $selectedItem.removeClass(className.selected);              $nextValue.addClass(className.selected);              if(settings.selectOnKeydown && module.is.single()) {                module.set.selectedItem($nextValue);              }            }          },          direction: function($menu) {            if(settings.direction == 'auto') {              // reset position              module.remove.upward();              if(module.can.openDownward($menu)) {                module.remove.upward($menu);              }              else {                module.set.upward($menu);              }              if(!module.is.leftward($menu) && !module.can.openRightward($menu)) {                module.set.leftward($menu);              }            }            else if(settings.direction == 'upward') {              module.set.upward($menu);            }          },          upward: function($currentMenu) {            var $element = $currentMenu || $module;            $element.addClass(className.upward);          },          leftward: function($currentMenu) {            var $element = $currentMenu || $menu;            $element.addClass(className.leftward);          },          value: function(value, text, $selected) {            var              escapedValue = module.escape.value(value),              hasInput     = ($input.length > 0),              currentValue = module.get.values(),              stringValue  = (value !== undefined)                ? String(value)                : value,              newValue            ;            if(hasInput) {              if(!settings.allowReselection && stringValue == currentValue) {                module.verbose('Skipping value update already same value', value, currentValue);                if(!module.is.initialLoad()) {                  return;                }              }              if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {                module.debug('Adding user option', value);                module.add.optionValue(value);              }              module.debug('Updating input value', escapedValue, currentValue);              internalChange = true;              $input                .val(escapedValue)              ;              if(settings.fireOnInit === false && module.is.initialLoad()) {                module.debug('Input native change event ignored on initial load');              }              else {                module.trigger.change();              }              internalChange = false;            }            else {              module.verbose('Storing value in metadata', escapedValue, $input);              if(escapedValue !== currentValue) {                $module.data(metadata.value, stringValue);              }            }            if(module.is.single() && settings.clearable) {              // treat undefined or '' as empty              if(!escapedValue) {                module.remove.clearable();              }              else {                module.set.clearable();              }            }            if(settings.fireOnInit === false && module.is.initialLoad()) {              module.verbose('No callback on initial load', settings.onChange);            }            else {              settings.onChange.call(element, value, text, $selected);            }          },          active: function() {            $module              .addClass(className.active)            ;          },          multiple: function() {            $module.addClass(className.multiple);          },          visible: function() {            $module.addClass(className.visible);          },          exactly: function(value, $selectedItem) {            module.debug('Setting selected to exact values');            module.clear();            module.set.selected(value, $selectedItem);          },          selected: function(value, $selectedItem) {            var              isMultiple = module.is.multiple(),              $userSelectedItem            ;            $selectedItem = (settings.allowAdditions)              ? $selectedItem || module.get.itemWithAdditions(value)              : $selectedItem || module.get.item(value)            ;            if(!$selectedItem) {              return;            }            module.debug('Setting selected menu item to', $selectedItem);            if(module.is.multiple()) {              module.remove.searchWidth();            }            if(module.is.single()) {              module.remove.activeItem();              module.remove.selectedItem();            }            else if(settings.useLabels) {              module.remove.selectedItem();            }            // select each item            $selectedItem              .each(function() {                var                  $selected      = $(this),                  selectedText   = module.get.choiceText($selected),                  selectedValue  = module.get.choiceValue($selected, selectedText),                  isFiltered     = $selected.hasClass(className.filtered),                  isActive       = $selected.hasClass(className.active),                  isUserValue    = $selected.hasClass(className.addition),                  shouldAnimate  = (isMultiple && $selectedItem.length == 1)                ;                if(isMultiple) {                  if(!isActive || isUserValue) {                    if(settings.apiSettings && settings.saveRemoteData) {                      module.save.remoteData(selectedText, selectedValue);                    }                    if(settings.useLabels) {                      module.add.label(selectedValue, selectedText, shouldAnimate);                      module.add.value(selectedValue, selectedText, $selected);                      module.set.activeItem($selected);                      module.filterActive();                      module.select.nextAvailable($selectedItem);                    }                    else {                      module.add.value(selectedValue, selectedText, $selected);                      module.set.text(module.add.variables(message.count));                      module.set.activeItem($selected);                    }                  }                  else if(!isFiltered) {                    module.debug('Selected active value, removing label');                    module.remove.selected(selectedValue);                  }                }                else {                  if(settings.apiSettings && settings.saveRemoteData) {                    module.save.remoteData(selectedText, selectedValue);                  }                  module.set.text(selectedText);                  module.set.value(selectedValue, selectedText, $selected);                  $selected                    .addClass(className.active)                    .addClass(className.selected)                  ;                }              })            ;          },          clearable: function() {            $icon.addClass(className.clear);          },        },        add: {          label: function(value, text, shouldAnimate) {            var              $next  = module.is.searchSelection()                ? $search                : $text,              escapedValue = module.escape.value(value),              $label            ;            if(settings.ignoreCase) {              escapedValue = escapedValue.toLowerCase();            }            $label =  $('<a />')              .addClass(className.label)              .attr('data-' + metadata.value, escapedValue)              .html(templates.label(escapedValue, text))            ;            $label = settings.onLabelCreate.call($label, escapedValue, text);            if(module.has.label(value)) {              module.debug('User selection already exists, skipping', escapedValue);              return;            }            if(settings.label.variation) {              $label.addClass(settings.label.variation);            }            if(shouldAnimate === true) {              module.debug('Animating in label', $label);              $label                .addClass(className.hidden)                .insertBefore($next)                .transition(settings.label.transition, settings.label.duration)              ;            }            else {              module.debug('Adding selection label', $label);              $label                .insertBefore($next)              ;            }          },          message: function(message) {            var              $message = $menu.children(selector.message),              html     = settings.templates.message(module.add.variables(message))            ;            if($message.length > 0) {              $message                .html(html)              ;            }            else {              $message = $('<div/>')                .html(html)                .addClass(className.message)                .appendTo($menu)              ;            }          },          optionValue: function(value) {            var              escapedValue = module.escape.value(value),              $option      = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),              hasOption    = ($option.length > 0)            ;            if(hasOption) {              return;            }            // temporarily disconnect observer            module.disconnect.selectObserver();            if( module.is.single() ) {              module.verbose('Removing previous user addition');              $input.find('option.' + className.addition).remove();            }            $('<option/>')              .prop('value', escapedValue)              .addClass(className.addition)              .html(value)              .appendTo($input)            ;            module.verbose('Adding user addition as an <option>', value);            module.observe.select();          },          userSuggestion: function(value) {            var              $addition         = $menu.children(selector.addition),              $existingItem     = module.get.item(value),              alreadyHasValue   = $existingItem && $existingItem.not(selector.addition).length,              hasUserSuggestion = $addition.length > 0,              html            ;            if(settings.useLabels && module.has.maxSelections()) {              return;            }            if(value === '' || alreadyHasValue) {              $addition.remove();              return;            }            if(hasUserSuggestion) {              $addition                .data(metadata.value, value)                .data(metadata.text, value)                .attr('data-' + metadata.value, value)                .attr('data-' + metadata.text, value)                .removeClass(className.filtered)              ;              if(!settings.hideAdditions) {                html = settings.templates.addition( module.add.variables(message.addResult, value) );                $addition                  .html(html)                ;              }              module.verbose('Replacing user suggestion with new value', $addition);            }            else {              $addition = module.create.userChoice(value);              $addition                .prependTo($menu)              ;              module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);            }            if(!settings.hideAdditions || module.is.allFiltered()) {              $addition                .addClass(className.selected)                .siblings()                .removeClass(className.selected)              ;            }            module.refreshItems();          },          variables: function(message, term) {            var              hasCount    = (message.search('{count}') !== -1),              hasMaxCount = (message.search('{maxCount}') !== -1),              hasTerm     = (message.search('{term}') !== -1),              values,              count,              query            ;            module.verbose('Adding templated variables to message', message);            if(hasCount) {              count  = module.get.selectionCount();              message = message.replace('{count}', count);            }            if(hasMaxCount) {              count  = module.get.selectionCount();              message = message.replace('{maxCount}', settings.maxSelections);            }            if(hasTerm) {              query   = term || module.get.query();              message = message.replace('{term}', query);            }            return message;          },          value: function(addedValue, addedText, $selectedItem) {            var              currentValue = module.get.values(),              newValue            ;            if(module.has.value(addedValue)) {              module.debug('Value already selected');              return;            }            if(addedValue === '') {              module.debug('Cannot select blank values from multiselect');              return;            }            // extend current array            if($.isArray(currentValue)) {              newValue = currentValue.concat([addedValue]);              newValue = module.get.uniqueArray(newValue);            }            else {              newValue = [addedValue];            }            // add values            if( module.has.selectInput() ) {              if(module.can.extendSelect()) {                module.debug('Adding value to select', addedValue, newValue, $input);                module.add.optionValue(addedValue);              }            }            else {              newValue = newValue.join(settings.delimiter);              module.debug('Setting hidden input to delimited value', newValue, $input);            }            if(settings.fireOnInit === false && module.is.initialLoad()) {              module.verbose('Skipping onadd callback on initial load', settings.onAdd);            }            else {              settings.onAdd.call(element, addedValue, addedText, $selectedItem);            }            module.set.value(newValue, addedValue, addedText, $selectedItem);            module.check.maxSelections();          },        },        remove: {          active: function() {            $module.removeClass(className.active);          },          activeLabel: function() {            $module.find(selector.label).removeClass(className.active);          },          empty: function() {            $module.removeClass(className.empty);          },          loading: function() {            $module.removeClass(className.loading);          },          initialLoad: function() {            initialLoad = false;          },          upward: function($currentMenu) {            var $element = $currentMenu || $module;            $element.removeClass(className.upward);          },          leftward: function($currentMenu) {            var $element = $currentMenu || $menu;            $element.removeClass(className.leftward);          },          visible: function() {            $module.removeClass(className.visible);          },          activeItem: function() {            $item.removeClass(className.active);          },          filteredItem: function() {            if(settings.useLabels && module.has.maxSelections() ) {              return;            }            if(settings.useLabels && module.is.multiple()) {              $item.not('.' + className.active).removeClass(className.filtered);            }            else {              $item.removeClass(className.filtered);            }            module.remove.empty();          },          optionValue: function(value) {            var              escapedValue = module.escape.value(value),              $option      = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),              hasOption    = ($option.length > 0)            ;            if(!hasOption || !$option.hasClass(className.addition)) {              return;            }            // temporarily disconnect observer            if(selectObserver) {              selectObserver.disconnect();              module.verbose('Temporarily disconnecting mutation observer');            }            $option.remove();            module.verbose('Removing user addition as an <option>', escapedValue);            if(selectObserver) {              selectObserver.observe($input[0], {                childList : true,                subtree   : true              });            }          },          message: function() {            $menu.children(selector.message).remove();          },          searchWidth: function() {            $search.css('width', '');          },          searchTerm: function() {            module.verbose('Cleared search term');            $search.val('');            module.set.filtered();          },          userAddition: function() {            $item.filter(selector.addition).remove();          },          selected: function(value, $selectedItem) {            $selectedItem = (settings.allowAdditions)              ? $selectedItem || module.get.itemWithAdditions(value)              : $selectedItem || module.get.item(value)            ;            if(!$selectedItem) {              return false;            }            $selectedItem              .each(function() {                var                  $selected     = $(this),                  selectedText  = module.get.choiceText($selected),                  selectedValue = module.get.choiceValue($selected, selectedText)                ;                if(module.is.multiple()) {                  if(settings.useLabels) {                    module.remove.value(selectedValue, selectedText, $selected);                    module.remove.label(selectedValue);                  }                  else {                    module.remove.value(selectedValue, selectedText, $selected);                    if(module.get.selectionCount() === 0) {                      module.set.placeholderText();                    }                    else {                      module.set.text(module.add.variables(message.count));                    }                  }                }                else {                  module.remove.value(selectedValue, selectedText, $selected);                }                $selected                  .removeClass(className.filtered)                  .removeClass(className.active)                ;                if(settings.useLabels) {                  $selected.removeClass(className.selected);                }              })            ;          },          selectedItem: function() {            $item.removeClass(className.selected);          },          value: function(removedValue, removedText, $removedItem) {            var              values = module.get.values(),              newValue            ;            if( module.has.selectInput() ) {              module.verbose('Input is <select> removing selected option', removedValue);              newValue = module.remove.arrayValue(removedValue, values);              module.remove.optionValue(removedValue);            }            else {              module.verbose('Removing from delimited values', removedValue);              newValue = module.remove.arrayValue(removedValue, values);              newValue = newValue.join(settings.delimiter);            }            if(settings.fireOnInit === false && module.is.initialLoad()) {              module.verbose('No callback on initial load', settings.onRemove);            }            else {              settings.onRemove.call(element, removedValue, removedText, $removedItem);            }            module.set.value(newValue, removedText, $removedItem);            module.check.maxSelections();          },          arrayValue: function(removedValue, values) {            if( !$.isArray(values) ) {              values = [values];            }            values = $.grep(values, function(value){              return (removedValue != value);            });            module.verbose('Removed value from delimited string', removedValue, values);            return values;          },          label: function(value, shouldAnimate) {            var              $labels       = $module.find(selector.label),              $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(value) +'"]')            ;            module.verbose('Removing label', $removedLabel);            $removedLabel.remove();          },          activeLabels: function($activeLabels) {            $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);            module.verbose('Removing active label selections', $activeLabels);            module.remove.labels($activeLabels);          },          labels: function($labels) {            $labels = $labels || $module.find(selector.label);            module.verbose('Removing labels', $labels);            $labels              .each(function(){                var                  $label      = $(this),                  value       = $label.data(metadata.value),                  stringValue = (value !== undefined)                    ? String(value)                    : value,                  isUserValue = module.is.userValue(stringValue)                ;                if(settings.onLabelRemove.call($label, value) === false) {                  module.debug('Label remove callback cancelled removal');                  return;                }                module.remove.message();                if(isUserValue) {                  module.remove.value(stringValue);                  module.remove.label(stringValue);                }                else {                  // selected will also remove label                  module.remove.selected(stringValue);                }              })            ;          },          tabbable: function() {            if( module.is.searchSelection() ) {              module.debug('Searchable dropdown initialized');              $search                .removeAttr('tabindex')              ;              $menu                .removeAttr('tabindex')              ;            }            else {              module.debug('Simple selection dropdown initialized');              $module                .removeAttr('tabindex')              ;              $menu                .removeAttr('tabindex')              ;            }          },          clearable: function() {            $icon.removeClass(className.clear);          }        },        has: {          menuSearch: function() {            return (module.has.search() && $search.closest($menu).length > 0);          },          search: function() {            return ($search.length > 0);          },          sizer: function() {            return ($sizer.length > 0);          },          selectInput: function() {            return ( $input.is('select') );          },          minCharacters: function(searchTerm) {            if(settings.minCharacters) {              searchTerm = (searchTerm !== undefined)                ? String(searchTerm)                : String(module.get.query())              ;              return (searchTerm.length >= settings.minCharacters);            }            return true;          },          firstLetter: function($item, letter) {            var              text,              firstLetter            ;            if(!$item || $item.length === 0 || typeof letter !== 'string') {              return false;            }            text        = module.get.choiceText($item, false);            letter      = letter.toLowerCase();            firstLetter = String(text).charAt(0).toLowerCase();            return (letter == firstLetter);          },          input: function() {            return ($input.length > 0);          },          items: function() {            return ($item.length > 0);          },          menu: function() {            return ($menu.length > 0);          },          message: function() {            return ($menu.children(selector.message).length !== 0);          },          label: function(value) {            var              escapedValue = module.escape.value(value),              $labels      = $module.find(selector.label)            ;            if(settings.ignoreCase) {              escapedValue = escapedValue.toLowerCase();            }            return ($labels.filter('[data-' + metadata.value + '="' + module.escape.string(escapedValue) +'"]').length > 0);          },          maxSelections: function() {            return (settings.maxSelections && module.get.selectionCount() >= settings.maxSelections);          },          allResultsFiltered: function() {            var              $normalResults = $item.not(selector.addition)            ;            return ($normalResults.filter(selector.unselectable).length === $normalResults.length);          },          userSuggestion: function() {            return ($menu.children(selector.addition).length > 0);          },          query: function() {            return (module.get.query() !== '');          },          value: function(value) {            return (settings.ignoreCase)              ? module.has.valueIgnoringCase(value)              : module.has.valueMatchingCase(value)            ;          },          valueMatchingCase: function(value) {            var              values   = module.get.values(),              hasValue = $.isArray(values)               ? values && ($.inArray(value, values) !== -1)               : (values == value)            ;            return (hasValue)              ? true              : false            ;          },          valueIgnoringCase: function(value) {            var              values   = module.get.values(),              hasValue = false            ;            if(!$.isArray(values)) {              values = [values];            }            $.each(values, function(index, existingValue) {              if(String(value).toLowerCase() == String(existingValue).toLowerCase()) {                hasValue = true;                return false;              }            });            return hasValue;          }        },        is: {          active: function() {            return $module.hasClass(className.active);          },          animatingInward: function() {            return $menu.transition('is inward');          },          animatingOutward: function() {            return $menu.transition('is outward');          },          bubbledLabelClick: function(event) {            return $(event.target).is('select, input') && $module.closest('label').length > 0;          },          bubbledIconClick: function(event) {            return $(event.target).closest($icon).length > 0;          },          alreadySetup: function() {            return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);          },          animating: function($subMenu) {            return ($subMenu)              ? $subMenu.transition && $subMenu.transition('is animating')              : $menu.transition    && $menu.transition('is animating')            ;          },          leftward: function($subMenu) {            var $selectedMenu = $subMenu || $menu;            return $selectedMenu.hasClass(className.leftward);          },          disabled: function() {            return $module.hasClass(className.disabled);          },          focused: function() {            return (document.activeElement === $module[0]);          },          focusedOnSearch: function() {            return (document.activeElement === $search[0]);          },          allFiltered: function() {            return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );          },          hidden: function($subMenu) {            return !module.is.visible($subMenu);          },          initialLoad: function() {            return initialLoad;          },          inObject: function(needle, object) {            var              found = false            ;            $.each(object, function(index, property) {              if(property == needle) {                found = true;                return true;              }            });            return found;          },          multiple: function() {            return $module.hasClass(className.multiple);          },          remote: function() {            return settings.apiSettings && module.can.useAPI();          },          single: function() {            return !module.is.multiple();          },          selectMutation: function(mutations) {            var              selectChanged = false            ;            $.each(mutations, function(index, mutation) {              if(mutation.target && $(mutation.target).is('select')) {                selectChanged = true;                return true;              }            });            return selectChanged;          },          search: function() {            return $module.hasClass(className.search);          },          searchSelection: function() {            return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );          },          selection: function() {            return $module.hasClass(className.selection);          },          userValue: function(value) {            return ($.inArray(value, module.get.userValues()) !== -1);          },          upward: function($menu) {            var $element = $menu || $module;            return $element.hasClass(className.upward);          },          visible: function($subMenu) {            return ($subMenu)              ? $subMenu.hasClass(className.visible)              : $menu.hasClass(className.visible)            ;          },          verticallyScrollableContext: function() {            var              overflowY = ($context.get(0) !== window)                ? $context.css('overflow-y')                : false            ;            return (overflowY == 'auto' || overflowY == 'scroll');          },          horizontallyScrollableContext: function() {            var              overflowX = ($context.get(0) !== window)                ? $context.css('overflow-X')                : false            ;            return (overflowX == 'auto' || overflowX == 'scroll');          }        },        can: {          activate: function($item) {            if(settings.useLabels) {              return true;            }            if(!module.has.maxSelections()) {              return true;            }            if(module.has.maxSelections() && $item.hasClass(className.active)) {              return true;            }            return false;          },          openDownward: function($subMenu) {            var              $currentMenu    = $subMenu || $menu,              canOpenDownward = true,              onScreen        = {},              calculations            ;            $currentMenu              .addClass(className.loading)            ;            calculations = {              context: {                offset    : ($context.get(0) === window)                  ? { top: 0, left: 0}                  : $context.offset(),                scrollTop : $context.scrollTop(),                height    : $context.outerHeight()              },              menu : {                offset: $currentMenu.offset(),                height: $currentMenu.outerHeight()              }            };            if(module.is.verticallyScrollableContext()) {              calculations.menu.offset.top += calculations.context.scrollTop;            }            onScreen = {              above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,              below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height            };            if(onScreen.below) {              module.verbose('Dropdown can fit in context downward', onScreen);              canOpenDownward = true;            }            else if(!onScreen.below && !onScreen.above) {              module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);              canOpenDownward = true;            }            else {              module.verbose('Dropdown cannot fit below, opening upward', onScreen);              canOpenDownward = false;            }            $currentMenu.removeClass(className.loading);            return canOpenDownward;          },          openRightward: function($subMenu) {            var              $currentMenu     = $subMenu || $menu,              canOpenRightward = true,              isOffscreenRight = false,              calculations            ;            $currentMenu              .addClass(className.loading)            ;            calculations = {              context: {                offset     : ($context.get(0) === window)                  ? { top: 0, left: 0}                  : $context.offset(),                scrollLeft : $context.scrollLeft(),                width      : $context.outerWidth()              },              menu: {                offset : $currentMenu.offset(),                width  : $currentMenu.outerWidth()              }            };            if(module.is.horizontallyScrollableContext()) {              calculations.menu.offset.left += calculations.context.scrollLeft;            }            isOffscreenRight = (calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);            if(isOffscreenRight) {              module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);              canOpenRightward = false;            }            $currentMenu.removeClass(className.loading);            return canOpenRightward;          },          click: function() {            return (hasTouch || settings.on == 'click');          },          extendSelect: function() {            return settings.allowAdditions || settings.apiSettings;          },          show: function() {            return !module.is.disabled() && (module.has.items() || module.has.message());          },          useAPI: function() {            return $.fn.api !== undefined;          }        },        animate: {          show: function(callback, $subMenu) {            var              $currentMenu = $subMenu || $menu,              start = ($subMenu)                ? function() {}                : function() {                  module.hideSubMenus();                  module.hideOthers();                  module.set.active();                },              transition            ;            callback = $.isFunction(callback)              ? callback              : function(){}            ;            module.verbose('Doing menu show animation', $currentMenu);            module.set.direction($subMenu);            transition = module.get.transition($subMenu);            if( module.is.selection() ) {              module.set.scrollPosition(module.get.selectedItem(), true);            }            if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {              if(transition == 'none') {                start();                $currentMenu.transition('show');                callback.call(element);              }              else if($.fn.transition !== undefined && $module.transition('is supported')) {                $currentMenu                  .transition({                    animation  : transition + ' in',                    debug      : settings.debug,                    verbose    : settings.verbose,                    duration   : settings.duration,                    queue      : true,                    onStart    : start,                    onComplete : function() {                      callback.call(element);                    }                  })                ;              }              else {                module.error(error.noTransition, transition);              }            }          },          hide: function(callback, $subMenu) {            var              $currentMenu = $subMenu || $menu,              duration = ($subMenu)                ? (settings.duration * 0.9)                : settings.duration,              start = ($subMenu)                ? function() {}                : function() {                  if( module.can.click() ) {                    module.unbind.intent();                  }                  module.remove.active();                },              transition = module.get.transition($subMenu)            ;            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {              module.verbose('Doing menu hide animation', $currentMenu);              if(transition == 'none') {                start();                $currentMenu.transition('hide');                callback.call(element);              }              else if($.fn.transition !== undefined && $module.transition('is supported')) {                $currentMenu                  .transition({                    animation  : transition + ' out',                    duration   : settings.duration,                    debug      : settings.debug,                    verbose    : settings.verbose,                    queue      : false,                    onStart    : start,                    onComplete : function() {                      callback.call(element);                    }                  })                ;              }              else {                module.error(error.transition);              }            }          }        },        hideAndClear: function() {          module.remove.searchTerm();          if( module.has.maxSelections() ) {            return;          }          if(module.has.search()) {            module.hide(function() {              module.remove.filteredItem();            });          }          else {            module.hide();          }        },        delay: {          show: function() {            module.verbose('Delaying show event to ensure user intent');            clearTimeout(module.timer);            module.timer = setTimeout(module.show, settings.delay.show);          },          hide: function() {            module.verbose('Delaying hide event to ensure user intent');            clearTimeout(module.timer);            module.timer = setTimeout(module.hide, settings.delay.hide);          }        },        escape: {          value: function(value) {            var              multipleValues = $.isArray(value),              stringValue    = (typeof value === 'string'),              isUnparsable   = (!stringValue && !multipleValues),              hasQuotes      = (stringValue && value.search(regExp.quote) !== -1),              values         = []            ;            if(isUnparsable || !hasQuotes) {              return value;            }            module.debug('Encoding quote values for use in select', value);            if(multipleValues) {              $.each(value, function(index, value){                values.push(value.replace(regExp.quote, '"'));              });              return values;            }            return value.replace(regExp.quote, '"');          },          string: function(text) {            text =  String(text);            return text.replace(regExp.escape, '\\$&');          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : $allModules  ;};$.fn.dropdown.settings = {  silent                 : false,  debug                  : false,  verbose                : false,  performance            : true,  on                     : 'click',    // what event should show menu action on item selection  action                 : 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})  values                 : false,      // specify values to use for dropdown  clearable              : false,      // whether the value of the dropdown can be cleared  apiSettings            : false,  selectOnKeydown        : true,       // Whether selection should occur automatically when keyboard shortcuts used  minCharacters          : 0,          // Minimum characters required to trigger API call  filterRemoteData       : false,      // Whether API results should be filtered after being returned for query term  saveRemoteData         : true,       // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh  throttle               : 200,        // How long to wait after last user input to search remotely  context                : window,     // Context to use when determining if on screen  direction              : 'auto',     // Whether dropdown should always open in one direction  keepOnScreen           : true,       // Whether dropdown should check whether it is on screen before showing  match                  : 'both',     // what to match against with search selection (both, text, or label)  fullTextSearch         : false,      // search anywhere in value (set to 'exact' to require exact matches)  placeholder            : 'auto',     // whether to convert blank <select> values to placeholder text  preserveHTML           : true,       // preserve html when selecting value  sortSelect             : false,      // sort selection on init  forceSelection         : true,       // force a choice on blur with search selection  allowAdditions         : false,      // whether multiple select should allow user added values  ignoreCase             : false,       // whether to consider values not matching in case to be the same  hideAdditions          : true,       // whether or not to hide special message prompting a user they can enter a value  maxSelections          : false,      // When set to a number limits the number of selections to this count  useLabels              : true,       // whether multiple select should filter currently active selections from choices  delimiter              : ',',        // when multiselect uses normal <input> the values will be delimited with this character  showOnFocus            : true,       // show menu on focus  allowReselection       : false,      // whether current value should trigger callbacks when reselected  allowTab               : true,       // add tabindex to element  allowCategorySelection : false,      // allow elements with sub-menus to be selected  fireOnInit             : false,      // Whether callbacks should fire when initializing dropdown values  transition             : 'auto',     // auto transition will slide down or up based on direction  duration               : 200,        // duration of transition  glyphWidth             : 1.037,      // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width  // label settings on multi-select  label: {    transition : 'scale',    duration   : 200,    variation  : false  },  // delay before event  delay : {    hide   : 300,    show   : 200,    search : 20,    touch  : 50  },  /* Callbacks */  onChange      : function(value, text, $selected){},  onAdd         : function(value, text, $selected){},  onRemove      : function(value, text, $selected){},  onLabelSelect : function($selectedLabels){},  onLabelCreate : function(value, text) { return $(this); },  onLabelRemove : function(value) { return true; },  onNoResults   : function(searchTerm) { return true; },  onShow        : function(){},  onHide        : function(){},  /* Component */  name           : 'Dropdown',  namespace      : 'dropdown',  message: {    addResult     : 'Add <b>{term}</b>',    count         : '{count} selected',    maxSelections : 'Max {maxCount} selections',    noResults     : 'No results found.',    serverError   : 'There was an error contacting the server'  },  error : {    action          : 'You called a dropdown action that was not defined',    alreadySetup    : 'Once a select has been initialized behaviors must be called on the created ui dropdown',    labels          : 'Allowing user additions currently requires the use of labels.',    missingMultiple : '<select> requires multiple property to be set to correctly preserve multiple values',    method          : 'The method you called is not defined.',    noAPI           : 'The API module is required to load resources remotely',    noStorage       : 'Saving remote data requires session storage',    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'  },  regExp : {    escape   : /[-[\]{}()*+?.,\\^$|#\s]/g,    quote    : /"/g  },  metadata : {    defaultText     : 'defaultText',    defaultValue    : 'defaultValue',    placeholderText : 'placeholder',    text            : 'text',    value           : 'value'  },  // property names for remote query  fields: {    remoteValues : 'results',  // grouping for api results    values       : 'values',   // grouping for all dropdown values    disabled     : 'disabled', // whether value should be disabled    name         : 'name',     // displayed dropdown text    value        : 'value',    // actual dropdown value    text         : 'text'      // displayed text when selected  },  keys : {    backspace  : 8,    delimiter  : 188, // comma    deleteKey  : 46,    enter      : 13,    escape     : 27,    pageUp     : 33,    pageDown   : 34,    leftArrow  : 37,    upArrow    : 38,    rightArrow : 39,    downArrow  : 40  },  selector : {    addition     : '.addition',    dropdown     : '.ui.dropdown',    hidden       : '.hidden',    icon         : '> .dropdown.icon',    input        : '> input[type="hidden"], > select',    item         : '.item',    label        : '> .label',    remove       : '> .label > .delete.icon',    siblingLabel : '.label',    menu         : '.menu',    message      : '.message',    menuIcon     : '.dropdown.icon',    search       : 'input.search, .menu > .search > input, .menu input.search',    sizer        : '> input.sizer',    text         : '> .text:not(.icon)',    unselectable : '.disabled, .filtered'  },  className : {    active      : 'active',    addition    : 'addition',    animating   : 'animating',    clear       : 'clear',    disabled    : 'disabled',    empty       : 'empty',    dropdown    : 'ui dropdown',    filtered    : 'filtered',    hidden      : 'hidden transition',    item        : 'item',    label       : 'ui label',    loading     : 'loading',    menu        : 'menu',    message     : 'message',    multiple    : 'multiple',    placeholder : 'default',    sizer       : 'sizer',    search      : 'search',    selected    : 'selected',    selection   : 'selection',    upward      : 'upward',    leftward    : 'left',    visible     : 'visible'  }};/* Templates */$.fn.dropdown.settings.templates = {  // generates dropdown from select values  dropdown: function(select) {    var      placeholder = select.placeholder || false,      values      = select.values || {},      html        = ''    ;    html +=  '<i class="dropdown icon"></i>';    if(select.placeholder) {      html += '<div class="default text">' + placeholder + '</div>';    }    else {      html += '<div class="text"></div>';    }    html += '<div class="menu">';    $.each(select.values, function(index, option) {      html += (option.disabled)        ? '<div class="disabled item" data-value="' + option.value + '">' + option.name + '</div>'        : '<div class="item" data-value="' + option.value + '">' + option.name + '</div>'      ;    });    html += '</div>';    return html;  },  // generates just menu from select  menu: function(response, fields) {    var      values = response[fields.values] || {},      html   = ''    ;    $.each(values, function(index, option) {      var        maybeText = (option[fields.text])          ? 'data-text="' + option[fields.text] + '"'          : '',        maybeDisabled = (option[fields.disabled])          ? 'disabled '          : ''      ;      html += '<div class="'+ maybeDisabled +'item" data-value="' + option[fields.value] + '"' + maybeText + '>';      html +=   option[fields.name];      html += '</div>';    });    return html;  },  // generates label for multiselect  label: function(value, text) {    return text + '<i class="delete icon"></i>';  },  // generates messages like "No results"  message: function(message) {    return message;  },  // generates user addition to selection menu  addition: function(choice) {    return choice;  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Embed * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {"use strict";window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.embed = function(parameters) {  var    $allModules     = $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.embed.settings, parameters)          : $.extend({}, $.fn.embed.settings),        selector        = settings.selector,        className       = settings.className,        sources         = settings.sources,        error           = settings.error,        metadata        = settings.metadata,        namespace       = settings.namespace,        templates       = settings.templates,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $window         = $(window),        $module         = $(this),        $placeholder    = $module.find(selector.placeholder),        $icon           = $module.find(selector.icon),        $embed          = $module.find(selector.embed),        element         = this,        instance        = $module.data(moduleNamespace),        module      ;      module = {        initialize: function() {          module.debug('Initializing embed');          module.determine.autoplay();          module.create();          module.bind.events();          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous instance of embed');          module.reset();          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        refresh: function() {          module.verbose('Refreshing selector cache');          $placeholder = $module.find(selector.placeholder);          $icon        = $module.find(selector.icon);          $embed       = $module.find(selector.embed);        },        bind: {          events: function() {            if( module.has.placeholder() ) {              module.debug('Adding placeholder events');              $module                .on('click' + eventNamespace, selector.placeholder, module.createAndShow)                .on('click' + eventNamespace, selector.icon, module.createAndShow)              ;            }          }        },        create: function() {          var            placeholder = module.get.placeholder()          ;          if(placeholder) {            module.createPlaceholder();          }          else {            module.createAndShow();          }        },        createPlaceholder: function(placeholder) {          var            icon  = module.get.icon(),            url   = module.get.url(),            embed = module.generate.embed(url)          ;          placeholder = placeholder || module.get.placeholder();          $module.html( templates.placeholder(placeholder, icon) );          module.debug('Creating placeholder for embed', placeholder, icon);        },        createEmbed: function(url) {          module.refresh();          url = url || module.get.url();          $embed = $('<div/>')            .addClass(className.embed)            .html( module.generate.embed(url) )            .appendTo($module)          ;          settings.onCreate.call(element, url);          module.debug('Creating embed object', $embed);        },        changeEmbed: function(url) {          $embed            .html( module.generate.embed(url) )          ;        },        createAndShow: function() {          module.createEmbed();          module.show();        },        // sets new embed        change: function(source, id, url) {          module.debug('Changing video to ', source, id, url);          $module            .data(metadata.source, source)            .data(metadata.id, id)          ;          if(url) {            $module.data(metadata.url, url);          }          else {            $module.removeData(metadata.url);          }          if(module.has.embed()) {            module.changeEmbed();          }          else {            module.create();          }        },        // clears embed        reset: function() {          module.debug('Clearing embed and showing placeholder');          module.remove.data();          module.remove.active();          module.remove.embed();          module.showPlaceholder();          settings.onReset.call(element);        },        // shows current embed        show: function() {          module.debug('Showing embed');          module.set.active();          settings.onDisplay.call(element);        },        hide: function() {          module.debug('Hiding embed');          module.showPlaceholder();        },        showPlaceholder: function() {          module.debug('Showing placeholder image');          module.remove.active();          settings.onPlaceholderDisplay.call(element);        },        get: {          id: function() {            return settings.id || $module.data(metadata.id);          },          placeholder: function() {            return settings.placeholder || $module.data(metadata.placeholder);          },          icon: function() {            return (settings.icon)              ? settings.icon              : ($module.data(metadata.icon) !== undefined)                ? $module.data(metadata.icon)                : module.determine.icon()            ;          },          source: function(url) {            return (settings.source)              ? settings.source              : ($module.data(metadata.source) !== undefined)                ? $module.data(metadata.source)                : module.determine.source()            ;          },          type: function() {            var source = module.get.source();            return (sources[source] !== undefined)              ? sources[source].type              : false            ;          },          url: function() {            return (settings.url)              ? settings.url              : ($module.data(metadata.url) !== undefined)                ? $module.data(metadata.url)                : module.determine.url()            ;          }        },        determine: {          autoplay: function() {            if(module.should.autoplay()) {              settings.autoplay = true;            }          },          source: function(url) {            var              matchedSource = false            ;            url = url || module.get.url();            if(url) {              $.each(sources, function(name, source) {                if(url.search(source.domain) !== -1) {                  matchedSource = name;                  return false;                }              });            }            return matchedSource;          },          icon: function() {            var              source = module.get.source()            ;            return (sources[source] !== undefined)              ? sources[source].icon              : false            ;          },          url: function() {            var              id     = settings.id     || $module.data(metadata.id),              source = settings.source || $module.data(metadata.source),              url            ;            url = (sources[source] !== undefined)              ? sources[source].url.replace('{id}', id)              : false            ;            if(url) {              $module.data(metadata.url, url);            }            return url;          }        },        set: {          active: function() {            $module.addClass(className.active);          }        },        remove: {          data: function() {            $module              .removeData(metadata.id)              .removeData(metadata.icon)              .removeData(metadata.placeholder)              .removeData(metadata.source)              .removeData(metadata.url)            ;          },          active: function() {            $module.removeClass(className.active);          },          embed: function() {            $embed.empty();          }        },        encode: {          parameters: function(parameters) {            var              urlString = [],              index            ;            for (index in parameters) {              urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) );            }            return urlString.join('&');          }        },        generate: {          embed: function(url) {            module.debug('Generating embed html');            var              source = module.get.source(),              html,              parameters            ;            url = module.get.url(url);            if(url) {              parameters = module.generate.parameters(source);              html       = templates.iframe(url, parameters);            }            else {              module.error(error.noURL, $module);            }            return html;          },          parameters: function(source, extraParameters) {            var              parameters = (sources[source] && sources[source].parameters !== undefined)                ? sources[source].parameters(settings)                : {}            ;            extraParameters = extraParameters || settings.parameters;            if(extraParameters) {              parameters = $.extend({}, parameters, extraParameters);            }            parameters = settings.onEmbed(parameters);            return module.encode.parameters(parameters);          }        },        has: {          embed: function() {            return ($embed.length > 0);          },          placeholder: function() {            return settings.placeholder || $module.data(metadata.placeholder);          }        },        should: {          autoplay: function() {            return (settings.autoplay === 'auto')              ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined)              : settings.autoplay            ;          }        },        is: {          video: function() {            return module.get.type() == 'video';          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.embed.settings = {  name        : 'Embed',  namespace   : 'embed',  silent      : false,  debug       : false,  verbose     : false,  performance : true,  icon     : false,  source   : false,  url      : false,  id       : false,  // standard video settings  autoplay  : 'auto',  color     : '#444444',  hd        : true,  brandedUI : false,  // additional parameters to include with the embed  parameters: false,  onDisplay            : function() {},  onPlaceholderDisplay : function() {},  onReset              : function() {},  onCreate             : function(url) {},  onEmbed              : function(parameters) {    return parameters;  },  metadata    : {    id          : 'id',    icon        : 'icon',    placeholder : 'placeholder',    source      : 'source',    url         : 'url'  },  error : {    noURL  : 'No URL specified',    method : 'The method you called is not defined'  },  className : {    active : 'active',    embed  : 'embed'  },  selector : {    embed       : '.embed',    placeholder : '.placeholder',    icon        : '.icon'  },  sources: {    youtube: {      name   : 'youtube',      type   : 'video',      icon   : 'video play',      domain : 'youtube.com',      url    : '//www.youtube.com/embed/{id}',      parameters: function(settings) {        return {          autohide       : !settings.brandedUI,          autoplay       : settings.autoplay,          color          : settings.color || undefined,          hq             : settings.hd,          jsapi          : settings.api,          modestbranding : !settings.brandedUI        };      }    },    vimeo: {      name   : 'vimeo',      type   : 'video',      icon   : 'video play',      domain : 'vimeo.com',      url    : '//player.vimeo.com/video/{id}',      parameters: function(settings) {        return {          api      : settings.api,          autoplay : settings.autoplay,          byline   : settings.brandedUI,          color    : settings.color || undefined,          portrait : settings.brandedUI,          title    : settings.brandedUI        };      }    }  },  templates: {    iframe : function(url, parameters) {      var src = url;      if (parameters) {          src += '?' + parameters;      }      return ''        + '<iframe src="' + src + '"'        + ' width="100%" height="100%"'        + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'      ;    },    placeholder : function(image, icon) {      var        html = ''      ;      if(icon) {        html += '<i class="' + icon + ' icon"></i>';      }      if(image) {        html += '<img class="placeholder" src="' + image + '">';      }      return html;    }  },  // NOT YET IMPLEMENTED  api     : false,  onPause : function() {},  onPlay  : function() {},  onStop  : function() {}};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Modal * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.modal = function(parameters) {  var    $allModules    = $(this),    $window        = $(window),    $document      = $(document),    $body          = $('body'),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    requestAnimationFrame = window.requestAnimationFrame      || window.mozRequestAnimationFrame      || window.webkitRequestAnimationFrame      || window.msRequestAnimationFrame      || function(callback) { setTimeout(callback, 0); },    returnedValue  ;  $allModules    .each(function() {      var        settings    = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.modal.settings, parameters)          : $.extend({}, $.fn.modal.settings),        selector        = settings.selector,        className       = settings.className,        namespace       = settings.namespace,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $module         = $(this),        $context        = $(settings.context),        $close          = $module.find(selector.close),        $allModals,        $otherModals,        $focusedElement,        $dimmable,        $dimmer,        element         = this,        instance        = $module.data(moduleNamespace),        ignoreRepeatedEvents = false,        elementEventNamespace,        id,        observer,        module      ;      module  = {        initialize: function() {          module.verbose('Initializing dimmer', $context);          module.create.id();          module.create.dimmer();          module.refreshModals();          module.bind.events();          if(settings.observeChanges) {            module.observeChanges();          }          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of modal');          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        create: {          dimmer: function() {            var              defaultSettings = {                debug      : settings.debug,                variation  : settings.centered                  ? false                  : 'top aligned',                dimmerName : 'modals'              },              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)            ;            if($.fn.dimmer === undefined) {              module.error(error.dimmer);              return;            }            module.debug('Creating dimmer');            $dimmable = $context.dimmer(dimmerSettings);            if(settings.detachable) {              module.verbose('Modal is detachable, moving content into dimmer');              $dimmable.dimmer('add content', $module);            }            else {              module.set.undetached();            }            $dimmer = $dimmable.dimmer('get dimmer');          },          id: function() {            id = (Math.random().toString(16) + '000000000').substr(2, 8);            elementEventNamespace = '.' + id;            module.verbose('Creating unique id for element', id);          }        },        destroy: function() {          module.verbose('Destroying previous modal');          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;          $window.off(elementEventNamespace);          $dimmer.off(elementEventNamespace);          $close.off(eventNamespace);          $context.dimmer('destroy');        },        observeChanges: function() {          if('MutationObserver' in window) {            observer = new MutationObserver(function(mutations) {              module.debug('DOM tree modified, refreshing');              module.refresh();            });            observer.observe(element, {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', observer);          }        },        refresh: function() {          module.remove.scrolling();          module.cacheSizes();          if(!module.can.useFlex()) {            module.set.modalOffset();          }          module.set.screenHeight();          module.set.type();        },        refreshModals: function() {          $otherModals = $module.siblings(selector.modal);          $allModals   = $otherModals.add($module);        },        attachEvents: function(selector, event) {          var            $toggle = $(selector)          ;          event = $.isFunction(module[event])            ? module[event]            : module.toggle          ;          if($toggle.length > 0) {            module.debug('Attaching modal events to element', selector, event);            $toggle              .off(eventNamespace)              .on('click' + eventNamespace, event)            ;          }          else {            module.error(error.notFound, selector);          }        },        bind: {          events: function() {            module.verbose('Attaching events');            $module              .on('click' + eventNamespace, selector.close, module.event.close)              .on('click' + eventNamespace, selector.approve, module.event.approve)              .on('click' + eventNamespace, selector.deny, module.event.deny)            ;            $window              .on('resize' + elementEventNamespace, module.event.resize)            ;          },          scrollLock: function() {            // touch events default to passive, due to changes in chrome to optimize mobile perf            $dimmable.get(0).addEventListener('touchmove', module.event.preventScroll, { passive: false });          }        },        unbind: {          scrollLock: function() {            $dimmable.get(0).removeEventListener('touchmove', module.event.preventScroll, { passive: false });          }        },        get: {          id: function() {            return (Math.random().toString(16) + '000000000').substr(2, 8);          }        },        event: {          approve: function() {            if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {              module.verbose('Approve callback returned false cancelling hide');              return;            }            ignoreRepeatedEvents = true;            module.hide(function() {              ignoreRepeatedEvents = false;            });          },          preventScroll: function(event) {            event.preventDefault();          },          deny: function() {            if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {              module.verbose('Deny callback returned false cancelling hide');              return;            }            ignoreRepeatedEvents = true;            module.hide(function() {              ignoreRepeatedEvents = false;            });          },          close: function() {            module.hide();          },          click: function(event) {            if(!settings.closable) {              module.verbose('Dimmer clicked but closable setting is disabled');              return;            }            var              $target   = $(event.target),              isInModal = ($target.closest(selector.modal).length > 0),              isInDOM   = $.contains(document.documentElement, event.target)            ;            if(!isInModal && isInDOM && module.is.active()) {              module.debug('Dimmer clicked, hiding all modals');              module.remove.clickaway();              if(settings.allowMultiple) {                module.hide();              }              else {                module.hideAll();              }            }          },          debounce: function(method, delay) {            clearTimeout(module.timer);            module.timer = setTimeout(method, delay);          },          keyboard: function(event) {            var              keyCode   = event.which,              escapeKey = 27            ;            if(keyCode == escapeKey) {              if(settings.closable) {                module.debug('Escape key pressed hiding modal');                module.hide();              }              else {                module.debug('Escape key pressed, but closable is set to false');              }              event.preventDefault();            }          },          resize: function() {            if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {              requestAnimationFrame(module.refresh);            }          }        },        toggle: function() {          if( module.is.active() || module.is.animating() ) {            module.hide();          }          else {            module.show();          }        },        show: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          module.refreshModals();          module.set.dimmerSettings();          module.set.dimmerStyles();          module.showModal(callback);        },        hide: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          module.refreshModals();          module.hideModal(callback);        },        showModal: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( module.is.animating() || !module.is.active() ) {            module.showDimmer();            module.cacheSizes();            if(module.can.useFlex()) {              module.remove.legacy();            }            else {              module.set.legacy();              module.set.modalOffset();              module.debug('Using non-flex legacy modal positioning.');            }            module.set.screenHeight();            module.set.type();            module.set.clickaway();            if( !settings.allowMultiple && module.others.active() ) {              module.hideOthers(module.showModal);            }            else {              if(settings.allowMultiple && settings.detachable) {                $module.detach().appendTo($dimmer);              }              settings.onShow.call(element);              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {                module.debug('Showing modal with css animations');                $module                  .transition({                    debug       : settings.debug,                    animation   : settings.transition + ' in',                    queue       : settings.queue,                    duration    : settings.duration,                    useFailSafe : true,                    onComplete : function() {                      settings.onVisible.apply(element);                      if(settings.keyboardShortcuts) {                        module.add.keyboardShortcuts();                      }                      module.save.focus();                      module.set.active();                      if(settings.autofocus) {                        module.set.autofocus();                      }                      callback();                    }                  })                ;              }              else {                module.error(error.noTransition);              }            }          }          else {            module.debug('Modal is already visible');          }        },        hideModal: function(callback, keepDimmed) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          module.debug('Hiding modal');          if(settings.onHide.call(element, $(this)) === false) {            module.verbose('Hide callback returned false cancelling hide');            return;          }          if( module.is.animating() || module.is.active() ) {            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {              module.remove.active();              $module                .transition({                  debug       : settings.debug,                  animation   : settings.transition + ' out',                  queue       : settings.queue,                  duration    : settings.duration,                  useFailSafe : true,                  onStart     : function() {                    if(!module.others.active() && !keepDimmed) {                      module.hideDimmer();                    }                    if(settings.keyboardShortcuts) {                      module.remove.keyboardShortcuts();                    }                  },                  onComplete : function() {                    settings.onHidden.call(element);                    module.remove.dimmerStyles();                    module.restore.focus();                    callback();                  }                })              ;            }            else {              module.error(error.noTransition);            }          }        },        showDimmer: function() {          if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {            module.debug('Showing dimmer');            $dimmable.dimmer('show');          }          else {            module.debug('Dimmer already visible');          }        },        hideDimmer: function() {          if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {            module.unbind.scrollLock();            $dimmable.dimmer('hide', function() {              module.remove.clickaway();              module.remove.screenHeight();            });          }          else {            module.debug('Dimmer is not visible cannot hide');            return;          }        },        hideAll: function(callback) {          var            $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)          ;          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( $visibleModals.length > 0 ) {            module.debug('Hiding all visible modals');            module.hideDimmer();            $visibleModals              .modal('hide modal', callback)            ;          }        },        hideOthers: function(callback) {          var            $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)          ;          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( $visibleModals.length > 0 ) {            module.debug('Hiding other modals', $otherModals);            $visibleModals              .modal('hide modal', callback, true)            ;          }        },        others: {          active: function() {            return ($otherModals.filter('.' + className.active).length > 0);          },          animating: function() {            return ($otherModals.filter('.' + className.animating).length > 0);          }        },        add: {          keyboardShortcuts: function() {            module.verbose('Adding keyboard shortcuts');            $document              .on('keyup' + eventNamespace, module.event.keyboard)            ;          }        },        save: {          focus: function() {            var              $activeElement = $(document.activeElement),              inCurrentModal = $activeElement.closest($module).length > 0            ;            if(!inCurrentModal) {              $focusedElement = $(document.activeElement).blur();            }          }        },        restore: {          focus: function() {            if($focusedElement && $focusedElement.length > 0) {              $focusedElement.focus();            }          }        },        remove: {          active: function() {            $module.removeClass(className.active);          },          legacy: function() {            $module.removeClass(className.legacy);          },          clickaway: function() {            $dimmer              .off('click' + elementEventNamespace)            ;          },          dimmerStyles: function() {            $dimmer.removeClass(className.inverted);            $dimmable.removeClass(className.blurring);          },          bodyStyle: function() {            if($body.attr('style') === '') {              module.verbose('Removing style attribute');              $body.removeAttr('style');            }          },          screenHeight: function() {            module.debug('Removing page height');            $body              .css('height', '')            ;          },          keyboardShortcuts: function() {            module.verbose('Removing keyboard shortcuts');            $document              .off('keyup' + eventNamespace)            ;          },          scrolling: function() {            $dimmable.removeClass(className.scrolling);            $module.removeClass(className.scrolling);          }        },        cacheSizes: function() {          $module.addClass(className.loading);          var            scrollHeight = $module.prop('scrollHeight'),            modalWidth   = $module.outerWidth(),            modalHeight  = $module.outerHeight()          ;          if(module.cache === undefined || modalHeight !== 0) {            module.cache = {              pageHeight    : $(document).outerHeight(),              width         : modalWidth,              height        : modalHeight + settings.offset,              scrollHeight  : scrollHeight + settings.offset,              contextHeight : (settings.context == 'body')                ? $(window).height()                : $dimmable.height(),            };            module.cache.topOffset = -(module.cache.height / 2);          }          $module.removeClass(className.loading);          module.debug('Caching modal and container sizes', module.cache);        },        can: {          useFlex: function() {            return (settings.useFlex == 'auto')              ? settings.detachable && !module.is.ie()              : settings.useFlex            ;          },          fit: function() {            var              contextHeight  = module.cache.contextHeight,              verticalCenter = module.cache.contextHeight / 2,              topOffset      = module.cache.topOffset,              scrollHeight   = module.cache.scrollHeight,              height         = module.cache.height,              paddingHeight  = settings.padding,              startPosition  = (verticalCenter + topOffset)            ;            return (scrollHeight > height)              ? (startPosition + scrollHeight + paddingHeight < contextHeight)              : (height + (paddingHeight * 2) < contextHeight)            ;          }        },        is: {          active: function() {            return $module.hasClass(className.active);          },          ie: function() {            var              isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),              isIE   = ('ActiveXObject' in window)            ;            return (isIE11 || isIE);          },          animating: function() {            return $module.transition('is supported')              ? $module.transition('is animating')              : $module.is(':visible')            ;          },          scrolling: function() {            return $dimmable.hasClass(className.scrolling);          },          modernBrowser: function() {            // appName for IE11 reports 'Netscape' can no longer use            return !(window.ActiveXObject || 'ActiveXObject' in window);          }        },        set: {          autofocus: function() {            var              $inputs    = $module.find('[tabindex], :input').filter(':visible'),              $autofocus = $inputs.filter('[autofocus]'),              $input     = ($autofocus.length > 0)                ? $autofocus.first()                : $inputs.first()            ;            if($input.length > 0) {              $input.focus();            }          },          clickaway: function() {            $dimmer              .on('click' + elementEventNamespace, module.event.click)            ;          },          dimmerSettings: function() {            if($.fn.dimmer === undefined) {              module.error(error.dimmer);              return;            }            var              defaultSettings = {                debug      : settings.debug,                dimmerName : 'modals',                closable   : 'auto',                useFlex    : module.can.useFlex(),                variation  : settings.centered                  ? false                  : 'top aligned',                duration   : {                  show     : settings.duration,                  hide     : settings.duration                }              },              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)            ;            if(settings.inverted) {              dimmerSettings.variation = (dimmerSettings.variation !== undefined)                ? dimmerSettings.variation + ' inverted'                : 'inverted'              ;            }            $context.dimmer('setting', dimmerSettings);          },          dimmerStyles: function() {            if(settings.inverted) {              $dimmer.addClass(className.inverted);            }            else {              $dimmer.removeClass(className.inverted);            }            if(settings.blurring) {              $dimmable.addClass(className.blurring);            }            else {              $dimmable.removeClass(className.blurring);            }          },          modalOffset: function() {            var              width = module.cache.width,              height = module.cache.height            ;            $module              .css({                marginTop: (settings.centered && module.can.fit())                  ? -(height / 2)                  : 0,                marginLeft: -(width / 2)              })            ;            module.verbose('Setting modal offset for legacy mode');          },          screenHeight: function() {            if( module.can.fit() ) {              $body.css('height', '');            }            else {              module.debug('Modal is taller than page content, resizing page height');              $body                .css('height', module.cache.height + (settings.padding * 2) )              ;            }          },          active: function() {            $module.addClass(className.active);          },          scrolling: function() {            $dimmable.addClass(className.scrolling);            $module.addClass(className.scrolling);            module.unbind.scrollLock();          },          legacy: function() {            $module.addClass(className.legacy);          },          type: function() {            if(module.can.fit()) {              module.verbose('Modal fits on screen');              if(!module.others.active() && !module.others.animating()) {                module.remove.scrolling();                module.bind.scrollLock();              }            }            else {              module.verbose('Modal cannot fit on screen setting to scrolling');              module.set.scrolling();            }          },          undetached: function() {            $dimmable.addClass(className.undetached);          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.modal.settings = {  name           : 'Modal',  namespace      : 'modal',  useFlex        : 'auto',  offset         : 0,  silent         : false,  debug          : false,  verbose        : false,  performance    : true,  observeChanges : false,  allowMultiple  : false,  detachable     : true,  closable       : true,  autofocus      : true,  inverted       : false,  blurring       : false,  centered       : true,  dimmerSettings : {    closable : false,    useCSS   : true  },  // whether to use keyboard shortcuts  keyboardShortcuts: true,  context    : 'body',  queue      : false,  duration   : 500,  transition : 'scale',  // padding with edge of page  padding    : 50,  // called before show animation  onShow     : function(){},  // called after show animation  onVisible  : function(){},  // called before hide animation  onHide     : function(){ return true; },  // called after hide animation  onHidden   : function(){},  // called after approve selector match  onApprove  : function(){ return true; },  // called after deny selector match  onDeny     : function(){ return true; },  selector    : {    close    : '> .close',    approve  : '.actions .positive, .actions .approve, .actions .ok',    deny     : '.actions .negative, .actions .deny, .actions .cancel',    modal    : '.ui.modal'  },  error : {    dimmer    : 'UI Dimmer, a required component is not included in this page',    method    : 'The method you called is not defined.',    notFound  : 'The element you specified could not be found'  },  className : {    active     : 'active',    animating  : 'animating',    blurring   : 'blurring',    inverted   : 'inverted',    legacy     : 'legacy',    loading    : 'loading',    scrolling  : 'scrolling',    undetached : 'undetached'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Nag * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.nag = function(parameters) {  var    $allModules    = $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings          = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.nag.settings, parameters)          : $.extend({}, $.fn.nag.settings),        className       = settings.className,        selector        = settings.selector,        error           = settings.error,        namespace       = settings.namespace,        eventNamespace  = '.' + namespace,        moduleNamespace = namespace + '-module',        $module         = $(this),        $close          = $module.find(selector.close),        $context        = (settings.context)          ? $(settings.context)          : $('body'),        element         = this,        instance        = $module.data(moduleNamespace),        moduleOffset,        moduleHeight,        contextWidth,        contextHeight,        contextOffset,        yOffset,        yPosition,        timer,        module,        requestAnimationFrame = window.requestAnimationFrame          || window.mozRequestAnimationFrame          || window.webkitRequestAnimationFrame          || window.msRequestAnimationFrame          || function(callback) { setTimeout(callback, 0); }      ;      module = {        initialize: function() {          module.verbose('Initializing element');          $module            .on('click' + eventNamespace, selector.close, module.dismiss)            .data(moduleNamespace, module)          ;          if(settings.detachable && $module.parent()[0] !== $context[0]) {            $module              .detach()              .prependTo($context)            ;          }          if(settings.displayTime > 0) {            setTimeout(module.hide, settings.displayTime);          }          module.show();        },        destroy: function() {          module.verbose('Destroying instance');          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        show: function() {          if( module.should.show() && !$module.is(':visible') ) {            module.debug('Showing nag', settings.animation.show);            if(settings.animation.show == 'fade') {              $module                .fadeIn(settings.duration, settings.easing)              ;            }            else {              $module                .slideDown(settings.duration, settings.easing)              ;            }          }        },        hide: function() {          module.debug('Showing nag', settings.animation.hide);          if(settings.animation.show == 'fade') {            $module              .fadeIn(settings.duration, settings.easing)            ;          }          else {            $module              .slideUp(settings.duration, settings.easing)            ;          }        },        onHide: function() {          module.debug('Removing nag', settings.animation.hide);          $module.remove();          if (settings.onHide) {            settings.onHide();          }        },        dismiss: function(event) {          if(settings.storageMethod) {            module.storage.set(settings.key, settings.value);          }          module.hide();          event.stopImmediatePropagation();          event.preventDefault();        },        should: {          show: function() {            if(settings.persist) {              module.debug('Persistent nag is set, can show nag');              return true;            }            if( module.storage.get(settings.key) != settings.value.toString() ) {              module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));              return true;            }            module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));            return false;          }        },        get: {          storageOptions: function() {            var              options = {}            ;            if(settings.expires) {              options.expires = settings.expires;            }            if(settings.domain) {              options.domain = settings.domain;            }            if(settings.path) {              options.path = settings.path;            }            return options;          }        },        clear: function() {          module.storage.remove(settings.key);        },        storage: {          set: function(key, value) {            var              options = module.get.storageOptions()            ;            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {              window.localStorage.setItem(key, value);              module.debug('Value stored using local storage', key, value);            }            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {              window.sessionStorage.setItem(key, value);              module.debug('Value stored using session storage', key, value);            }            else if($.cookie !== undefined) {              $.cookie(key, value, options);              module.debug('Value stored using cookie', key, value, options);            }            else {              module.error(error.noCookieStorage);              return;            }          },          get: function(key, value) {            var              storedValue            ;            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {              storedValue = window.localStorage.getItem(key);            }            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {              storedValue = window.sessionStorage.getItem(key);            }            // get by cookie            else if($.cookie !== undefined) {              storedValue = $.cookie(key);            }            else {              module.error(error.noCookieStorage);            }            if(storedValue == 'undefined' || storedValue == 'null' || storedValue === undefined || storedValue === null) {              storedValue = undefined;            }            return storedValue;          },          remove: function(key) {            var              options = module.get.storageOptions()            ;            if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {              window.localStorage.removeItem(key);            }            else if(settings.storageMethod == 'sessionstorage' && window.sessionStorage !== undefined) {              window.sessionStorage.removeItem(key);            }            // store by cookie            else if($.cookie !== undefined) {              $.removeCookie(key, options);            }            else {              module.error(error.noStorage);            }          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.nag.settings = {  name        : 'Nag',  silent      : false,  debug       : false,  verbose     : false,  performance : true,  namespace   : 'Nag',  // allows cookie to be overridden  persist     : false,  // set to zero to require manually dismissal, otherwise hides on its own  displayTime : 0,  animation   : {    show : 'slide',    hide : 'slide'  },  context       : false,  detachable    : false,  expires       : 30,  domain        : false,  path          : '/',  // type of storage to use  storageMethod : 'cookie',  // value to store in dismissed localstorage/cookie  key           : 'nag',  value         : 'dismiss',  error: {    noCookieStorage : '$.cookie is not included. A storage solution is required.',    noStorage       : 'Neither $.cookie or store is defined. A storage solution is required for storing state',    method          : 'The method you called is not defined.'  },  className     : {    bottom : 'bottom',    fixed  : 'fixed'  },  selector      : {    close : '.close.icon'  },  speed         : 500,  easing        : 'easeOutQuad',  onHide: function() {}};// Adds easing$.extend( $.easing, {  easeOutQuad: function (x, t, b, c, d) {    return -c *(t/=d)*(t-2) + b;  }});})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Popup * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.popup = function(parameters) {  var    $allModules    = $(this),    $document      = $(document),    $window        = $(window),    $body          = $('body'),    moduleSelector = $allModules.selector || '',    hasTouch       = (true),    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.popup.settings, parameters)          : $.extend({}, $.fn.popup.settings),        selector           = settings.selector,        className          = settings.className,        error              = settings.error,        metadata           = settings.metadata,        namespace          = settings.namespace,        eventNamespace     = '.' + settings.namespace,        moduleNamespace    = 'module-' + namespace,        $module            = $(this),        $context           = $(settings.context),        $scrollContext     = $(settings.scrollContext),        $boundary          = $(settings.boundary),        $target            = (settings.target)          ? $(settings.target)          : $module,        $popup,        $offsetParent,        searchDepth        = 0,        triedPositions     = false,        openedWithTouch    = false,        element            = this,        instance           = $module.data(moduleNamespace),        documentObserver,        elementNamespace,        id,        module      ;      module = {        // binds events        initialize: function() {          module.debug('Initializing', $module);          module.createID();          module.bind.events();          if(!module.exists() && settings.preserve) {            module.create();          }          if(settings.observeChanges) {            module.observeChanges();          }          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance', module);          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        observeChanges: function() {          if('MutationObserver' in window) {            documentObserver = new MutationObserver(module.event.documentChanged);            documentObserver.observe(document, {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', documentObserver);          }        },        refresh: function() {          if(settings.popup) {            $popup = $(settings.popup).eq(0);          }          else {            if(settings.inline) {              $popup = $target.nextAll(selector.popup).eq(0);              settings.popup = $popup;            }          }          if(settings.popup) {            $popup.addClass(className.loading);            $offsetParent = module.get.offsetParent();            $popup.removeClass(className.loading);            if(settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) {              module.debug('Moving popup to the same offset parent as target');              $popup                .detach()                .appendTo($offsetParent)              ;            }          }          else {            $offsetParent = (settings.inline)              ? module.get.offsetParent($target)              : module.has.popup()                ? module.get.offsetParent($popup)                : $body            ;          }          if( $offsetParent.is('html') && $offsetParent[0] !== $body[0] ) {            module.debug('Setting page as offset parent');            $offsetParent = $body;          }          if( module.get.variation() ) {            module.set.variation();          }        },        reposition: function() {          module.refresh();          module.set.position();        },        destroy: function() {          module.debug('Destroying previous module');          if(documentObserver) {            documentObserver.disconnect();          }          // remove element only if was created dynamically          if($popup && !settings.preserve) {            module.removePopup();          }          // clear all timeouts          clearTimeout(module.hideTimer);          clearTimeout(module.showTimer);          // remove events          module.unbind.close();          module.unbind.events();          $module            .removeData(moduleNamespace)          ;        },        event: {          start:  function(event) {            var              delay = ($.isPlainObject(settings.delay))                ? settings.delay.show                : settings.delay            ;            clearTimeout(module.hideTimer);            if(!openedWithTouch) {              module.showTimer = setTimeout(module.show, delay);            }          },          end:  function() {            var              delay = ($.isPlainObject(settings.delay))                ? settings.delay.hide                : settings.delay            ;            clearTimeout(module.showTimer);            module.hideTimer = setTimeout(module.hide, delay);          },          touchstart: function(event) {            openedWithTouch = true;            module.show();          },          resize: function() {            if( module.is.visible() ) {              module.set.position();            }          },          documentChanged: function(mutations) {            [].forEach.call(mutations, function(mutation) {              if(mutation.removedNodes) {                [].forEach.call(mutation.removedNodes, function(node) {                  if(node == element || $(node).find(element).length > 0) {                    module.debug('Element removed from DOM, tearing down events');                    module.destroy();                  }                });              }            });          },          hideGracefully: function(event) {            var              $target = $(event.target),              isInDOM = $.contains(document.documentElement, event.target),              inPopup = ($target.closest(selector.popup).length > 0)            ;            // don't close on clicks inside popup            if(event && !inPopup && isInDOM) {              module.debug('Click occurred outside popup hiding popup');              module.hide();            }            else {              module.debug('Click was inside popup, keeping popup open');            }          }        },        // generates popup html from metadata        create: function() {          var            html      = module.get.html(),            title     = module.get.title(),            content   = module.get.content()          ;          if(html || content || title) {            module.debug('Creating pop-up html');            if(!html) {              html = settings.templates.popup({                title   : title,                content : content              });            }            $popup = $('<div/>')              .addClass(className.popup)              .data(metadata.activator, $module)              .html(html)            ;            if(settings.inline) {              module.verbose('Inserting popup element inline', $popup);              $popup                .insertAfter($module)              ;            }            else {              module.verbose('Appending popup element to body', $popup);              $popup                .appendTo( $context )              ;            }            module.refresh();            module.set.variation();            if(settings.hoverable) {              module.bind.popup();            }            settings.onCreate.call($popup, element);          }          else if($target.next(selector.popup).length !== 0) {            module.verbose('Pre-existing popup found');            settings.inline = true;            settings.popup  = $target.next(selector.popup).data(metadata.activator, $module);            module.refresh();            if(settings.hoverable) {              module.bind.popup();            }          }          else if(settings.popup) {            $(settings.popup).data(metadata.activator, $module);            module.verbose('Used popup specified in settings');            module.refresh();            if(settings.hoverable) {              module.bind.popup();            }          }          else {            module.debug('No content specified skipping display', element);          }        },        createID: function() {          id = (Math.random().toString(16) + '000000000').substr(2, 8);          elementNamespace = '.' + id;          module.verbose('Creating unique id for element', id);        },        // determines popup state        toggle: function() {          module.debug('Toggling pop-up');          if( module.is.hidden() ) {            module.debug('Popup is hidden, showing pop-up');            module.unbind.close();            module.show();          }          else {            module.debug('Popup is visible, hiding pop-up');            module.hide();          }        },        show: function(callback) {          callback = callback || function(){};          module.debug('Showing pop-up', settings.transition);          if(module.is.hidden() && !( module.is.active() && module.is.dropdown()) ) {            if( !module.exists() ) {              module.create();            }            if(settings.onShow.call($popup, element) === false) {              module.debug('onShow callback returned false, cancelling popup animation');              return;            }            else if(!settings.preserve && !settings.popup) {              module.refresh();            }            if( $popup && module.set.position() ) {              module.save.conditions();              if(settings.exclusive) {                module.hideAll();              }              module.animate.show(callback);            }          }        },        hide: function(callback) {          callback = callback || function(){};          if( module.is.visible() || module.is.animating() ) {            if(settings.onHide.call($popup, element) === false) {              module.debug('onHide callback returned false, cancelling popup animation');              return;            }            module.remove.visible();            module.unbind.close();            module.restore.conditions();            module.animate.hide(callback);          }        },        hideAll: function() {          $(selector.popup)            .filter('.' + className.popupVisible)            .each(function() {              $(this)                .data(metadata.activator)                  .popup('hide')              ;            })          ;        },        exists: function() {          if(!$popup) {            return false;          }          if(settings.inline || settings.popup) {            return ( module.has.popup() );          }          else {            return ( $popup.closest($context).length >= 1 )              ? true              : false            ;          }        },        removePopup: function() {          if( module.has.popup() && !settings.popup) {            module.debug('Removing popup', $popup);            $popup.remove();            $popup = undefined;            settings.onRemove.call($popup, element);          }        },        save: {          conditions: function() {            module.cache = {              title: $module.attr('title')            };            if (module.cache.title) {              $module.removeAttr('title');            }            module.verbose('Saving original attributes', module.cache.title);          }        },        restore: {          conditions: function() {            if(module.cache && module.cache.title) {              $module.attr('title', module.cache.title);              module.verbose('Restoring original attributes', module.cache.title);            }            return true;          }        },        supports: {          svg: function() {            return (typeof SVGGraphicsElement === 'undefined');          }        },        animate: {          show: function(callback) {            callback = $.isFunction(callback) ? callback : function(){};            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {              module.set.visible();              $popup                .transition({                  animation  : settings.transition + ' in',                  queue      : false,                  debug      : settings.debug,                  verbose    : settings.verbose,                  duration   : settings.duration,                  onComplete : function() {                    module.bind.close();                    callback.call($popup, element);                    settings.onVisible.call($popup, element);                  }                })              ;            }            else {              module.error(error.noTransition);            }          },          hide: function(callback) {            callback = $.isFunction(callback) ? callback : function(){};            module.debug('Hiding pop-up');            if(settings.onHide.call($popup, element) === false) {              module.debug('onHide callback returned false, cancelling popup animation');              return;            }            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {              $popup                .transition({                  animation  : settings.transition + ' out',                  queue      : false,                  duration   : settings.duration,                  debug      : settings.debug,                  verbose    : settings.verbose,                  onComplete : function() {                    module.reset();                    callback.call($popup, element);                    settings.onHidden.call($popup, element);                  }                })              ;            }            else {              module.error(error.noTransition);            }          }        },        change: {          content: function(html) {            $popup.html(html);          }        },        get: {          html: function() {            $module.removeData(metadata.html);            return $module.data(metadata.html) || settings.html;          },          title: function() {            $module.removeData(metadata.title);            return $module.data(metadata.title) || settings.title;          },          content: function() {            $module.removeData(metadata.content);            return $module.data(metadata.content) || settings.content || $module.attr('title');          },          variation: function() {            $module.removeData(metadata.variation);            return $module.data(metadata.variation) || settings.variation;          },          popup: function() {            return $popup;          },          popupOffset: function() {            return $popup.offset();          },          calculations: function() {            var              $popupOffsetParent = module.get.offsetParent($popup),              targetElement      = $target[0],              isWindow           = ($boundary[0] == window),              targetPosition     = (settings.inline || (settings.popup && settings.movePopup))                ? $target.position()                : $target.offset(),              screenPosition = (isWindow)                ? { top: 0, left: 0 }                : $boundary.offset(),              calculations   = {},              scroll = (isWindow)                ? { top: $window.scrollTop(), left: $window.scrollLeft() }                : { top: 0, left: 0},              screen            ;            calculations = {              // element which is launching popup              target : {                element : $target[0],                width   : $target.outerWidth(),                height  : $target.outerHeight(),                top     : targetPosition.top,                left    : targetPosition.left,                margin  : {}              },              // popup itself              popup : {                width  : $popup.outerWidth(),                height : $popup.outerHeight()              },              // offset container (or 3d context)              parent : {                width  : $offsetParent.outerWidth(),                height : $offsetParent.outerHeight()              },              // screen boundaries              screen : {                top  : screenPosition.top,                left : screenPosition.left,                scroll: {                  top  : scroll.top,                  left : scroll.left                },                width  : $boundary.width(),                height : $boundary.height()              }            };            // if popup offset context is not same as target, then adjust calculations            if($popupOffsetParent.get(0) !== $offsetParent.get(0)) {              var                popupOffset        = $popupOffsetParent.offset()              ;              calculations.target.top -= popupOffset.top;              calculations.target.left -= popupOffset.left;              calculations.parent.width = $popupOffsetParent.outerWidth();              calculations.parent.height = $popupOffsetParent.outerHeight();            }            // add in container calcs if fluid            if( settings.setFluidWidth && module.is.fluid() ) {              calculations.container = {                width: $popup.parent().outerWidth()              };              calculations.popup.width = calculations.container.width;            }            // add in margins if inline            calculations.target.margin.top = (settings.inline)              ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10)              : 0            ;            calculations.target.margin.left = (settings.inline)              ? module.is.rtl()                ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)                : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)              : 0            ;            // calculate screen boundaries            screen = calculations.screen;            calculations.boundary = {              top    : screen.top + screen.scroll.top,              bottom : screen.top + screen.scroll.top + screen.height,              left   : screen.left + screen.scroll.left,              right  : screen.left + screen.scroll.left + screen.width            };            return calculations;          },          id: function() {            return id;          },          startEvent: function() {            if(settings.on == 'hover') {              return 'mouseenter';            }            else if(settings.on == 'focus') {              return 'focus';            }            return false;          },          scrollEvent: function() {            return 'scroll';          },          endEvent: function() {            if(settings.on == 'hover') {              return 'mouseleave';            }            else if(settings.on == 'focus') {              return 'blur';            }            return false;          },          distanceFromBoundary: function(offset, calculations) {            var              distanceFromBoundary = {},              popup,              boundary            ;            calculations = calculations || module.get.calculations();            // shorthand            popup        = calculations.popup;            boundary     = calculations.boundary;            if(offset) {              distanceFromBoundary = {                top    : (offset.top - boundary.top),                left   : (offset.left - boundary.left),                right  : (boundary.right - (offset.left + popup.width) ),                bottom : (boundary.bottom - (offset.top + popup.height) )              };              module.verbose('Distance from boundaries determined', offset, distanceFromBoundary);            }            return distanceFromBoundary;          },          offsetParent: function($element) {            var              element = ($element !== undefined)                ? $element[0]                : $target[0],              parentNode = element.parentNode,              $node    = $(parentNode)            ;            if(parentNode) {              var                is2D     = ($node.css('transform') === 'none'),                isStatic = ($node.css('position') === 'static'),                isBody   = $node.is('body')              ;              while(parentNode && !isBody && isStatic && is2D) {                parentNode = parentNode.parentNode;                $node    = $(parentNode);                is2D     = ($node.css('transform') === 'none');                isStatic = ($node.css('position') === 'static');                isBody   = $node.is('body');              }            }            return ($node && $node.length > 0)              ? $node              : $()            ;          },          positions: function() {            return {              'top left'      : false,              'top center'    : false,              'top right'     : false,              'bottom left'   : false,              'bottom center' : false,              'bottom right'  : false,              'left center'   : false,              'right center'  : false            };          },          nextPosition: function(position) {            var              positions          = position.split(' '),              verticalPosition   = positions[0],              horizontalPosition = positions[1],              opposite = {                top    : 'bottom',                bottom : 'top',                left   : 'right',                right  : 'left'              },              adjacent = {                left   : 'center',                center : 'right',                right  : 'left'              },              backup = {                'top left'      : 'top center',                'top center'    : 'top right',                'top right'     : 'right center',                'right center'  : 'bottom right',                'bottom right'  : 'bottom center',                'bottom center' : 'bottom left',                'bottom left'   : 'left center',                'left center'   : 'top left'              },              adjacentsAvailable = (verticalPosition == 'top' || verticalPosition == 'bottom'),              oppositeTried = false,              adjacentTried = false,              nextPosition  = false            ;            if(!triedPositions) {              module.verbose('All available positions available');              triedPositions = module.get.positions();            }            module.debug('Recording last position tried', position);            triedPositions[position] = true;            if(settings.prefer === 'opposite') {              nextPosition  = [opposite[verticalPosition], horizontalPosition];              nextPosition  = nextPosition.join(' ');              oppositeTried = (triedPositions[nextPosition] === true);              module.debug('Trying opposite strategy', nextPosition);            }            if((settings.prefer === 'adjacent') && adjacentsAvailable ) {              nextPosition  = [verticalPosition, adjacent[horizontalPosition]];              nextPosition  = nextPosition.join(' ');              adjacentTried = (triedPositions[nextPosition] === true);              module.debug('Trying adjacent strategy', nextPosition);            }            if(adjacentTried || oppositeTried) {              module.debug('Using backup position', nextPosition);              nextPosition = backup[position];            }            return nextPosition;          }        },        set: {          position: function(position, calculations) {            // exit conditions            if($target.length === 0 || $popup.length === 0) {              module.error(error.notFound);              return;            }            var              offset,              distanceAway,              target,              popup,              parent,              positioning,              popupOffset,              distanceFromBoundary            ;            calculations = calculations || module.get.calculations();            position     = position     || $module.data(metadata.position) || settings.position;            offset       = $module.data(metadata.offset) || settings.offset;            distanceAway = settings.distanceAway;            // shorthand            target = calculations.target;            popup  = calculations.popup;            parent = calculations.parent;            if(module.should.centerArrow(calculations)) {              module.verbose('Adjusting offset to center arrow on small target element');              if(position == 'top left' || position == 'bottom left') {                offset += (target.width / 2)                offset -= settings.arrowPixelsFromEdge;              }              if(position == 'top right' || position == 'bottom right') {                offset -= (target.width / 2)                offset += settings.arrowPixelsFromEdge;              }            }            if(target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {              module.debug('Popup target is hidden, no action taken');              return false;            }            if(settings.inline) {              module.debug('Adding margin to calculation', target.margin);              if(position == 'left center' || position == 'right center') {                offset       +=  target.margin.top;                distanceAway += -target.margin.left;              }              else if (position == 'top left' || position == 'top center' || position == 'top right') {                offset       += target.margin.left;                distanceAway -= target.margin.top;              }              else {                offset       += target.margin.left;                distanceAway += target.margin.top;              }            }            module.debug('Determining popup position from calculations', position, calculations);            if (module.is.rtl()) {              position = position.replace(/left|right/g, function (match) {                return (match == 'left')                  ? 'right'                  : 'left'                ;              });              module.debug('RTL: Popup position updated', position);            }            // if last attempt use specified last resort position            if(searchDepth == settings.maxSearchDepth && typeof settings.lastResort === 'string') {              position = settings.lastResort;            }            switch (position) {              case 'top left':                positioning = {                  top    : 'auto',                  bottom : parent.height - target.top + distanceAway,                  left   : target.left + offset,                  right  : 'auto'                };              break;              case 'top center':                positioning = {                  bottom : parent.height - target.top + distanceAway,                  left   : target.left + (target.width / 2) - (popup.width / 2) + offset,                  top    : 'auto',                  right  : 'auto'                };              break;              case 'top right':                positioning = {                  bottom :  parent.height - target.top + distanceAway,                  right  :  parent.width - target.left - target.width - offset,                  top    : 'auto',                  left   : 'auto'                };              break;              case 'left center':                positioning = {                  top    : target.top + (target.height / 2) - (popup.height / 2) + offset,                  right  : parent.width - target.left + distanceAway,                  left   : 'auto',                  bottom : 'auto'                };              break;              case 'right center':                positioning = {                  top    : target.top + (target.height / 2) - (popup.height / 2) + offset,                  left   : target.left + target.width + distanceAway,                  bottom : 'auto',                  right  : 'auto'                };              break;              case 'bottom left':                positioning = {                  top    : target.top + target.height + distanceAway,                  left   : target.left + offset,                  bottom : 'auto',                  right  : 'auto'                };              break;              case 'bottom center':                positioning = {                  top    : target.top + target.height + distanceAway,                  left   : target.left + (target.width / 2) - (popup.width / 2) + offset,                  bottom : 'auto',                  right  : 'auto'                };              break;              case 'bottom right':                positioning = {                  top    : target.top + target.height + distanceAway,                  right  : parent.width - target.left  - target.width - offset,                  left   : 'auto',                  bottom : 'auto'                };              break;            }            if(positioning === undefined) {              module.error(error.invalidPosition, position);            }            module.debug('Calculated popup positioning values', positioning);            // tentatively place on stage            $popup              .css(positioning)              .removeClass(className.position)              .addClass(position)              .addClass(className.loading)            ;            popupOffset = module.get.popupOffset();            // see if any boundaries are surpassed with this tentative position            distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations);            if( module.is.offstage(distanceFromBoundary, position) ) {              module.debug('Position is outside viewport', position);              if(searchDepth < settings.maxSearchDepth) {                searchDepth++;                position = module.get.nextPosition(position);                module.debug('Trying new position', position);                return ($popup)                  ? module.set.position(position, calculations)                  : false                ;              }              else {                if(settings.lastResort) {                  module.debug('No position found, showing with last position');                }                else {                  module.debug('Popup could not find a position to display', $popup);                  module.error(error.cannotPlace, element);                  module.remove.attempts();                  module.remove.loading();                  module.reset();                  settings.onUnplaceable.call($popup, element);                  return false;                }              }            }            module.debug('Position is on stage', position);            module.remove.attempts();            module.remove.loading();            if( settings.setFluidWidth && module.is.fluid() ) {              module.set.fluidWidth(calculations);            }            return true;          },          fluidWidth: function(calculations) {            calculations = calculations || module.get.calculations();            module.debug('Automatically setting element width to parent width', calculations.parent.width);            $popup.css('width', calculations.container.width);          },          variation: function(variation) {            variation = variation || module.get.variation();            if(variation && module.has.popup() ) {              module.verbose('Adding variation to popup', variation);              $popup.addClass(variation);            }          },          visible: function() {            $module.addClass(className.visible);          }        },        remove: {          loading: function() {            $popup.removeClass(className.loading);          },          variation: function(variation) {            variation = variation || module.get.variation();            if(variation) {              module.verbose('Removing variation', variation);              $popup.removeClass(variation);            }          },          visible: function() {            $module.removeClass(className.visible);          },          attempts: function() {            module.verbose('Resetting all searched positions');            searchDepth    = 0;            triedPositions = false;          }        },        bind: {          events: function() {            module.debug('Binding popup events to module');            if(settings.on == 'click') {              $module                .on('click' + eventNamespace, module.toggle)              ;            }            if(settings.on == 'hover' && hasTouch) {              $module                .on('touchstart' + eventNamespace, module.event.touchstart)              ;            }            if( module.get.startEvent() ) {              $module                .on(module.get.startEvent() + eventNamespace, module.event.start)                .on(module.get.endEvent() + eventNamespace, module.event.end)              ;            }            if(settings.target) {              module.debug('Target set to element', $target);            }            $window.on('resize' + elementNamespace, module.event.resize);          },          popup: function() {            module.verbose('Allowing hover events on popup to prevent closing');            if( $popup && module.has.popup() ) {              $popup                .on('mouseenter' + eventNamespace, module.event.start)                .on('mouseleave' + eventNamespace, module.event.end)              ;            }          },          close: function() {            if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {              module.bind.closeOnScroll();            }            if(module.is.closable()) {              module.bind.clickaway();            }            else if(settings.on == 'hover' && openedWithTouch) {              module.bind.touchClose();            }          },          closeOnScroll: function() {            module.verbose('Binding scroll close event to document');            $scrollContext              .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)            ;          },          touchClose: function() {            module.verbose('Binding popup touchclose event to document');            $document              .on('touchstart' + elementNamespace, function(event) {                module.verbose('Touched away from popup');                module.event.hideGracefully.call(element, event);              })            ;          },          clickaway: function() {            module.verbose('Binding popup close event to document');            $document              .on('click' + elementNamespace, function(event) {                module.verbose('Clicked away from popup');                module.event.hideGracefully.call(element, event);              })            ;          }        },        unbind: {          events: function() {            $window              .off(elementNamespace)            ;            $module              .off(eventNamespace)            ;          },          close: function() {            $document              .off(elementNamespace)            ;            $scrollContext              .off(elementNamespace)            ;          },        },        has: {          popup: function() {            return ($popup && $popup.length > 0);          }        },        should: {          centerArrow: function(calculations) {            return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2);          },        },        is: {          closable: function() {            if(settings.closable == 'auto') {              if(settings.on == 'hover') {                return false;              }              return true;            }            return settings.closable;          },          offstage: function(distanceFromBoundary, position) {            var              offstage = []            ;            // return boundaries that have been surpassed            $.each(distanceFromBoundary, function(direction, distance) {              if(distance < -settings.jitter) {                module.debug('Position exceeds allowable distance from edge', direction, distance, position);                offstage.push(direction);              }            });            if(offstage.length > 0) {              return true;            }            else {              return false;            }          },          svg: function(element) {            return module.supports.svg() && (element instanceof SVGGraphicsElement);          },          basic: function() {            return $module.hasClass(className.basic);          },          active: function() {            return $module.hasClass(className.active);          },          animating: function() {            return ($popup !== undefined && $popup.hasClass(className.animating) );          },          fluid: function() {            return ($popup !== undefined && $popup.hasClass(className.fluid));          },          visible: function() {            return ($popup !== undefined && $popup.hasClass(className.popupVisible));          },          dropdown: function() {            return $module.hasClass(className.dropdown);          },          hidden: function() {            return !module.is.visible();          },          rtl: function () {            return $module.css('direction') == 'rtl';          }        },        reset: function() {          module.remove.visible();          if(settings.preserve) {            if($.fn.transition !== undefined) {              $popup                .transition('remove transition')              ;            }          }          else {            module.removePopup();          }        },        setting: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            settings[name] = value;          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.popup.settings = {  name           : 'Popup',  // module settings  silent         : false,  debug          : false,  verbose        : false,  performance    : true,  namespace      : 'popup',  // whether it should use dom mutation observers  observeChanges : true,  // callback only when element added to dom  onCreate       : function(){},  // callback before element removed from dom  onRemove       : function(){},  // callback before show animation  onShow         : function(){},  // callback after show animation  onVisible      : function(){},  // callback before hide animation  onHide         : function(){},  // callback when popup cannot be positioned in visible screen  onUnplaceable  : function(){},  // callback after hide animation  onHidden       : function(){},  // when to show popup  on             : 'hover',  // element to use to determine if popup is out of boundary  boundary       : window,  // whether to add touchstart events when using hover  addTouchEvents : true,  // default position relative to element  position       : 'top left',  // name of variation to use  variation      : '',  // whether popup should be moved to context  movePopup      : true,  // element which popup should be relative to  target         : false,  // jq selector or element that should be used as popup  popup          : false,  // popup should remain inline next to activator  inline         : false,  // popup should be removed from page on hide  preserve       : false,  // popup should not close when being hovered on  hoverable      : false,  // explicitly set content  content        : false,  // explicitly set html  html           : false,  // explicitly set title  title          : false,  // whether automatically close on clickaway when on click  closable       : true,  // automatically hide on scroll  hideOnScroll   : 'auto',  // hide other popups on show  exclusive      : false,  // context to attach popups  context        : 'body',  // context for binding scroll events  scrollContext  : window,  // position to prefer when calculating new position  prefer         : 'opposite',  // specify position to appear even if it doesn't fit  lastResort     : false,  // number of pixels from edge of popup to pointing arrow center (used from centering)  arrowPixelsFromEdge: 20,  // delay used to prevent accidental refiring of animations due to user error  delay : {    show : 50,    hide : 70  },  // whether fluid variation should assign width explicitly  setFluidWidth  : true,  // transition settings  duration       : 200,  transition     : 'scale',  // distance away from activating element in px  distanceAway   : 0,  // number of pixels an element is allowed to be "offstage" for a position to be chosen (allows for rounding)  jitter         : 2,  // offset on aligning axis from calculated position  offset         : 0,  // maximum times to look for a position before failing (9 positions total)  maxSearchDepth : 15,  error: {    invalidPosition : 'The position you specified is not a valid position',    cannotPlace     : 'Popup does not fit within the boundaries of the viewport',    method          : 'The method you called is not defined.',    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>',    notFound        : 'The target or popup you specified does not exist on the page'  },  metadata: {    activator : 'activator',    content   : 'content',    html      : 'html',    offset    : 'offset',    position  : 'position',    title     : 'title',    variation : 'variation'  },  className   : {    active       : 'active',    basic        : 'basic',    animating    : 'animating',    dropdown     : 'dropdown',    fluid        : 'fluid',    loading      : 'loading',    popup        : 'ui popup',    position     : 'top left center bottom right',    visible      : 'visible',    popupVisible : 'visible'  },  selector    : {    popup    : '.ui.popup'  },  templates: {    escape: function(string) {      var        badChars     = /[&<>"'`]/g,        shouldEscape = /[&<>"'`]/,        escape       = {          "&": "&",          "<": "<",          ">": ">",          '"': """,          "'": "'",          "`": "`"        },        escapedChar  = function(chr) {          return escape[chr];        }      ;      if(shouldEscape.test(string)) {        return string.replace(badChars, escapedChar);      }      return string;    },    popup: function(text) {      var        html   = '',        escape = $.fn.popup.settings.templates.escape      ;      if(typeof text !== undefined) {        if(typeof text.title !== undefined && text.title) {          text.title = escape(text.title);          html += '<div class="header">' + text.title + '</div>';        }        if(typeof text.content !== undefined && text.content) {          text.content = escape(text.content);          html += '<div class="content">' + text.content + '</div>';        }      }      return html;    }  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Progress * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();var  global = (typeof window != 'undefined' && window.Math == Math)    ? window    : (typeof self != 'undefined' && self.Math == Math)      ? self      : Function('return this')();$.fn.progress = function(parameters) {  var    $allModules    = $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings          = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.progress.settings, parameters)          : $.extend({}, $.fn.progress.settings),        className       = settings.className,        metadata        = settings.metadata,        namespace       = settings.namespace,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $module         = $(this),        $bar            = $(this).find(selector.bar),        $progress       = $(this).find(selector.progress),        $label          = $(this).find(selector.label),        element         = this,        instance        = $module.data(moduleNamespace),        animating = false,        transitionEnd,        module      ;      module = {        initialize: function() {          module.debug('Initializing progress bar', settings);          module.set.duration();          module.set.transitionEvent();          module.read.metadata();          module.read.settings();          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of progress', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous progress for', $module);          clearInterval(instance.interval);          module.remove.state();          $module.removeData(moduleNamespace);          instance = undefined;        },        reset: function() {          module.remove.nextValue();          module.update.progress(0);        },        complete: function() {          if(module.percent === undefined || module.percent < 100) {            module.remove.progressPoll();            module.set.percent(100);          }        },        read: {          metadata: function() {            var              data = {                percent : $module.data(metadata.percent),                total   : $module.data(metadata.total),                value   : $module.data(metadata.value)              }            ;            if(data.percent) {              module.debug('Current percent value set from metadata', data.percent);              module.set.percent(data.percent);            }            if(data.total) {              module.debug('Total value set from metadata', data.total);              module.set.total(data.total);            }            if(data.value) {              module.debug('Current value set from metadata', data.value);              module.set.value(data.value);              module.set.progress(data.value);            }          },          settings: function() {            if(settings.total !== false) {              module.debug('Current total set in settings', settings.total);              module.set.total(settings.total);            }            if(settings.value !== false) {              module.debug('Current value set in settings', settings.value);              module.set.value(settings.value);              module.set.progress(module.value);            }            if(settings.percent !== false) {              module.debug('Current percent set in settings', settings.percent);              module.set.percent(settings.percent);            }          }        },        bind: {          transitionEnd: function(callback) {            var              transitionEnd = module.get.transitionEnd()            ;            $bar              .one(transitionEnd + eventNamespace, function(event) {                clearTimeout(module.failSafeTimer);                callback.call(this, event);              })            ;            module.failSafeTimer = setTimeout(function() {              $bar.triggerHandler(transitionEnd);            }, settings.duration + settings.failSafeDelay);            module.verbose('Adding fail safe timer', module.timer);          }        },        increment: function(incrementValue) {          var            maxValue,            startValue,            newValue          ;          if( module.has.total() ) {            startValue     = module.get.value();            incrementValue = incrementValue || 1;            newValue       = startValue + incrementValue;          }          else {            startValue     = module.get.percent();            incrementValue = incrementValue || module.get.randomValue();            newValue       = startValue + incrementValue;            maxValue       = 100;            module.debug('Incrementing percentage by', startValue, newValue);          }          newValue = module.get.normalizedValue(newValue);          module.set.progress(newValue);        },        decrement: function(decrementValue) {          var            total     = module.get.total(),            startValue,            newValue          ;          if(total) {            startValue     =  module.get.value();            decrementValue =  decrementValue || 1;            newValue       =  startValue - decrementValue;            module.debug('Decrementing value by', decrementValue, startValue);          }          else {            startValue     =  module.get.percent();            decrementValue =  decrementValue || module.get.randomValue();            newValue       =  startValue - decrementValue;            module.debug('Decrementing percentage by', decrementValue, startValue);          }          newValue = module.get.normalizedValue(newValue);          module.set.progress(newValue);        },        has: {          progressPoll: function() {            return module.progressPoll;          },          total: function() {            return (module.get.total() !== false);          }        },        get: {          text: function(templateText) {            var              value   = module.value                || 0,              total   = module.total                || 0,              percent = (animating)                ? module.get.displayPercent()                : module.percent || 0,              left = (module.total > 0)                ? (total - value)                : (100 - percent)            ;            templateText = templateText || '';            templateText = templateText              .replace('{value}', value)              .replace('{total}', total)              .replace('{left}', left)              .replace('{percent}', percent)            ;            module.verbose('Adding variables to progress bar text', templateText);            return templateText;          },          normalizedValue: function(value) {            if(value < 0) {              module.debug('Value cannot decrement below 0');              return 0;            }            if(module.has.total()) {              if(value > module.total) {                module.debug('Value cannot increment above total', module.total);                return module.total;              }            }            else if(value > 100 ) {              module.debug('Value cannot increment above 100 percent');              return 100;            }            return value;          },          updateInterval: function() {            if(settings.updateInterval == 'auto') {              return settings.duration;            }            return settings.updateInterval;          },          randomValue: function() {            module.debug('Generating random increment percentage');            return Math.floor((Math.random() * settings.random.max) + settings.random.min);          },          numericValue: function(value) {            return (typeof value === 'string')              ? (value.replace(/[^\d.]/g, '') !== '')                ? +(value.replace(/[^\d.]/g, ''))                : false              : value            ;          },          transitionEnd: function() {            var              element     = document.createElement('element'),              transitions = {                'transition'       :'transitionend',                'OTransition'      :'oTransitionEnd',                'MozTransition'    :'transitionend',                'WebkitTransition' :'webkitTransitionEnd'              },              transition            ;            for(transition in transitions){              if( element.style[transition] !== undefined ){                return transitions[transition];              }            }          },          // gets current displayed percentage (if animating values this is the intermediary value)          displayPercent: function() {            var              barWidth       = $bar.width(),              totalWidth     = $module.width(),              minDisplay     = parseInt($bar.css('min-width'), 10),              displayPercent = (barWidth > minDisplay)                ? (barWidth / totalWidth * 100)                : module.percent            ;            return (settings.precision > 0)              ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision)              : Math.round(displayPercent)            ;          },          percent: function() {            return module.percent || 0;          },          value: function() {            return module.nextValue || module.value || 0;          },          total: function() {            return module.total || false;          }        },        create: {          progressPoll: function() {            module.progressPoll = setTimeout(function() {              module.update.toNextValue();              module.remove.progressPoll();            }, module.get.updateInterval());          },        },        is: {          complete: function() {            return module.is.success() || module.is.warning() || module.is.error();          },          success: function() {            return $module.hasClass(className.success);          },          warning: function() {            return $module.hasClass(className.warning);          },          error: function() {            return $module.hasClass(className.error);          },          active: function() {            return $module.hasClass(className.active);          },          visible: function() {            return $module.is(':visible');          }        },        remove: {          progressPoll: function() {            module.verbose('Removing progress poll timer');            if(module.progressPoll) {              clearTimeout(module.progressPoll);              delete module.progressPoll;            }          },          nextValue: function() {            module.verbose('Removing progress value stored for next update');            delete module.nextValue;          },          state: function() {            module.verbose('Removing stored state');            delete module.total;            delete module.percent;            delete module.value;          },          active: function() {            module.verbose('Removing active state');            $module.removeClass(className.active);          },          success: function() {            module.verbose('Removing success state');            $module.removeClass(className.success);          },          warning: function() {            module.verbose('Removing warning state');            $module.removeClass(className.warning);          },          error: function() {            module.verbose('Removing error state');            $module.removeClass(className.error);          }        },        set: {          barWidth: function(value) {            if(value > 100) {              module.error(error.tooHigh, value);            }            else if (value < 0) {              module.error(error.tooLow, value);            }            else {              $bar                .css('width', value + '%')              ;              $module                .attr('data-percent', parseInt(value, 10))              ;            }          },          duration: function(duration) {            duration = duration || settings.duration;            duration = (typeof duration == 'number')              ? duration + 'ms'              : duration            ;            module.verbose('Setting progress bar transition duration', duration);            $bar              .css({                'transition-duration':  duration              })            ;          },          percent: function(percent) {            percent = (typeof percent == 'string')              ? +(percent.replace('%', ''))              : percent            ;            // round display percentage            percent = (settings.precision > 0)              ? Math.round(percent * (10 * settings.precision)) / (10 * settings.precision)              : Math.round(percent)            ;            module.percent = percent;            if( !module.has.total() ) {              module.value = (settings.precision > 0)                ? Math.round( (percent / 100) * module.total * (10 * settings.precision)) / (10 * settings.precision)                : Math.round( (percent / 100) * module.total * 10) / 10              ;              if(settings.limitValues) {                module.value = (module.value > 100)                  ? 100                  : (module.value < 0)                    ? 0                    : module.value                ;              }            }            module.set.barWidth(percent);            module.set.labelInterval();            module.set.labels();            settings.onChange.call(element, percent, module.value, module.total);          },          labelInterval: function() {            var              animationCallback = function() {                module.verbose('Bar finished animating, removing continuous label updates');                clearInterval(module.interval);                animating = false;                module.set.labels();              }            ;            clearInterval(module.interval);            module.bind.transitionEnd(animationCallback);            animating = true;            module.interval = setInterval(function() {              var                isInDOM = $.contains(document.documentElement, element)              ;              if(!isInDOM) {                clearInterval(module.interval);                animating = false;              }              module.set.labels();            }, settings.framerate);          },          labels: function() {            module.verbose('Setting both bar progress and outer label text');            module.set.barLabel();            module.set.state();          },          label: function(text) {            text = text || '';            if(text) {              text = module.get.text(text);              module.verbose('Setting label to text', text);              $label.text(text);            }          },          state: function(percent) {            percent = (percent !== undefined)              ? percent              : module.percent            ;            if(percent === 100) {              if(settings.autoSuccess && !(module.is.warning() || module.is.error() || module.is.success())) {                module.set.success();                module.debug('Automatically triggering success at 100%');              }              else {                module.verbose('Reached 100% removing active state');                module.remove.active();                module.remove.progressPoll();              }            }            else if(percent > 0) {              module.verbose('Adjusting active progress bar label', percent);              module.set.active();            }            else {              module.remove.active();              module.set.label(settings.text.active);            }          },          barLabel: function(text) {            if(text !== undefined) {              $progress.text( module.get.text(text) );            }            else if(settings.label == 'ratio' && module.total) {              module.verbose('Adding ratio to bar label');              $progress.text( module.get.text(settings.text.ratio) );            }            else if(settings.label == 'percent') {              module.verbose('Adding percentage to bar label');              $progress.text( module.get.text(settings.text.percent) );            }          },          active: function(text) {            text = text || settings.text.active;            module.debug('Setting active state');            if(settings.showActivity && !module.is.active() ) {              $module.addClass(className.active);            }            module.remove.warning();            module.remove.error();            module.remove.success();            text = settings.onLabelUpdate('active', text, module.value, module.total);            if(text) {              module.set.label(text);            }            module.bind.transitionEnd(function() {              settings.onActive.call(element, module.value, module.total);            });          },          success : function(text) {            text = text || settings.text.success || settings.text.active;            module.debug('Setting success state');            $module.addClass(className.success);            module.remove.active();            module.remove.warning();            module.remove.error();            module.complete();            if(settings.text.success) {              text = settings.onLabelUpdate('success', text, module.value, module.total);              module.set.label(text);            }            else {              text = settings.onLabelUpdate('active', text, module.value, module.total);              module.set.label(text);            }            module.bind.transitionEnd(function() {              settings.onSuccess.call(element, module.total);            });          },          warning : function(text) {            text = text || settings.text.warning;            module.debug('Setting warning state');            $module.addClass(className.warning);            module.remove.active();            module.remove.success();            module.remove.error();            module.complete();            text = settings.onLabelUpdate('warning', text, module.value, module.total);            if(text) {              module.set.label(text);            }            module.bind.transitionEnd(function() {              settings.onWarning.call(element, module.value, module.total);            });          },          error : function(text) {            text = text || settings.text.error;            module.debug('Setting error state');            $module.addClass(className.error);            module.remove.active();            module.remove.success();            module.remove.warning();            module.complete();            text = settings.onLabelUpdate('error', text, module.value, module.total);            if(text) {              module.set.label(text);            }            module.bind.transitionEnd(function() {              settings.onError.call(element, module.value, module.total);            });          },          transitionEvent: function() {            transitionEnd = module.get.transitionEnd();          },          total: function(totalValue) {            module.total = totalValue;          },          value: function(value) {            module.value = value;          },          progress: function(value) {            if(!module.has.progressPoll()) {              module.debug('First update in progress update interval, immediately updating', value);              module.update.progress(value);              module.create.progressPoll();            }            else {              module.debug('Updated within interval, setting next update to use new value', value);              module.set.nextValue(value);            }          },          nextValue: function(value) {            module.nextValue = value;          }        },        update: {          toNextValue: function() {            var              nextValue = module.nextValue            ;            if(nextValue) {              module.debug('Update interval complete using last updated value', nextValue);              module.update.progress(nextValue);              module.remove.nextValue();            }          },          progress: function(value) {            var              percentComplete            ;            value = module.get.numericValue(value);            if(value === false) {              module.error(error.nonNumeric, value);            }            value = module.get.normalizedValue(value);            if( module.has.total() ) {              module.set.value(value);              percentComplete = (value / module.total) * 100;              module.debug('Calculating percent complete from total', percentComplete);              module.set.percent( percentComplete );            }            else {              percentComplete = value;              module.debug('Setting value to exact percentage value', percentComplete);              module.set.percent( percentComplete );            }          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.progress.settings = {  name         : 'Progress',  namespace    : 'progress',  silent       : false,  debug        : false,  verbose      : false,  performance  : true,  random       : {    min : 2,    max : 5  },  duration       : 300,  updateInterval : 'auto',  autoSuccess    : true,  showActivity   : true,  limitValues    : true,  label          : 'percent',  precision      : 0,  framerate      : (1000 / 30), /// 30 fps  percent        : false,  total          : false,  value          : false,  // delay in ms for fail safe animation callback  failSafeDelay : 100,  onLabelUpdate : function(state, text, value, total){    return text;  },  onChange      : function(percent, value, total){},  onSuccess     : function(total){},  onActive      : function(value, total){},  onError       : function(value, total){},  onWarning     : function(value, total){},  error    : {    method     : 'The method you called is not defined.',    nonNumeric : 'Progress value is non numeric',    tooHigh    : 'Value specified is above 100%',    tooLow     : 'Value specified is below 0%'  },  regExp: {    variable: /\{\$*[A-z0-9]+\}/g  },  metadata: {    percent : 'percent',    total   : 'total',    value   : 'value'  },  selector : {    bar      : '> .bar',    label    : '> .label',    progress : '.bar > .progress'  },  text : {    active  : false,    error   : false,    success : false,    warning : false,    percent : '{percent}%',    ratio   : '{value} of {total}'  },  className : {    active  : 'active',    error   : 'error',    success : 'success',    warning : 'warning'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Rating * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.rating = function(parameters) {  var    $allModules     = $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.rating.settings, parameters)          : $.extend({}, $.fn.rating.settings),        namespace       = settings.namespace,        className       = settings.className,        metadata        = settings.metadata,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        element         = this,        instance        = $(this).data(moduleNamespace),        $module         = $(this),        $icon           = $module.find(selector.icon),        initialLoad,        module      ;      module = {        initialize: function() {          module.verbose('Initializing rating module', settings);          if($icon.length === 0) {            module.setup.layout();          }          if(settings.interactive) {            module.enable();          }          else {            module.disable();          }          module.set.initialLoad();          module.set.rating( module.get.initialRating() );          module.remove.initialLoad();          module.instantiate();        },        instantiate: function() {          module.verbose('Instantiating module', settings);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous instance', instance);          module.remove.events();          $module            .removeData(moduleNamespace)          ;        },        refresh: function() {          $icon   = $module.find(selector.icon);        },        setup: {          layout: function() {            var              maxRating = module.get.maxRating(),              html      = $.fn.rating.settings.templates.icon(maxRating)            ;            module.debug('Generating icon html dynamically');            $module              .html(html)            ;            module.refresh();          }        },        event: {          mouseenter: function() {            var              $activeIcon = $(this)            ;            $activeIcon              .nextAll()                .removeClass(className.selected)            ;            $module              .addClass(className.selected)            ;            $activeIcon              .addClass(className.selected)                .prevAll()                .addClass(className.selected)            ;          },          mouseleave: function() {            $module              .removeClass(className.selected)            ;            $icon              .removeClass(className.selected)            ;          },          click: function() {            var              $activeIcon   = $(this),              currentRating = module.get.rating(),              rating        = $icon.index($activeIcon) + 1,              canClear      = (settings.clearable == 'auto')               ? ($icon.length === 1)               : settings.clearable            ;            if(canClear && currentRating == rating) {              module.clearRating();            }            else {              module.set.rating( rating );            }          }        },        clearRating: function() {          module.debug('Clearing current rating');          module.set.rating(0);        },        bind: {          events: function() {            module.verbose('Binding events');            $module              .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter)              .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave)              .on('click'      + eventNamespace, selector.icon, module.event.click)            ;          }        },        remove: {          events: function() {            module.verbose('Removing events');            $module              .off(eventNamespace)            ;          },          initialLoad: function() {            initialLoad = false;          }        },        enable: function() {          module.debug('Setting rating to interactive mode');          module.bind.events();          $module            .removeClass(className.disabled)          ;        },        disable: function() {          module.debug('Setting rating to read-only mode');          module.remove.events();          $module            .addClass(className.disabled)          ;        },        is: {          initialLoad: function() {            return initialLoad;          }        },        get: {          initialRating: function() {            if($module.data(metadata.rating) !== undefined) {              $module.removeData(metadata.rating);              return $module.data(metadata.rating);            }            return settings.initialRating;          },          maxRating: function() {            if($module.data(metadata.maxRating) !== undefined) {              $module.removeData(metadata.maxRating);              return $module.data(metadata.maxRating);            }            return settings.maxRating;          },          rating: function() {            var              currentRating = $icon.filter('.' + className.active).length            ;            module.verbose('Current rating retrieved', currentRating);            return currentRating;          }        },        set: {          rating: function(rating) {            var              ratingIndex = (rating - 1 >= 0)                ? (rating - 1)                : 0,              $activeIcon = $icon.eq(ratingIndex)            ;            $module              .removeClass(className.selected)            ;            $icon              .removeClass(className.selected)              .removeClass(className.active)            ;            if(rating > 0) {              module.verbose('Setting current rating to', rating);              $activeIcon                .prevAll()                .addBack()                  .addClass(className.active)              ;            }            if(!module.is.initialLoad()) {              settings.onRate.call(element, rating);            }          },          initialLoad: function() {            initialLoad = true;          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.rating.settings = {  name          : 'Rating',  namespace     : 'rating',  slent         : false,  debug         : false,  verbose       : false,  performance   : true,  initialRating : 0,  interactive   : true,  maxRating     : 4,  clearable     : 'auto',  fireOnInit    : false,  onRate        : function(rating){},  error         : {    method    : 'The method you called is not defined',    noMaximum : 'No maximum rating specified. Cannot generate HTML automatically'  },  metadata: {    rating    : 'rating',    maxRating : 'maxRating'  },  className : {    active   : 'active',    disabled : 'disabled',    selected : 'selected',    loading  : 'loading'  },  selector  : {    icon : '.icon'  },  templates: {    icon: function(maxRating) {      var        icon = 1,        html = ''      ;      while(icon <= maxRating) {        html += '<i class="icon"></i>';        icon++;      }      return html;    }  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Search * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.search = function(parameters) {  var    $allModules     = $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    returnedValue  ;  $(this)    .each(function() {      var        settings          = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.search.settings, parameters)          : $.extend({}, $.fn.search.settings),        className        = settings.className,        metadata         = settings.metadata,        regExp           = settings.regExp,        fields           = settings.fields,        selector         = settings.selector,        error            = settings.error,        namespace        = settings.namespace,        eventNamespace   = '.' + namespace,        moduleNamespace  = namespace + '-module',        $module          = $(this),        $prompt          = $module.find(selector.prompt),        $searchButton    = $module.find(selector.searchButton),        $results         = $module.find(selector.results),        $result          = $module.find(selector.result),        $category        = $module.find(selector.category),        element          = this,        instance         = $module.data(moduleNamespace),        disabledBubbled  = false,        resultsDismissed = false,        module      ;      module = {        initialize: function() {          module.verbose('Initializing module');          module.get.settings();          module.determine.searchFields();          module.bind.events();          module.set.type();          module.create.results();          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying instance');          $module            .off(eventNamespace)            .removeData(moduleNamespace)          ;        },        refresh: function() {          module.debug('Refreshing selector cache');          $prompt         = $module.find(selector.prompt);          $searchButton   = $module.find(selector.searchButton);          $category       = $module.find(selector.category);          $results        = $module.find(selector.results);          $result         = $module.find(selector.result);        },        refreshResults: function() {          $results = $module.find(selector.results);          $result  = $module.find(selector.result);        },        bind: {          events: function() {            module.verbose('Binding events to search');            if(settings.automatic) {              $module                .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)              ;              $prompt                .attr('autocomplete', 'off')              ;            }            $module              // prompt              .on('focus'     + eventNamespace, selector.prompt, module.event.focus)              .on('blur'      + eventNamespace, selector.prompt, module.event.blur)              .on('keydown'   + eventNamespace, selector.prompt, module.handleKeyboard)              // search button              .on('click'     + eventNamespace, selector.searchButton, module.query)              // results              .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)              .on('mouseup'   + eventNamespace, selector.results, module.event.result.mouseup)              .on('click'     + eventNamespace, selector.result,  module.event.result.click)            ;          }        },        determine: {          searchFields: function() {            // this makes sure $.extend does not add specified search fields to default fields            // this is the only setting which should not extend defaults            if(parameters && parameters.searchFields !== undefined) {              settings.searchFields = parameters.searchFields;            }          }        },        event: {          input: function() {            if(settings.searchDelay) {              clearTimeout(module.timer);              module.timer = setTimeout(function() {                if(module.is.focused()) {                  module.query();                }              }, settings.searchDelay);            }            else {              module.query();            }          },          focus: function() {            module.set.focus();            if(settings.searchOnFocus && module.has.minimumCharacters() ) {              module.query(function() {                if(module.can.show() ) {                  module.showResults();                }              });            }          },          blur: function(event) {            var              pageLostFocus = (document.activeElement === this),              callback      = function() {                module.cancel.query();                module.remove.focus();                module.timer = setTimeout(module.hideResults, settings.hideDelay);              }            ;            if(pageLostFocus) {              return;            }            resultsDismissed = false;            if(module.resultsClicked) {              module.debug('Determining if user action caused search to close');              $module                .one('click.close' + eventNamespace, selector.results, function(event) {                  if(module.is.inMessage(event) || disabledBubbled) {                    $prompt.focus();                    return;                  }                  disabledBubbled = false;                  if( !module.is.animating() && !module.is.hidden()) {                    callback();                  }                })              ;            }            else {              module.debug('Input blurred without user action, closing results');              callback();            }          },          result: {            mousedown: function() {              module.resultsClicked = true;            },            mouseup: function() {              module.resultsClicked = false;            },            click: function(event) {              module.debug('Search result selected');              var                $result = $(this),                $title  = $result.find(selector.title).eq(0),                $link   = $result.is('a[href]')                  ? $result                  : $result.find('a[href]').eq(0),                href    = $link.attr('href')   || false,                target  = $link.attr('target') || false,                title   = $title.html(),                // title is used for result lookup                value   = ($title.length > 0)                  ? $title.text()                  : false,                results = module.get.results(),                result  = $result.data(metadata.result) || module.get.result(value, results),                returnedValue              ;              if( $.isFunction(settings.onSelect) ) {                if(settings.onSelect.call(element, result, results) === false) {                  module.debug('Custom onSelect callback cancelled default select action');                  disabledBubbled = true;                  return;                }              }              module.hideResults();              if(value) {                module.set.value(value);              }              if(href) {                module.verbose('Opening search link found in result', $link);                if(target == '_blank' || event.ctrlKey) {                  window.open(href);                }                else {                  window.location.href = (href);                }              }            }          }        },        handleKeyboard: function(event) {          var            // force selector refresh            $result         = $module.find(selector.result),            $category       = $module.find(selector.category),            $activeResult   = $result.filter('.' + className.active),            currentIndex    = $result.index( $activeResult ),            resultSize      = $result.length,            hasActiveResult = $activeResult.length > 0,            keyCode         = event.which,            keys            = {              backspace : 8,              enter     : 13,              escape    : 27,              upArrow   : 38,              downArrow : 40            },            newIndex          ;          // search shortcuts          if(keyCode == keys.escape) {            module.verbose('Escape key pressed, blurring search field');            module.hideResults();            resultsDismissed = true;          }          if( module.is.visible() ) {            if(keyCode == keys.enter) {              module.verbose('Enter key pressed, selecting active result');              if( $result.filter('.' + className.active).length > 0 ) {                module.event.result.click.call($result.filter('.' + className.active), event);                event.preventDefault();                return false;              }            }            else if(keyCode == keys.upArrow && hasActiveResult) {              module.verbose('Up key pressed, changing active result');              newIndex = (currentIndex - 1 < 0)                ? currentIndex                : currentIndex - 1              ;              $category                .removeClass(className.active)              ;              $result                .removeClass(className.active)                .eq(newIndex)                  .addClass(className.active)                  .closest($category)                    .addClass(className.active)              ;              event.preventDefault();            }            else if(keyCode == keys.downArrow) {              module.verbose('Down key pressed, changing active result');              newIndex = (currentIndex + 1 >= resultSize)                ? currentIndex                : currentIndex + 1              ;              $category                .removeClass(className.active)              ;              $result                .removeClass(className.active)                .eq(newIndex)                  .addClass(className.active)                  .closest($category)                    .addClass(className.active)              ;              event.preventDefault();            }          }          else {            // query shortcuts            if(keyCode == keys.enter) {              module.verbose('Enter key pressed, executing query');              module.query();              module.set.buttonPressed();              $prompt.one('keyup', module.remove.buttonFocus);            }          }        },        setup: {          api: function(searchTerm, callback) {            var              apiSettings = {                debug             : settings.debug,                on                : false,                cache             : settings.cache,                action            : 'search',                urlData           : {                  query : searchTerm                },                onSuccess         : function(response) {                  module.parse.response.call(element, response, searchTerm);                  callback();                },                onFailure         : function() {                  module.displayMessage(error.serverError);                  callback();                },                onAbort : function(response) {                },                onError           : module.error              },              searchHTML            ;            $.extend(true, apiSettings, settings.apiSettings);            module.verbose('Setting up API request', apiSettings);            $module.api(apiSettings);          }        },        can: {          useAPI: function() {            return $.fn.api !== undefined;          },          show: function() {            return module.is.focused() && !module.is.visible() && !module.is.empty();          },          transition: function() {            return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');          }        },        is: {          animating: function() {            return $results.hasClass(className.animating);          },          hidden: function() {            return $results.hasClass(className.hidden);          },          inMessage: function(event) {            if(!event.target) {              return;            }            var              $target = $(event.target),              isInDOM = $.contains(document.documentElement, event.target)            ;            return (isInDOM && $target.closest(selector.message).length > 0);          },          empty: function() {            return ($results.html() === '');          },          visible: function() {            return ($results.filter(':visible').length > 0);          },          focused: function() {            return ($prompt.filter(':focus').length > 0);          }        },        get: {          settings: function() {            if($.isPlainObject(parameters) && parameters.searchFullText) {              settings.fullTextSearch = parameters.searchFullText;              module.error(settings.error.oldSearchSyntax, element);            }          },          inputEvent: function() {            var              prompt = $prompt[0],              inputEvent   = (prompt !== undefined && prompt.oninput !== undefined)                ? 'input'                : (prompt !== undefined && prompt.onpropertychange !== undefined)                  ? 'propertychange'                  : 'keyup'            ;            return inputEvent;          },          value: function() {            return $prompt.val();          },          results: function() {            var              results = $module.data(metadata.results)            ;            return results;          },          result: function(value, results) {            var              lookupFields = ['title', 'id'],              result       = false            ;            value = (value !== undefined)              ? value              : module.get.value()            ;            results = (results !== undefined)              ? results              : module.get.results()            ;            if(settings.type === 'category') {              module.debug('Finding result that matches', value);              $.each(results, function(index, category) {                if($.isArray(category.results)) {                  result = module.search.object(value, category.results, lookupFields)[0];                  // don't continue searching if a result is found                  if(result) {                    return false;                  }                }              });            }            else {              module.debug('Finding result in results object', value);              result = module.search.object(value, results, lookupFields)[0];            }            return result || false;          },        },        select: {          firstResult: function() {            module.verbose('Selecting first result');            $result.first().addClass(className.active);          }        },        set: {          focus: function() {            $module.addClass(className.focus);          },          loading: function() {            $module.addClass(className.loading);          },          value: function(value) {            module.verbose('Setting search input value', value);            $prompt              .val(value)            ;          },          type: function(type) {            type = type || settings.type;            if(settings.type == 'category') {              $module.addClass(settings.type);            }          },          buttonPressed: function() {            $searchButton.addClass(className.pressed);          }        },        remove: {          loading: function() {            $module.removeClass(className.loading);          },          focus: function() {            $module.removeClass(className.focus);          },          buttonPressed: function() {            $searchButton.removeClass(className.pressed);          }        },        query: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          var            searchTerm = module.get.value(),            cache = module.read.cache(searchTerm)          ;          callback = callback || function() {};          if( module.has.minimumCharacters() )  {            if(cache) {              module.debug('Reading result from cache', searchTerm);              module.save.results(cache.results);              module.addResults(cache.html);              module.inject.id(cache.results);              callback();            }            else {              module.debug('Querying for', searchTerm);              if($.isPlainObject(settings.source) || $.isArray(settings.source)) {                module.search.local(searchTerm);                callback();              }              else if( module.can.useAPI() ) {                module.search.remote(searchTerm, callback);              }              else {                module.error(error.source);                callback();              }            }            settings.onSearchQuery.call(element, searchTerm);          }          else {            module.hideResults();          }        },        search: {          local: function(searchTerm) {            var              results = module.search.object(searchTerm, settings.content),              searchHTML            ;            module.set.loading();            module.save.results(results);            module.debug('Returned full local search results', results);            if(settings.maxResults > 0) {              module.debug('Using specified max results', results);              results = results.slice(0, settings.maxResults);            }            if(settings.type == 'category') {              results = module.create.categoryResults(results);            }            searchHTML = module.generateResults({              results: results            });            module.remove.loading();            module.addResults(searchHTML);            module.inject.id(results);            module.write.cache(searchTerm, {              html    : searchHTML,              results : results            });          },          remote: function(searchTerm, callback) {            callback = $.isFunction(callback)              ? callback              : function(){}            ;            if($module.api('is loading')) {              $module.api('abort');            }            module.setup.api(searchTerm, callback);            $module              .api('query')            ;          },          object: function(searchTerm, source, searchFields) {            var              results      = [],              exactResults = [],              fuzzyResults = [],              searchExp    = searchTerm.toString().replace(regExp.escape, '\\$&'),              matchRegExp  = new RegExp(regExp.beginsWith + searchExp, 'i'),              // avoid duplicates when pushing results              addResult = function(array, result) {                var                  notResult      = ($.inArray(result, results) == -1),                  notFuzzyResult = ($.inArray(result, fuzzyResults) == -1),                  notExactResults = ($.inArray(result, exactResults) == -1)                ;                if(notResult && notFuzzyResult && notExactResults) {                  array.push(result);                }              }            ;            source = source || settings.source;            searchFields = (searchFields !== undefined)              ? searchFields              : settings.searchFields            ;            // search fields should be array to loop correctly            if(!$.isArray(searchFields)) {              searchFields = [searchFields];            }            // exit conditions if no source            if(source === undefined || source === false) {              module.error(error.source);              return [];            }            // iterate through search fields looking for matches            $.each(searchFields, function(index, field) {              $.each(source, function(label, content) {                var                  fieldExists = (typeof content[field] == 'string')                ;                if(fieldExists) {                  if( content[field].search(matchRegExp) !== -1) {                    // content starts with value (first in results)                    addResult(results, content);                  }                  else if(settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, content[field]) ) {                    // content fuzzy matches (last in results)                    addResult(exactResults, content);                  }                  else if(settings.fullTextSearch == true && module.fuzzySearch(searchTerm, content[field]) ) {                    // content fuzzy matches (last in results)                    addResult(fuzzyResults, content);                  }                }              });            });            $.merge(exactResults, fuzzyResults)            $.merge(results, exactResults);            return results;          }        },        exactSearch: function (query, term) {          query = query.toLowerCase();          term  = term.toLowerCase();          if(term.indexOf(query) > -1) {             return true;          }          return false;        },        fuzzySearch: function(query, term) {          var            termLength  = term.length,            queryLength = query.length          ;          if(typeof query !== 'string') {            return false;          }          query = query.toLowerCase();          term  = term.toLowerCase();          if(queryLength > termLength) {            return false;          }          if(queryLength === termLength) {            return (query === term);          }          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {            var              queryCharacter = query.charCodeAt(characterIndex)            ;            while(nextCharacterIndex < termLength) {              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {                continue search;              }            }            return false;          }          return true;        },        parse: {          response: function(response, searchTerm) {            var              searchHTML = module.generateResults(response)            ;            module.verbose('Parsing server response', response);            if(response !== undefined) {              if(searchTerm !== undefined && response[fields.results] !== undefined) {                module.addResults(searchHTML);                module.inject.id(response[fields.results]);                module.write.cache(searchTerm, {                  html    : searchHTML,                  results : response[fields.results]                });                module.save.results(response[fields.results]);              }            }          }        },        cancel: {          query: function() {            if( module.can.useAPI() ) {              $module.api('abort');            }          }        },        has: {          minimumCharacters: function() {            var              searchTerm    = module.get.value(),              numCharacters = searchTerm.length            ;            return (numCharacters >= settings.minCharacters);          },          results: function() {            if($results.length === 0) {              return false;            }            var              html = $results.html()            ;            return html != '';          }        },        clear: {          cache: function(value) {            var              cache = $module.data(metadata.cache)            ;            if(!value) {              module.debug('Clearing cache', value);              $module.removeData(metadata.cache);            }            else if(value && cache && cache[value]) {              module.debug('Removing value from cache', value);              delete cache[value];              $module.data(metadata.cache, cache);            }          }        },        read: {          cache: function(name) {            var              cache = $module.data(metadata.cache)            ;            if(settings.cache) {              module.verbose('Checking cache for generated html for query', name);              return (typeof cache == 'object') && (cache[name] !== undefined)                ? cache[name]                : false              ;            }            return false;          }        },        create: {          categoryResults: function(results) {            var              categoryResults = {}            ;            $.each(results, function(index, result) {              if(!result.category) {                return;              }              if(categoryResults[result.category] === undefined) {                module.verbose('Creating new category of results', result.category);                categoryResults[result.category] = {                  name    : result.category,                  results : [result]                }              }              else {                categoryResults[result.category].results.push(result);              }            });            return categoryResults;          },          id: function(resultIndex, categoryIndex) {            var              resultID      = (resultIndex + 1), // not zero indexed              categoryID    = (categoryIndex + 1),              firstCharCode,              letterID,              id            ;            if(categoryIndex !== undefined) {              // start char code for "A"              letterID = String.fromCharCode(97 + categoryIndex);              id          = letterID + resultID;              module.verbose('Creating category result id', id);            }            else {              id = resultID;              module.verbose('Creating result id', id);            }            return id;          },          results: function() {            if($results.length === 0) {              $results = $('<div />')                .addClass(className.results)                .appendTo($module)              ;            }          }        },        inject: {          result: function(result, resultIndex, categoryIndex) {            module.verbose('Injecting result into results');            var              $selectedResult = (categoryIndex !== undefined)                ? $results                    .children().eq(categoryIndex)                      .children(selector.results)                        .first()                        .children(selector.result)                          .eq(resultIndex)                : $results                    .children(selector.result).eq(resultIndex)            ;            module.verbose('Injecting results metadata', $selectedResult);            $selectedResult              .data(metadata.result, result)            ;          },          id: function(results) {            module.debug('Injecting unique ids into results');            var              // since results may be object, we must use counters              categoryIndex = 0,              resultIndex   = 0            ;            if(settings.type === 'category') {              // iterate through each category result              $.each(results, function(index, category) {                resultIndex = 0;                $.each(category.results, function(index, value) {                  var                    result = category.results[index]                  ;                  if(result.id === undefined) {                    result.id = module.create.id(resultIndex, categoryIndex);                  }                  module.inject.result(result, resultIndex, categoryIndex);                  resultIndex++;                });                categoryIndex++;              });            }            else {              // top level              $.each(results, function(index, value) {                var                  result = results[index]                ;                if(result.id === undefined) {                  result.id = module.create.id(resultIndex);                }                module.inject.result(result, resultIndex);                resultIndex++;              });            }            return results;          }        },        save: {          results: function(results) {            module.verbose('Saving current search results to metadata', results);            $module.data(metadata.results, results);          }        },        write: {          cache: function(name, value) {            var              cache = ($module.data(metadata.cache) !== undefined)                ? $module.data(metadata.cache)                : {}            ;            if(settings.cache) {              module.verbose('Writing generated html to cache', name, value);              cache[name] = value;              $module                .data(metadata.cache, cache)              ;            }          }        },        addResults: function(html) {          if( $.isFunction(settings.onResultsAdd) ) {            if( settings.onResultsAdd.call($results, html) === false ) {              module.debug('onResultsAdd callback cancelled default action');              return false;            }          }          if(html) {            $results              .html(html)            ;            module.refreshResults();            if(settings.selectFirstResult) {              module.select.firstResult();            }            module.showResults();          }          else {            module.hideResults(function() {              $results.empty();            });          }        },        showResults: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if(resultsDismissed) {            return;          }          if(!module.is.visible() && module.has.results()) {            if( module.can.transition() ) {              module.debug('Showing results with css animations');              $results                .transition({                  animation  : settings.transition + ' in',                  debug      : settings.debug,                  verbose    : settings.verbose,                  duration   : settings.duration,                  onComplete : function() {                    callback();                  },                  queue      : true                })              ;            }            else {              module.debug('Showing results with javascript');              $results                .stop()                .fadeIn(settings.duration, settings.easing)              ;            }            settings.onResultsOpen.call($results);          }        },        hideResults: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if( module.is.visible() ) {            if( module.can.transition() ) {              module.debug('Hiding results with css animations');              $results                .transition({                  animation  : settings.transition + ' out',                  debug      : settings.debug,                  verbose    : settings.verbose,                  duration   : settings.duration,                  onComplete : function() {                    callback();                  },                  queue      : true                })              ;            }            else {              module.debug('Hiding results with javascript');              $results                .stop()                .fadeOut(settings.duration, settings.easing)              ;            }            settings.onResultsClose.call($results);          }        },        generateResults: function(response) {          module.debug('Generating html from response', response);          var            template       = settings.templates[settings.type],            isProperObject = ($.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results])),            isProperArray  = ($.isArray(response[fields.results]) && response[fields.results].length > 0),            html           = ''          ;          if(isProperObject || isProperArray ) {            if(settings.maxResults > 0) {              if(isProperObject) {                if(settings.type == 'standard') {                  module.error(error.maxResults);                }              }              else {                response[fields.results] = response[fields.results].slice(0, settings.maxResults);              }            }            if($.isFunction(template)) {              html = template(response, fields);            }            else {              module.error(error.noTemplate, false);            }          }          else if(settings.showNoResults) {            html = module.displayMessage(error.noResults, 'empty');          }          settings.onResults.call(element, response);          return html;        },        displayMessage: function(text, type) {          type = type || 'standard';          module.debug('Displaying message', text, type);          module.addResults( settings.templates.message(text, type) );          return settings.templates.message(text, type);        },        setting: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            settings[name] = value;          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.search.settings = {  name              : 'Search',  namespace         : 'search',  silent            : false,  debug             : false,  verbose           : false,  performance       : true,  // template to use (specified in settings.templates)  type              : 'standard',  // minimum characters required to search  minCharacters     : 1,  // whether to select first result after searching automatically  selectFirstResult : false,  // API config  apiSettings       : false,  // object to search  source            : false,  // Whether search should query current term on focus  searchOnFocus     : true,  // fields to search  searchFields   : [    'title',    'description'  ],  // field to display in standard results template  displayField   : '',  // search anywhere in value (set to 'exact' to require exact matches  fullTextSearch : 'exact',  // whether to add events to prompt automatically  automatic      : true,  // delay before hiding menu after blur  hideDelay      : 0,  // delay before searching  searchDelay    : 200,  // maximum results returned from search  maxResults     : 7,  // whether to store lookups in local cache  cache          : true,  // whether no results errors should be shown  showNoResults  : true,  // transition settings  transition     : 'scale',  duration       : 200,  easing         : 'easeOutExpo',  // callbacks  onSelect       : false,  onResultsAdd   : false,  onSearchQuery  : function(query){},  onResults      : function(response){},  onResultsOpen  : function(){},  onResultsClose : function(){},  className: {    animating : 'animating',    active    : 'active',    empty     : 'empty',    focus     : 'focus',    hidden    : 'hidden',    loading   : 'loading',    results   : 'results',    pressed   : 'down'  },  error : {    source          : 'Cannot search. No source used, and Semantic API module was not included',    noResults       : 'Your search returned no results',    logging         : 'Error in debug logging, exiting.',    noEndpoint      : 'No search endpoint was specified',    noTemplate      : 'A valid template name was not specified.',    oldSearchSyntax : 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',    serverError     : 'There was an issue querying the server.',    maxResults      : 'Results must be an array to use maxResults setting',    method          : 'The method you called is not defined.'  },  metadata: {    cache   : 'cache',    results : 'results',    result  : 'result'  },  regExp: {    escape     : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,    beginsWith : '(?:\s|^)'  },  // maps api response attributes to internal representation  fields: {    categories      : 'results',     // array of categories (category view)    categoryName    : 'name',        // name of category (category view)    categoryResults : 'results',     // array of results (category view)    description     : 'description', // result description    image           : 'image',       // result image    price           : 'price',       // result price    results         : 'results',     // array of results (standard)    title           : 'title',       // result title    url             : 'url',         // result url    action          : 'action',      // "view more" object name    actionText      : 'text',        // "view more" text    actionURL       : 'url'          // "view more" url  },  selector : {    prompt       : '.prompt',    searchButton : '.search.button',    results      : '.results',    message      : '.results > .message',    category     : '.category',    result       : '.result',    title        : '.title, .name'  },  templates: {    escape: function(string) {      var        badChars     = /[&<>"'`]/g,        shouldEscape = /[&<>"'`]/,        escape       = {          "&": "&",          "<": "<",          ">": ">",          '"': """,          "'": "'",          "`": "`"        },        escapedChar  = function(chr) {          return escape[chr];        }      ;      if(shouldEscape.test(string)) {        return string.replace(badChars, escapedChar);      }      return string;    },    message: function(message, type) {      var        html = ''      ;      if(message !== undefined && type !== undefined) {        html +=  ''          + '<div class="message ' + type + '">'        ;        // message type        if(type == 'empty') {          html += ''            + '<div class="header">No Results</div class="header">'            + '<div class="description">' + message + '</div class="description">'          ;        }        else {          html += ' <div class="description">' + message + '</div>';        }        html += '</div>';      }      return html;    },    category: function(response, fields) {      var        html = '',        escape = $.fn.search.settings.templates.escape      ;      if(response[fields.categoryResults] !== undefined) {        // each category        $.each(response[fields.categoryResults], function(index, category) {          if(category[fields.results] !== undefined && category.results.length > 0) {            html  += '<div class="category">';            if(category[fields.categoryName] !== undefined) {              html += '<div class="name">' + category[fields.categoryName] + '</div>';            }            // each item inside category            html += '<div class="results">';            $.each(category.results, function(index, result) {              if(result[fields.url]) {                html  += '<a class="result" href="' + result[fields.url] + '">';              }              else {                html  += '<a class="result">';              }              if(result[fields.image] !== undefined) {                html += ''                  + '<div class="image">'                  + ' <img src="' + result[fields.image] + '">'                  + '</div>'                ;              }              html += '<div class="content">';              if(result[fields.price] !== undefined) {                html += '<div class="price">' + result[fields.price] + '</div>';              }              if(result[fields.title] !== undefined) {                html += '<div class="title">' + result[fields.title] + '</div>';              }              if(result[fields.description] !== undefined) {                html += '<div class="description">' + result[fields.description] + '</div>';              }              html  += ''                + '</div>'              ;              html += '</a>';            });            html += '</div>';            html  += ''              + '</div>'            ;          }        });        if(response[fields.action]) {          html += ''          + '<a href="' + response[fields.action][fields.actionURL] + '" class="action">'          +   response[fields.action][fields.actionText]          + '</a>';        }        return html;      }      return false;    },    standard: function(response, fields) {      var        html = ''      ;      if(response[fields.results] !== undefined) {        // each result        $.each(response[fields.results], function(index, result) {          if(result[fields.url]) {            html  += '<a class="result" href="' + result[fields.url] + '">';          }          else {            html  += '<a class="result">';          }          if(result[fields.image] !== undefined) {            html += ''              + '<div class="image">'              + ' <img src="' + result[fields.image] + '">'              + '</div>'            ;          }          html += '<div class="content">';          if(result[fields.price] !== undefined) {            html += '<div class="price">' + result[fields.price] + '</div>';          }          if(result[fields.title] !== undefined) {            html += '<div class="title">' + result[fields.title] + '</div>';          }          if(result[fields.description] !== undefined) {            html += '<div class="description">' + result[fields.description] + '</div>';          }          html  += ''            + '</div>'          ;          html += '</a>';        });        if(response[fields.action]) {          html += ''          + '<a href="' + response[fields.action][fields.actionURL] + '" class="action">'          +   response[fields.action][fields.actionText]          + '</a>';        }        return html;      }      return false;    }  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Shape * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.shape = function(parameters) {  var    $allModules     = $(this),    $body           = $('body'),    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    requestAnimationFrame = window.requestAnimationFrame      || window.mozRequestAnimationFrame      || window.webkitRequestAnimationFrame      || window.msRequestAnimationFrame      || function(callback) { setTimeout(callback, 0); },    returnedValue  ;  $allModules    .each(function() {      var        moduleSelector = $allModules.selector || '',        settings       = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.shape.settings, parameters)          : $.extend({}, $.fn.shape.settings),        // internal aliases        namespace     = settings.namespace,        selector      = settings.selector,        error         = settings.error,        className     = settings.className,        // define namespaces for modules        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        // selector cache        $module       = $(this),        $sides        = $module.find(selector.sides),        $side         = $module.find(selector.side),        // private variables        nextIndex = false,        $activeSide,        $nextSide,        // standard module        element       = this,        instance      = $module.data(moduleNamespace),        module      ;      module = {        initialize: function() {          module.verbose('Initializing module for', element);          module.set.defaultSide();          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        destroy: function() {          module.verbose('Destroying previous module for', element);          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        refresh: function() {          module.verbose('Refreshing selector cache for', element);          $module = $(element);          $sides  = $(this).find(selector.shape);          $side   = $(this).find(selector.side);        },        repaint: function() {          module.verbose('Forcing repaint event');          var            shape          = $sides[0] || document.createElement('div'),            fakeAssignment = shape.offsetWidth          ;        },        animate: function(propertyObject, callback) {          module.verbose('Animating box with properties', propertyObject);          callback = callback || function(event) {            module.verbose('Executing animation callback');            if(event !== undefined) {              event.stopPropagation();            }            module.reset();            module.set.active();          };          settings.beforeChange.call($nextSide[0]);          if(module.get.transitionEvent()) {            module.verbose('Starting CSS animation');            $module              .addClass(className.animating)            ;            $sides              .css(propertyObject)              .one(module.get.transitionEvent(), callback)            ;            module.set.duration(settings.duration);            requestAnimationFrame(function() {              $module                .addClass(className.animating)              ;              $activeSide                .addClass(className.hidden)              ;            });          }          else {            callback();          }        },        queue: function(method) {          module.debug('Queueing animation of', method);          $sides            .one(module.get.transitionEvent(), function() {              module.debug('Executing queued animation');              setTimeout(function(){                $module.shape(method);              }, 0);            })          ;        },        reset: function() {          module.verbose('Animating states reset');          $module            .removeClass(className.animating)            .attr('style', '')            .removeAttr('style')          ;          // removeAttr style does not consistently work in safari          $sides            .attr('style', '')            .removeAttr('style')          ;          $side            .attr('style', '')            .removeAttr('style')            .removeClass(className.hidden)          ;          $nextSide            .removeClass(className.animating)            .attr('style', '')            .removeAttr('style')          ;        },        is: {          complete: function() {            return ($side.filter('.' + className.active)[0] == $nextSide[0]);          },          animating: function() {            return $module.hasClass(className.animating);          }        },        set: {          defaultSide: function() {            $activeSide = $module.find('.' + settings.className.active);            $nextSide   = ( $activeSide.next(selector.side).length > 0 )              ? $activeSide.next(selector.side)              : $module.find(selector.side).first()            ;            nextIndex = false;            module.verbose('Active side set to', $activeSide);            module.verbose('Next side set to', $nextSide);          },          duration: function(duration) {            duration = duration || settings.duration;            duration = (typeof duration == 'number')              ? duration + 'ms'              : duration            ;            module.verbose('Setting animation duration', duration);            if(settings.duration || settings.duration === 0) {              $sides.add($side)                .css({                  '-webkit-transition-duration': duration,                  '-moz-transition-duration': duration,                  '-ms-transition-duration': duration,                  '-o-transition-duration': duration,                  'transition-duration': duration                })              ;            }          },          currentStageSize: function() {            var              $activeSide = $module.find('.' + settings.className.active),              width       = $activeSide.outerWidth(true),              height      = $activeSide.outerHeight(true)            ;            $module              .css({                width: width,                height: height              })            ;          },          stageSize: function() {            var              $clone      = $module.clone().addClass(className.loading),              $activeSide = $clone.find('.' + settings.className.active),              $nextSide   = (nextIndex)                ? $clone.find(selector.side).eq(nextIndex)                : ( $activeSide.next(selector.side).length > 0 )                  ? $activeSide.next(selector.side)                  : $clone.find(selector.side).first(),              newWidth    = (settings.width == 'next')                ? $nextSide.outerWidth(true)                : (settings.width == 'initial')                  ? $module.width()                  : settings.width,              newHeight    = (settings.height == 'next')                ? $nextSide.outerHeight(true)                : (settings.height == 'initial')                  ? $module.height()                  : settings.height            ;            $activeSide.removeClass(className.active);            $nextSide.addClass(className.active);            $clone.insertAfter($module);            $clone.remove();            if(settings.width != 'auto') {              $module.css('width', newWidth + settings.jitter);              module.verbose('Specifying width during animation', newWidth);            }            if(settings.height != 'auto') {              $module.css('height', newHeight + settings.jitter);              module.verbose('Specifying height during animation', newHeight);            }          },          nextSide: function(selector) {            nextIndex = selector;            $nextSide = $side.filter(selector);            nextIndex = $side.index($nextSide);            if($nextSide.length === 0) {              module.set.defaultSide();              module.error(error.side);            }            module.verbose('Next side manually set to', $nextSide);          },          active: function() {            module.verbose('Setting new side to active', $nextSide);            $side              .removeClass(className.active)            ;            $nextSide              .addClass(className.active)            ;            settings.onChange.call($nextSide[0]);            module.set.defaultSide();          }        },        flip: {          up: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping up', $nextSide);              var                transform = module.get.transform.up()              ;              module.set.stageSize();              module.stage.above();              module.animate(transform);            }            else {              module.queue('flip up');            }          },          down: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping down', $nextSide);              var                transform = module.get.transform.down()              ;              module.set.stageSize();              module.stage.below();              module.animate(transform);            }            else {              module.queue('flip down');            }          },          left: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping left', $nextSide);              var                transform = module.get.transform.left()              ;              module.set.stageSize();              module.stage.left();              module.animate(transform);            }            else {              module.queue('flip left');            }          },          right: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping right', $nextSide);              var                transform = module.get.transform.right()              ;              module.set.stageSize();              module.stage.right();              module.animate(transform);            }            else {              module.queue('flip right');            }          },          over: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping over', $nextSide);              module.set.stageSize();              module.stage.behind();              module.animate(module.get.transform.over() );            }            else {              module.queue('flip over');            }          },          back: function() {            if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {              module.debug('Side already visible', $nextSide);              return;            }            if( !module.is.animating()) {              module.debug('Flipping back', $nextSide);              module.set.stageSize();              module.stage.behind();              module.animate(module.get.transform.back() );            }            else {              module.queue('flip back');            }          }        },        get: {          transform: {            up: function() {              var                translate = {                  y: -(($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),                  z: -($activeSide.outerHeight(true) / 2)                }              ;              return {                transform: 'translateY(' + translate.y + 'px) translateZ('+ translate.z + 'px) rotateX(-90deg)'              };            },            down: function() {              var                translate = {                  y: -(($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),                  z: -($activeSide.outerHeight(true) / 2)                }              ;              return {                transform: 'translateY(' + translate.y + 'px) translateZ('+ translate.z + 'px) rotateX(90deg)'              };            },            left: function() {              var                translate = {                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),                  z : -($activeSide.outerWidth(true) / 2)                }              ;              return {                transform: 'translateX(' + translate.x + 'px) translateZ(' + translate.z + 'px) rotateY(90deg)'              };            },            right: function() {              var                translate = {                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2),                  z : -($activeSide.outerWidth(true) / 2)                }              ;              return {                transform: 'translateX(' + translate.x + 'px) translateZ(' + translate.z + 'px) rotateY(-90deg)'              };            },            over: function() {              var                translate = {                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)                }              ;              return {                transform: 'translateX(' + translate.x + 'px) rotateY(180deg)'              };            },            back: function() {              var                translate = {                  x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)                }              ;              return {                transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)'              };            }          },          transitionEvent: function() {            var              element     = document.createElement('element'),              transitions = {                'transition'       :'transitionend',                'OTransition'      :'oTransitionEnd',                'MozTransition'    :'transitionend',                'WebkitTransition' :'webkitTransitionEnd'              },              transition            ;            for(transition in transitions){              if( element.style[transition] !== undefined ){                return transitions[transition];              }            }          },          nextSide: function() {            return ( $activeSide.next(selector.side).length > 0 )              ? $activeSide.next(selector.side)              : $module.find(selector.side).first()            ;          }        },        stage: {          above: function() {            var              box = {                origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),                depth  : {                  active : ($nextSide.outerHeight(true) / 2),                  next   : ($activeSide.outerHeight(true) / 2)                }              }            ;            module.verbose('Setting the initial animation position as above', $nextSide, box);            $sides              .css({                'transform' : 'translateZ(-' + box.depth.active + 'px)'              })            ;            $activeSide              .css({                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'              })            ;            $nextSide              .addClass(className.animating)              .css({                'top'       : box.origin + 'px',                'transform' : 'rotateX(90deg) translateZ(' + box.depth.next + 'px)'              })            ;          },          below: function() {            var              box = {                origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),                depth  : {                  active : ($nextSide.outerHeight(true) / 2),                  next   : ($activeSide.outerHeight(true) / 2)                }              }            ;            module.verbose('Setting the initial animation position as below', $nextSide, box);            $sides              .css({                'transform' : 'translateZ(-' + box.depth.active + 'px)'              })            ;            $activeSide              .css({                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'              })            ;            $nextSide              .addClass(className.animating)              .css({                'top'       : box.origin + 'px',                'transform' : 'rotateX(-90deg) translateZ(' + box.depth.next + 'px)'              })            ;          },          left: function() {            var              height = {                active : $activeSide.outerWidth(true),                next   : $nextSide.outerWidth(true)              },              box = {                origin : ( ( height.active - height.next ) / 2),                depth  : {                  active : (height.next / 2),                  next   : (height.active / 2)                }              }            ;            module.verbose('Setting the initial animation position as left', $nextSide, box);            $sides              .css({                'transform' : 'translateZ(-' + box.depth.active + 'px)'              })            ;            $activeSide              .css({                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'              })            ;            $nextSide              .addClass(className.animating)              .css({                'left'      : box.origin + 'px',                'transform' : 'rotateY(-90deg) translateZ(' + box.depth.next + 'px)'              })            ;          },          right: function() {            var              height = {                active : $activeSide.outerWidth(true),                next   : $nextSide.outerWidth(true)              },              box = {                origin : ( ( height.active - height.next ) / 2),                depth  : {                  active : (height.next / 2),                  next   : (height.active / 2)                }              }            ;            module.verbose('Setting the initial animation position as left', $nextSide, box);            $sides              .css({                'transform' : 'translateZ(-' + box.depth.active + 'px)'              })            ;            $activeSide              .css({                'transform' : 'rotateY(0deg) translateZ(' + box.depth.active + 'px)'              })            ;            $nextSide              .addClass(className.animating)              .css({                'left'      : box.origin + 'px',                'transform' : 'rotateY(90deg) translateZ(' + box.depth.next + 'px)'              })            ;          },          behind: function() {            var              height = {                active : $activeSide.outerWidth(true),                next   : $nextSide.outerWidth(true)              },              box = {                origin : ( ( height.active - height.next ) / 2),                depth  : {                  active : (height.next / 2),                  next   : (height.active / 2)                }              }            ;            module.verbose('Setting the initial animation position as behind', $nextSide, box);            $activeSide              .css({                'transform' : 'rotateY(0deg)'              })            ;            $nextSide              .addClass(className.animating)              .css({                'left'      : box.origin + 'px',                'transform' : 'rotateY(-180deg)'              })            ;          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.shape.settings = {  // module info  name : 'Shape',  // hide all debug content  silent     : false,  // debug content outputted to console  debug      : false,  // verbose debug output  verbose    : false,  // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors)  jitter     : 0,  // performance data output  performance: true,  // event namespace  namespace  : 'shape',  // width during animation, can be set to 'auto', initial', 'next' or pixel amount  width: 'initial',  // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount  height: 'initial',  // callback occurs on side change  beforeChange : function() {},  onChange     : function() {},  // allow animation to same side  allowRepeats: false,  // animation duration  duration   : false,  // possible errors  error: {    side   : 'You tried to switch to a side that does not exist.',    method : 'The method you called is not defined'  },  // classnames used  className   : {    animating : 'animating',    hidden    : 'hidden',    loading   : 'loading',    active    : 'active'  },  // selectors used  selector    : {    sides : '.sides',    side  : '.side'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Sidebar * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.sidebar = function(parameters) {  var    $allModules     = $(this),    $window         = $(window),    $document       = $(document),    $html           = $('html'),    $head           = $('head'),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    requestAnimationFrame = window.requestAnimationFrame      || window.mozRequestAnimationFrame      || window.webkitRequestAnimationFrame      || window.msRequestAnimationFrame      || function(callback) { setTimeout(callback, 0); },    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.sidebar.settings, parameters)          : $.extend({}, $.fn.sidebar.settings),        selector        = settings.selector,        className       = settings.className,        namespace       = settings.namespace,        regExp          = settings.regExp,        error           = settings.error,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $module         = $(this),        $context        = $(settings.context),        $sidebars       = $module.children(selector.sidebar),        $fixed          = $context.children(selector.fixed),        $pusher         = $context.children(selector.pusher),        $style,        element         = this,        instance        = $module.data(moduleNamespace),        elementNamespace,        id,        currentScroll,        transitionEvent,        module      ;      module      = {        initialize: function() {          module.debug('Initializing sidebar', parameters);          module.create.id();          transitionEvent = module.get.transitionEvent();          // avoids locking rendering if initialized in onReady          if(settings.delaySetup) {            requestAnimationFrame(module.setup.layout);          }          else {            module.setup.layout();          }          requestAnimationFrame(function() {            module.setup.cache();          });          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        create: {          id: function() {            id = (Math.random().toString(16) + '000000000').substr(2,8);            elementNamespace = '.' + id;            module.verbose('Creating unique id for element', id);          }        },        destroy: function() {          module.verbose('Destroying previous module for', $module);          $module            .off(eventNamespace)            .removeData(moduleNamespace)          ;          if(module.is.ios()) {            module.remove.ios();          }          // bound by uuid          $context.off(elementNamespace);          $window.off(elementNamespace);          $document.off(elementNamespace);        },        event: {          clickaway: function(event) {            var              clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),              clickedContext  = ($context.is(event.target))            ;            if(clickedInPusher) {              module.verbose('User clicked on dimmed page');              module.hide();            }            if(clickedContext) {              module.verbose('User clicked on dimmable context (scaled out page)');              module.hide();            }          },          touch: function(event) {            //event.stopPropagation();          },          containScroll: function(event) {            if(element.scrollTop <= 0)  {              element.scrollTop = 1;            }            if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {              element.scrollTop = element.scrollHeight - element.offsetHeight - 1;            }          },          scroll: function(event) {            if( $(event.target).closest(selector.sidebar).length === 0 ) {              event.preventDefault();            }          }        },        bind: {          clickaway: function() {            module.verbose('Adding clickaway events to context', $context);            if(settings.closable) {              $context                .on('click'    + elementNamespace, module.event.clickaway)                .on('touchend' + elementNamespace, module.event.clickaway)              ;            }          },          scrollLock: function() {            if(settings.scrollLock) {              module.debug('Disabling page scroll');              $window                .on('DOMMouseScroll' + elementNamespace, module.event.scroll)              ;            }            module.verbose('Adding events to contain sidebar scroll');            $document              .on('touchmove' + elementNamespace, module.event.touch)            ;            $module              .on('scroll' + eventNamespace, module.event.containScroll)            ;          }        },        unbind: {          clickaway: function() {            module.verbose('Removing clickaway events from context', $context);            $context.off(elementNamespace);          },          scrollLock: function() {            module.verbose('Removing scroll lock from page');            $document.off(elementNamespace);            $window.off(elementNamespace);            $module.off('scroll' + eventNamespace);          }        },        add: {          inlineCSS: function() {            var              width     = module.cache.width  || $module.outerWidth(),              height    = module.cache.height || $module.outerHeight(),              isRTL     = module.is.rtl(),              direction = module.get.direction(),              distance  = {                left   : width,                right  : -width,                top    : height,                bottom : -height              },              style            ;            if(isRTL){              module.verbose('RTL detected, flipping widths');              distance.left = -width;              distance.right = width;            }            style  = '<style>';            if(direction === 'left' || direction === 'right') {              module.debug('Adding CSS rules for animation distance', width);              style  += ''                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'                + '   -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'                + '           transform: translate3d('+ distance[direction] + 'px, 0, 0);'                + ' }'              ;            }            else if(direction === 'top' || direction == 'bottom') {              style  += ''                + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'                + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'                + '   -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'                + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'                + ' }'              ;            }            /* IE is only browser not to create context with transforms */            /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */            if( module.is.ie() ) {              if(direction === 'left' || direction === 'right') {                module.debug('Adding CSS rules for animation distance', width);                style  += ''                  + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'                  + '   -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'                  + '           transform: translate3d('+ distance[direction] + 'px, 0, 0);'                  + ' }'                ;              }              else if(direction === 'top' || direction == 'bottom') {                style  += ''                  + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'                  + '   -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'                  + '           transform: translate3d(0, ' + distance[direction] + 'px, 0);'                  + ' }'                ;              }              /* opposite sides visible forces content overlay */              style += ''                + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher:after,'                + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher:after {'                + '   -webkit-transform: translate3d(0px, 0, 0);'                + '           transform: translate3d(0px, 0, 0);'                + ' }'              ;            }            style += '</style>';            $style = $(style)              .appendTo($head)            ;            module.debug('Adding sizing css to head', $style);          }        },        refresh: function() {          module.verbose('Refreshing selector cache');          $context  = $(settings.context);          $sidebars = $context.children(selector.sidebar);          $pusher   = $context.children(selector.pusher);          $fixed    = $context.children(selector.fixed);          module.clear.cache();        },        refreshSidebars: function() {          module.verbose('Refreshing other sidebars');          $sidebars = $context.children(selector.sidebar);        },        repaint: function() {          module.verbose('Forcing repaint event');          element.style.display = 'none';          var ignored = element.offsetHeight;          element.scrollTop = element.scrollTop;          element.style.display = '';        },        setup: {          cache: function() {            module.cache = {              width  : $module.outerWidth(),              height : $module.outerHeight(),              rtl    : ($module.css('direction') == 'rtl')            };          },          layout: function() {            if( $context.children(selector.pusher).length === 0 ) {              module.debug('Adding wrapper element for sidebar');              module.error(error.pusher);              $pusher = $('<div class="pusher" />');              $context                .children()                  .not(selector.omitted)                  .not($sidebars)                  .wrapAll($pusher)              ;              module.refresh();            }            if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {              module.debug('Moved sidebar to correct parent element');              module.error(error.movedSidebar, element);              $module.detach().prependTo($context);              module.refresh();            }            module.clear.cache();            module.set.pushable();            module.set.direction();          }        },        attachEvents: function(selector, event) {          var            $toggle = $(selector)          ;          event = $.isFunction(module[event])            ? module[event]            : module.toggle          ;          if($toggle.length > 0) {            module.debug('Attaching sidebar events to element', selector, event);            $toggle              .on('click' + eventNamespace, event)            ;          }          else {            module.error(error.notFound, selector);          }        },        show: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if(module.is.hidden()) {            module.refreshSidebars();            if(settings.overlay)  {              module.error(error.overlay);              settings.transition = 'overlay';            }            module.refresh();            if(module.othersActive()) {              module.debug('Other sidebars currently visible');              if(settings.exclusive) {                // if not overlay queue animation after hide                if(settings.transition != 'overlay') {                  module.hideOthers(module.show);                  return;                }                else {                  module.hideOthers();                }              }              else {                settings.transition = 'overlay';              }            }            module.pushPage(function() {              callback.call(element);              settings.onShow.call(element);            });            settings.onChange.call(element);            settings.onVisible.call(element);          }          else {            module.debug('Sidebar is already visible');          }        },        hide: function(callback) {          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if(module.is.visible() || module.is.animating()) {            module.debug('Hiding sidebar', callback);            module.refreshSidebars();            module.pullPage(function() {              callback.call(element);              settings.onHidden.call(element);            });            settings.onChange.call(element);            settings.onHide.call(element);          }        },        othersAnimating: function() {          return ($sidebars.not($module).filter('.' + className.animating).length > 0);        },        othersVisible: function() {          return ($sidebars.not($module).filter('.' + className.visible).length > 0);        },        othersActive: function() {          return(module.othersVisible() || module.othersAnimating());        },        hideOthers: function(callback) {          var            $otherSidebars = $sidebars.not($module).filter('.' + className.visible),            sidebarCount   = $otherSidebars.length,            callbackCount  = 0          ;          callback = callback || function(){};          $otherSidebars            .sidebar('hide', function() {              callbackCount++;              if(callbackCount == sidebarCount) {                callback();              }            })          ;        },        toggle: function() {          module.verbose('Determining toggled direction');          if(module.is.hidden()) {            module.show();          }          else {            module.hide();          }        },        pushPage: function(callback) {          var            transition = module.get.transition(),            $transition = (transition === 'overlay' || module.othersActive())              ? $module              : $pusher,            animate,            dim,            transitionEnd          ;          callback = $.isFunction(callback)            ? callback            : function(){}          ;          if(settings.transition == 'scale down') {            module.scrollToTop();          }          module.set.transition(transition);          module.repaint();          animate = function() {            module.bind.clickaway();            module.add.inlineCSS();            module.set.animating();            module.set.visible();          };          dim = function() {            module.set.dimmed();          };          transitionEnd = function(event) {            if( event.target == $transition[0] ) {              $transition.off(transitionEvent + elementNamespace, transitionEnd);              module.remove.animating();              module.bind.scrollLock();              callback.call(element);            }          };          $transition.off(transitionEvent + elementNamespace);          $transition.on(transitionEvent + elementNamespace, transitionEnd);          requestAnimationFrame(animate);          if(settings.dimPage && !module.othersVisible()) {            requestAnimationFrame(dim);          }        },        pullPage: function(callback) {          var            transition = module.get.transition(),            $transition = (transition == 'overlay' || module.othersActive())              ? $module              : $pusher,            animate,            transitionEnd          ;          callback = $.isFunction(callback)            ? callback            : function(){}          ;          module.verbose('Removing context push state', module.get.direction());          module.unbind.clickaway();          module.unbind.scrollLock();          animate = function() {            module.set.transition(transition);            module.set.animating();            module.remove.visible();            if(settings.dimPage && !module.othersVisible()) {              $pusher.removeClass(className.dimmed);            }          };          transitionEnd = function(event) {            if( event.target == $transition[0] ) {              $transition.off(transitionEvent + elementNamespace, transitionEnd);              module.remove.animating();              module.remove.transition();              module.remove.inlineCSS();              if(transition == 'scale down' || (settings.returnScroll && module.is.mobile()) ) {                module.scrollBack();              }              callback.call(element);            }          };          $transition.off(transitionEvent + elementNamespace);          $transition.on(transitionEvent + elementNamespace, transitionEnd);          requestAnimationFrame(animate);        },        scrollToTop: function() {          module.verbose('Scrolling to top of page to avoid animation issues');          currentScroll = $(window).scrollTop();          $module.scrollTop(0);          window.scrollTo(0, 0);        },        scrollBack: function() {          module.verbose('Scrolling back to original page position');          window.scrollTo(0, currentScroll);        },        clear: {          cache: function() {            module.verbose('Clearing cached dimensions');            module.cache = {};          }        },        set: {          // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios          // (This is no longer necessary in latest iOS)          ios: function() {            $html.addClass(className.ios);          },          // container          pushed: function() {            $context.addClass(className.pushed);          },          pushable: function() {            $context.addClass(className.pushable);          },          // pusher          dimmed: function() {            $pusher.addClass(className.dimmed);          },          // sidebar          active: function() {            $module.addClass(className.active);          },          animating: function() {            $module.addClass(className.animating);          },          transition: function(transition) {            transition = transition || module.get.transition();            $module.addClass(transition);          },          direction: function(direction) {            direction = direction || module.get.direction();            $module.addClass(className[direction]);          },          visible: function() {            $module.addClass(className.visible);          },          overlay: function() {            $module.addClass(className.overlay);          }        },        remove: {          inlineCSS: function() {            module.debug('Removing inline css styles', $style);            if($style && $style.length > 0) {              $style.remove();            }          },          // ios scroll on html not document          ios: function() {            $html.removeClass(className.ios);          },          // context          pushed: function() {            $context.removeClass(className.pushed);          },          pushable: function() {            $context.removeClass(className.pushable);          },          // sidebar          active: function() {            $module.removeClass(className.active);          },          animating: function() {            $module.removeClass(className.animating);          },          transition: function(transition) {            transition = transition || module.get.transition();            $module.removeClass(transition);          },          direction: function(direction) {            direction = direction || module.get.direction();            $module.removeClass(className[direction]);          },          visible: function() {            $module.removeClass(className.visible);          },          overlay: function() {            $module.removeClass(className.overlay);          }        },        get: {          direction: function() {            if($module.hasClass(className.top)) {              return className.top;            }            else if($module.hasClass(className.right)) {              return className.right;            }            else if($module.hasClass(className.bottom)) {              return className.bottom;            }            return className.left;          },          transition: function() {            var              direction = module.get.direction(),              transition            ;            transition = ( module.is.mobile() )              ? (settings.mobileTransition == 'auto')                ? settings.defaultTransition.mobile[direction]                : settings.mobileTransition              : (settings.transition == 'auto')                ? settings.defaultTransition.computer[direction]                : settings.transition            ;            module.verbose('Determined transition', transition);            return transition;          },          transitionEvent: function() {            var              element     = document.createElement('element'),              transitions = {                'transition'       :'transitionend',                'OTransition'      :'oTransitionEnd',                'MozTransition'    :'transitionend',                'WebkitTransition' :'webkitTransitionEnd'              },              transition            ;            for(transition in transitions){              if( element.style[transition] !== undefined ){                return transitions[transition];              }            }          }        },        is: {          ie: function() {            var              isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),              isIE   = ('ActiveXObject' in window)            ;            return (isIE11 || isIE);          },          ios: function() {            var              userAgent      = navigator.userAgent,              isIOS          = userAgent.match(regExp.ios),              isMobileChrome = userAgent.match(regExp.mobileChrome)            ;            if(isIOS && !isMobileChrome) {              module.verbose('Browser was found to be iOS', userAgent);              return true;            }            else {              return false;            }          },          mobile: function() {            var              userAgent    = navigator.userAgent,              isMobile     = userAgent.match(regExp.mobile)            ;            if(isMobile) {              module.verbose('Browser was found to be mobile', userAgent);              return true;            }            else {              module.verbose('Browser is not mobile, using regular transition', userAgent);              return false;            }          },          hidden: function() {            return !module.is.visible();          },          visible: function() {            return $module.hasClass(className.visible);          },          // alias          open: function() {            return module.is.visible();          },          closed: function() {            return module.is.hidden();          },          vertical: function() {            return $module.hasClass(className.top);          },          animating: function() {            return $context.hasClass(className.animating);          },          rtl: function () {            if(module.cache.rtl === undefined) {              module.cache.rtl = ($module.css('direction') == 'rtl');            }            return module.cache.rtl;          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      }    ;    if(methodInvoked) {      if(instance === undefined) {        module.initialize();      }      module.invoke(query);    }    else {      if(instance !== undefined) {        module.invoke('destroy');      }      module.initialize();    }  });  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.sidebar.settings = {  name              : 'Sidebar',  namespace         : 'sidebar',  silent            : false,  debug             : false,  verbose           : false,  performance       : true,  transition        : 'auto',  mobileTransition  : 'auto',  defaultTransition : {    computer: {      left   : 'uncover',      right  : 'uncover',      top    : 'overlay',      bottom : 'overlay'    },    mobile: {      left   : 'uncover',      right  : 'uncover',      top    : 'overlay',      bottom : 'overlay'    }  },  context           : 'body',  exclusive         : false,  closable          : true,  dimPage           : true,  scrollLock        : false,  returnScroll      : false,  delaySetup        : false,  duration          : 500,  onChange          : function(){},  onShow            : function(){},  onHide            : function(){},  onHidden          : function(){},  onVisible         : function(){},  className         : {    active    : 'active',    animating : 'animating',    dimmed    : 'dimmed',    ios       : 'ios',    pushable  : 'pushable',    pushed    : 'pushed',    right     : 'right',    top       : 'top',    left      : 'left',    bottom    : 'bottom',    visible   : 'visible'  },  selector: {    fixed   : '.fixed',    omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',    pusher  : '.pusher',    sidebar : '.ui.sidebar'  },  regExp: {    ios          : /(iPad|iPhone|iPod)/g,    mobileChrome : /(CriOS)/g,    mobile       : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g  },  error   : {    method       : 'The method you called is not defined.',    pusher       : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',    movedSidebar : 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',    overlay      : 'The overlay setting is no longer supported, use animation: overlay',    notFound     : 'There were no elements that matched the specified selector'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Sticky * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.sticky = function(parameters) {  var    $allModules    = $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings              = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.sticky.settings, parameters)          : $.extend({}, $.fn.sticky.settings),        className             = settings.className,        namespace             = settings.namespace,        error                 = settings.error,        eventNamespace        = '.' + namespace,        moduleNamespace       = 'module-' + namespace,        $module               = $(this),        $window               = $(window),        $scroll               = $(settings.scrollContext),        $container,        $context,        selector              = $module.selector || '',        instance              = $module.data(moduleNamespace),        requestAnimationFrame = window.requestAnimationFrame          || window.mozRequestAnimationFrame          || window.webkitRequestAnimationFrame          || window.msRequestAnimationFrame          || function(callback) { setTimeout(callback, 0); },        element         = this,        documentObserver,        observer,        module      ;      module      = {        initialize: function() {          module.determineContainer();          module.determineContext();          module.verbose('Initializing sticky', settings, $container);          module.save.positions();          module.checkErrors();          module.bind.events();          if(settings.observeChanges) {            module.observeChanges();          }          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.verbose('Destroying previous instance');          module.reset();          if(documentObserver) {            documentObserver.disconnect();          }          if(observer) {            observer.disconnect();          }          $window            .off('load' + eventNamespace, module.event.load)            .off('resize' + eventNamespace, module.event.resize)          ;          $scroll            .off('scrollchange' + eventNamespace, module.event.scrollchange)          ;          $module.removeData(moduleNamespace);        },        observeChanges: function() {          if('MutationObserver' in window) {            documentObserver = new MutationObserver(module.event.documentChanged);            observer         = new MutationObserver(module.event.changed);            documentObserver.observe(document, {              childList : true,              subtree   : true            });            observer.observe(element, {              childList : true,              subtree   : true            });            observer.observe($context[0], {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', observer);          }        },        determineContainer: function() {          if(settings.container) {            $container = $(settings.container);          }          else {            $container = $module.offsetParent();          }        },        determineContext: function() {          if(settings.context) {            $context = $(settings.context);          }          else {            $context = $container;          }          if($context.length === 0) {            module.error(error.invalidContext, settings.context, $module);            return;          }        },        checkErrors: function() {          if( module.is.hidden() ) {            module.error(error.visible, $module);          }          if(module.cache.element.height > module.cache.context.height) {            module.reset();            module.error(error.elementSize, $module);            return;          }        },        bind: {          events: function() {            $window              .on('load' + eventNamespace, module.event.load)              .on('resize' + eventNamespace, module.event.resize)            ;            // pub/sub pattern            $scroll              .off('scroll' + eventNamespace)              .on('scroll' + eventNamespace, module.event.scroll)              .on('scrollchange' + eventNamespace, module.event.scrollchange)            ;          }        },        event: {          changed: function(mutations) {            clearTimeout(module.timer);            module.timer = setTimeout(function() {              module.verbose('DOM tree modified, updating sticky menu', mutations);              module.refresh();            }, 100);          },          documentChanged: function(mutations) {            [].forEach.call(mutations, function(mutation) {              if(mutation.removedNodes) {                [].forEach.call(mutation.removedNodes, function(node) {                  if(node == element || $(node).find(element).length > 0) {                    module.debug('Element removed from DOM, tearing down events');                    module.destroy();                  }                });              }            });          },          load: function() {            module.verbose('Page contents finished loading');            requestAnimationFrame(module.refresh);          },          resize: function() {            module.verbose('Window resized');            requestAnimationFrame(module.refresh);          },          scroll: function() {            requestAnimationFrame(function() {              $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop() );            });          },          scrollchange: function(event, scrollPosition) {            module.stick(scrollPosition);            settings.onScroll.call(element);          }        },        refresh: function(hardRefresh) {          module.reset();          if(!settings.context) {            module.determineContext();          }          if(hardRefresh) {            module.determineContainer();          }          module.save.positions();          module.stick();          settings.onReposition.call(element);        },        supports: {          sticky: function() {            var              $element = $('<div/>'),              element = $element[0]            ;            $element.addClass(className.supported);            return($element.css('position').match('sticky'));          }        },        save: {          lastScroll: function(scroll) {            module.lastScroll = scroll;          },          elementScroll: function(scroll) {            module.elementScroll = scroll;          },          positions: function() {            var              scrollContext = {                height : $scroll.height()              },              element = {                margin: {                  top    : parseInt($module.css('margin-top'), 10),                  bottom : parseInt($module.css('margin-bottom'), 10),                },                offset : $module.offset(),                width  : $module.outerWidth(),                height : $module.outerHeight()              },              context = {                offset : $context.offset(),                height : $context.outerHeight()              },              container = {                height: $container.outerHeight()              }            ;            if( !module.is.standardScroll() ) {              module.debug('Non-standard scroll. Removing scroll offset from element offset');              scrollContext.top  = $scroll.scrollTop();              scrollContext.left = $scroll.scrollLeft();              element.offset.top  += scrollContext.top;              context.offset.top  += scrollContext.top;              element.offset.left += scrollContext.left;              context.offset.left += scrollContext.left;            }            module.cache = {              fits          : ( (element.height + settings.offset) <= scrollContext.height),              sameHeight    : (element.height == context.height),              scrollContext : {                height : scrollContext.height              },              element: {                margin : element.margin,                top    : element.offset.top - element.margin.top,                left   : element.offset.left,                width  : element.width,                height : element.height,                bottom : element.offset.top + element.height              },              context: {                top           : context.offset.top,                height        : context.height,                bottom        : context.offset.top + context.height              }            };            module.set.containerSize();            module.stick();            module.debug('Caching element positions', module.cache);          }        },        get: {          direction: function(scroll) {            var              direction = 'down'            ;            scroll = scroll || $scroll.scrollTop();            if(module.lastScroll !== undefined) {              if(module.lastScroll < scroll) {                direction = 'down';              }              else if(module.lastScroll > scroll) {                direction = 'up';              }            }            return direction;          },          scrollChange: function(scroll) {            scroll = scroll || $scroll.scrollTop();            return (module.lastScroll)              ? (scroll - module.lastScroll)              : 0            ;          },          currentElementScroll: function() {            if(module.elementScroll) {              return module.elementScroll;            }            return ( module.is.top() )              ? Math.abs(parseInt($module.css('top'), 10))    || 0              : Math.abs(parseInt($module.css('bottom'), 10)) || 0            ;          },          elementScroll: function(scroll) {            scroll = scroll || $scroll.scrollTop();            var              element        = module.cache.element,              scrollContext  = module.cache.scrollContext,              delta          = module.get.scrollChange(scroll),              maxScroll      = (element.height - scrollContext.height + settings.offset),              elementScroll  = module.get.currentElementScroll(),              possibleScroll = (elementScroll + delta)            ;            if(module.cache.fits || possibleScroll < 0) {              elementScroll = 0;            }            else if(possibleScroll > maxScroll ) {              elementScroll = maxScroll;            }            else {              elementScroll = possibleScroll;            }            return elementScroll;          }        },        remove: {          lastScroll: function() {            delete module.lastScroll;          },          elementScroll: function(scroll) {            delete module.elementScroll;          },          minimumSize: function() {            $container              .css('min-height', '')            ;          },          offset: function() {            $module.css('margin-top', '');          }        },        set: {          offset: function() {            module.verbose('Setting offset on element', settings.offset);            $module              .css('margin-top', settings.offset)            ;          },          containerSize: function() {            var              tagName = $container.get(0).tagName            ;            if(tagName === 'HTML' || tagName == 'body') {              // this can trigger for too many reasons              //module.error(error.container, tagName, $module);              module.determineContainer();            }            else {              if( Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) {                module.debug('Context has padding, specifying exact height for container', module.cache.context.height);                $container.css({                  height: module.cache.context.height                });              }            }          },          minimumSize: function() {            var              element   = module.cache.element            ;            $container              .css('min-height', element.height)            ;          },          scroll: function(scroll) {            module.debug('Setting scroll on element', scroll);            if(module.elementScroll == scroll) {              return;            }            if( module.is.top() ) {              $module                .css('bottom', '')                .css('top', -scroll)              ;            }            if( module.is.bottom() ) {              $module                .css('top', '')                .css('bottom', scroll)              ;            }          },          size: function() {            if(module.cache.element.height !== 0 && module.cache.element.width !== 0) {              element.style.setProperty('width',  module.cache.element.width  + 'px', 'important');              element.style.setProperty('height', module.cache.element.height + 'px', 'important');            }          }        },        is: {          standardScroll: function() {            return ($scroll[0] == window);          },          top: function() {            return $module.hasClass(className.top);          },          bottom: function() {            return $module.hasClass(className.bottom);          },          initialPosition: function() {            return (!module.is.fixed() && !module.is.bound());          },          hidden: function() {            return (!$module.is(':visible'));          },          bound: function() {            return $module.hasClass(className.bound);          },          fixed: function() {            return $module.hasClass(className.fixed);          }        },        stick: function(scroll) {          var            cachedPosition = scroll || $scroll.scrollTop(),            cache          = module.cache,            fits           = cache.fits,            sameHeight     = cache.sameHeight,            element        = cache.element,            scrollContext  = cache.scrollContext,            context        = cache.context,            offset         = (module.is.bottom() && settings.pushing)              ? settings.bottomOffset              : settings.offset,            scroll         = {              top    : cachedPosition + offset,              bottom : cachedPosition + offset + scrollContext.height            },            direction      = module.get.direction(scroll.top),            elementScroll  = (fits)              ? 0              : module.get.elementScroll(scroll.top),            // shorthand            doesntFit      = !fits,            elementVisible = (element.height !== 0)          ;          if(elementVisible && !sameHeight) {            if( module.is.initialPosition() ) {              if(scroll.top >= context.bottom) {                module.debug('Initial element position is bottom of container');                module.bindBottom();              }              else if(scroll.top > element.top) {                if( (element.height + scroll.top - elementScroll) >= context.bottom ) {                  module.debug('Initial element position is bottom of container');                  module.bindBottom();                }                else {                  module.debug('Initial element position is fixed');                  module.fixTop();                }              }            }            else if( module.is.fixed() ) {              // currently fixed top              if( module.is.top() ) {                if( scroll.top <= element.top ) {                  module.debug('Fixed element reached top of container');                  module.setInitialPosition();                }                else if( (element.height + scroll.top - elementScroll) >= context.bottom ) {                  module.debug('Fixed element reached bottom of container');                  module.bindBottom();                }                // scroll element if larger than screen                else if(doesntFit) {                  module.set.scroll(elementScroll);                  module.save.lastScroll(scroll.top);                  module.save.elementScroll(elementScroll);                }              }              // currently fixed bottom              else if(module.is.bottom() ) {                // top edge                if( (scroll.bottom - element.height) <= element.top) {                  module.debug('Bottom fixed rail has reached top of container');                  module.setInitialPosition();                }                // bottom edge                else if(scroll.bottom >= context.bottom) {                  module.debug('Bottom fixed rail has reached bottom of container');                  module.bindBottom();                }                // scroll element if larger than screen                else if(doesntFit) {                  module.set.scroll(elementScroll);                  module.save.lastScroll(scroll.top);                  module.save.elementScroll(elementScroll);                }              }            }            else if( module.is.bottom() ) {              if( scroll.top <= element.top ) {                module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button');                module.setInitialPosition();              }              else {                if(settings.pushing) {                  if(module.is.bound() && scroll.bottom <= context.bottom ) {                    module.debug('Fixing bottom attached element to bottom of browser.');                    module.fixBottom();                  }                }                else {                  if(module.is.bound() && (scroll.top <= context.bottom - element.height) ) {                    module.debug('Fixing bottom attached element to top of browser.');                    module.fixTop();                  }                }              }            }          }        },        bindTop: function() {          module.debug('Binding element to top of parent container');          module.remove.offset();          $module            .css({              left         : '',              top          : '',              marginBottom : ''            })            .removeClass(className.fixed)            .removeClass(className.bottom)            .addClass(className.bound)            .addClass(className.top)          ;          settings.onTop.call(element);          settings.onUnstick.call(element);        },        bindBottom: function() {          module.debug('Binding element to bottom of parent container');          module.remove.offset();          $module            .css({              left         : '',              top          : ''            })            .removeClass(className.fixed)            .removeClass(className.top)            .addClass(className.bound)            .addClass(className.bottom)          ;          settings.onBottom.call(element);          settings.onUnstick.call(element);        },        setInitialPosition: function() {          module.debug('Returning to initial position');          module.unfix();          module.unbind();        },        fixTop: function() {          module.debug('Fixing element to top of page');          if(settings.setSize) {            module.set.size();          }          module.set.minimumSize();          module.set.offset();          $module            .css({              left         : module.cache.element.left,              bottom       : '',              marginBottom : ''            })            .removeClass(className.bound)            .removeClass(className.bottom)            .addClass(className.fixed)            .addClass(className.top)          ;          settings.onStick.call(element);        },        fixBottom: function() {          module.debug('Sticking element to bottom of page');          if(settings.setSize) {            module.set.size();          }          module.set.minimumSize();          module.set.offset();          $module            .css({              left         : module.cache.element.left,              bottom       : '',              marginBottom : ''            })            .removeClass(className.bound)            .removeClass(className.top)            .addClass(className.fixed)            .addClass(className.bottom)          ;          settings.onStick.call(element);        },        unbind: function() {          if( module.is.bound() ) {            module.debug('Removing container bound position on element');            module.remove.offset();            $module              .removeClass(className.bound)              .removeClass(className.top)              .removeClass(className.bottom)            ;          }        },        unfix: function() {          if( module.is.fixed() ) {            module.debug('Removing fixed position on element');            module.remove.minimumSize();            module.remove.offset();            $module              .removeClass(className.fixed)              .removeClass(className.top)              .removeClass(className.bottom)            ;            settings.onUnstick.call(element);          }        },        reset: function() {          module.debug('Resetting elements position');          module.unbind();          module.unfix();          module.resetCSS();          module.remove.offset();          module.remove.lastScroll();        },        resetCSS: function() {          $module            .css({              width  : '',              height : ''            })          ;          $container            .css({              height: ''            })          ;        },        setting: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            settings[name] = value;          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 0);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.sticky.settings = {  name           : 'Sticky',  namespace      : 'sticky',  silent         : false,  debug          : false,  verbose        : true,  performance    : true,  // whether to stick in the opposite direction on scroll up  pushing        : false,  context        : false,  container      : false,  // Context to watch scroll events  scrollContext  : window,  // Offset to adjust scroll  offset         : 0,  // Offset to adjust scroll when attached to bottom of screen  bottomOffset   : 0,  // will only set container height if difference between context and container is larger than this number  jitter         : 5,  // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set)  setSize        : true,  // Whether to automatically observe changes with Mutation Observers  observeChanges : false,  // Called when position is recalculated  onReposition   : function(){},  // Called on each scroll  onScroll       : function(){},  // Called when element is stuck to viewport  onStick        : function(){},  // Called when element is unstuck from viewport  onUnstick      : function(){},  // Called when element reaches top of context  onTop          : function(){},  // Called when element reaches bottom of context  onBottom       : function(){},  error         : {    container      : 'Sticky element must be inside a relative container',    visible        : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.',    method         : 'The method you called is not defined.',    invalidContext : 'Context specified does not exist',    elementSize    : 'Sticky element is larger than its container, cannot create sticky.'  },  className : {    bound     : 'bound',    fixed     : 'fixed',    supported : 'native',    top       : 'top',    bottom    : 'bottom'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Tab * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.tab = function(parameters) {  var    // use window context if none specified    $allModules     = $.isFunction(this)        ? $(window)        : $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    query           = arguments[0],    methodInvoked   = (typeof query == 'string'),    queryArguments  = [].slice.call(arguments, 1),    initializedHistory = false,    returnedValue  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.tab.settings, parameters)          : $.extend({}, $.fn.tab.settings),        className       = settings.className,        metadata        = settings.metadata,        selector        = settings.selector,        error           = settings.error,        eventNamespace  = '.' + settings.namespace,        moduleNamespace = 'module-' + settings.namespace,        $module         = $(this),        $context,        $tabs,        cache           = {},        firstLoad       = true,        recursionDepth  = 0,        element         = this,        instance        = $module.data(moduleNamespace),        activeTabPath,        parameterArray,        module,        historyEvent      ;      module = {        initialize: function() {          module.debug('Initializing tab menu item', $module);          module.fix.callbacks();          module.determineTabs();          module.debug('Determining tabs', settings.context, $tabs);          // set up automatic routing          if(settings.auto) {            module.set.auto();          }          module.bind.events();          if(settings.history && !initializedHistory) {            module.initializeHistory();            initializedHistory = true;          }          module.instantiate();        },        instantiate: function () {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, module)          ;        },        destroy: function() {          module.debug('Destroying tabs', $module);          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        bind: {          events: function() {            // if using $.tab don't add events            if( !$.isWindow( element ) ) {              module.debug('Attaching tab activation events to element', $module);              $module                .on('click' + eventNamespace, module.event.click)              ;            }          }        },        determineTabs: function() {          var            $reference          ;          // determine tab context          if(settings.context === 'parent') {            if($module.closest(selector.ui).length > 0) {              $reference = $module.closest(selector.ui);              module.verbose('Using closest UI element as parent', $reference);            }            else {              $reference = $module;            }            $context = $reference.parent();            module.verbose('Determined parent element for creating context', $context);          }          else if(settings.context) {            $context = $(settings.context);            module.verbose('Using selector for tab context', settings.context, $context);          }          else {            $context = $('body');          }          // find tabs          if(settings.childrenOnly) {            $tabs = $context.children(selector.tabs);            module.debug('Searching tab context children for tabs', $context, $tabs);          }          else {            $tabs = $context.find(selector.tabs);            module.debug('Searching tab context for tabs', $context, $tabs);          }        },        fix: {          callbacks: function() {            if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {              if(parameters.onTabLoad) {                parameters.onLoad = parameters.onTabLoad;                delete parameters.onTabLoad;                module.error(error.legacyLoad, parameters.onLoad);              }              if(parameters.onTabInit) {                parameters.onFirstLoad = parameters.onTabInit;                delete parameters.onTabInit;                module.error(error.legacyInit, parameters.onFirstLoad);              }              settings = $.extend(true, {}, $.fn.tab.settings, parameters);            }          }        },        initializeHistory: function() {          module.debug('Initializing page state');          if( $.address === undefined ) {            module.error(error.state);            return false;          }          else {            if(settings.historyType == 'state') {              module.debug('Using HTML5 to manage state');              if(settings.path !== false) {                $.address                  .history(true)                  .state(settings.path)                ;              }              else {                module.error(error.path);                return false;              }            }            $.address              .bind('change', module.event.history.change)            ;          }        },        event: {          click: function(event) {            var              tabPath = $(this).data(metadata.tab)            ;            if(tabPath !== undefined) {              if(settings.history) {                module.verbose('Updating page state', event);                $.address.value(tabPath);              }              else {                module.verbose('Changing tab', event);                module.changeTab(tabPath);              }              event.preventDefault();            }            else {              module.debug('No tab specified');            }          },          history: {            change: function(event) {              var                tabPath   = event.pathNames.join('/') || module.get.initialPath(),                pageTitle = settings.templates.determineTitle(tabPath) || false              ;              module.performance.display();              module.debug('History change event', tabPath, event);              historyEvent = event;              if(tabPath !== undefined) {                module.changeTab(tabPath);              }              if(pageTitle) {                $.address.title(pageTitle);              }            }          }        },        refresh: function() {          if(activeTabPath) {            module.debug('Refreshing tab', activeTabPath);            module.changeTab(activeTabPath);          }        },        cache: {          read: function(cacheKey) {            return (cacheKey !== undefined)              ? cache[cacheKey]              : false            ;          },          add: function(cacheKey, content) {            cacheKey = cacheKey || activeTabPath;            module.debug('Adding cached content for', cacheKey);            cache[cacheKey] = content;          },          remove: function(cacheKey) {            cacheKey = cacheKey || activeTabPath;            module.debug('Removing cached content for', cacheKey);            delete cache[cacheKey];          }        },        set: {          auto: function() {            var              url = (typeof settings.path == 'string')                ? settings.path.replace(/\/$/, '') + '/{$tab}'                : '/{$tab}'            ;            module.verbose('Setting up automatic tab retrieval from server', url);            if($.isPlainObject(settings.apiSettings)) {              settings.apiSettings.url = url;            }            else {              settings.apiSettings = {                url: url              };            }          },          loading: function(tabPath) {            var              $tab      = module.get.tabElement(tabPath),              isLoading = $tab.hasClass(className.loading)            ;            if(!isLoading) {              module.verbose('Setting loading state for', $tab);              $tab                .addClass(className.loading)                .siblings($tabs)                  .removeClass(className.active + ' ' + className.loading)              ;              if($tab.length > 0) {                settings.onRequest.call($tab[0], tabPath);              }            }          },          state: function(state) {            $.address.value(state);          }        },        changeTab: function(tabPath) {          var            pushStateAvailable = (window.history && window.history.pushState),            shouldIgnoreLoad   = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),            remoteContent      = (settings.auto || $.isPlainObject(settings.apiSettings) ),            // only add default path if not remote content            pathArray = (remoteContent && !shouldIgnoreLoad)              ? module.utilities.pathToArray(tabPath)              : module.get.defaultPathArray(tabPath)          ;          tabPath = module.utilities.arrayToPath(pathArray);          $.each(pathArray, function(index, tab) {            var              currentPathArray   = pathArray.slice(0, index + 1),              currentPath        = module.utilities.arrayToPath(currentPathArray),              isTab              = module.is.tab(currentPath),              isLastIndex        = (index + 1 == pathArray.length),              $tab               = module.get.tabElement(currentPath),              $anchor,              nextPathArray,              nextPath,              isLastTab            ;            module.verbose('Looking for tab', tab);            if(isTab) {              module.verbose('Tab was found', tab);              // scope up              activeTabPath  = currentPath;              parameterArray = module.utilities.filterArray(pathArray, currentPathArray);              if(isLastIndex) {                isLastTab = true;              }              else {                nextPathArray = pathArray.slice(0, index + 2);                nextPath      = module.utilities.arrayToPath(nextPathArray);                isLastTab     = ( !module.is.tab(nextPath) );                if(isLastTab) {                  module.verbose('Tab parameters found', nextPathArray);                }              }              if(isLastTab && remoteContent) {                if(!shouldIgnoreLoad) {                  module.activate.navigation(currentPath);                  module.fetch.content(currentPath, tabPath);                }                else {                  module.debug('Ignoring remote content on first tab load', currentPath);                  firstLoad = false;                  module.cache.add(tabPath, $tab.html());                  module.activate.all(currentPath);                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                  settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                return false;              }              else {                module.debug('Opened local tab', currentPath);                module.activate.all(currentPath);                if( !module.cache.read(currentPath) ) {                  module.cache.add(currentPath, true);                  module.debug('First time tab loaded calling tab init');                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);              }            }            else if(tabPath.search('/') == -1 && tabPath !== '') {              // look for in page anchor              $anchor     = $('#' + tabPath + ', a[name="' + tabPath + '"]');              currentPath = $anchor.closest('[data-tab]').data(metadata.tab);              $tab        = module.get.tabElement(currentPath);              // if anchor exists use parent tab              if($anchor && $anchor.length > 0 && currentPath) {                module.debug('Anchor link used, opening parent tab', $tab, $anchor);                if( !$tab.hasClass(className.active) ) {                  setTimeout(function() {                    module.scrollTo($anchor);                  }, 0);                }                module.activate.all(currentPath);                if( !module.cache.read(currentPath) ) {                  module.cache.add(currentPath, true);                  module.debug('First time tab loaded calling tab init');                  settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);                }                settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);                return false;              }            }            else {              module.error(error.missingTab, $module, $context, currentPath);              return false;            }          });        },        scrollTo: function($element) {          var            scrollOffset = ($element && $element.length > 0)              ? $element.offset().top              : false          ;          if(scrollOffset !== false) {            module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);            $(document).scrollTop(scrollOffset);          }        },        update: {          content: function(tabPath, html, evaluateScripts) {            var              $tab = module.get.tabElement(tabPath),              tab  = $tab[0]            ;            evaluateScripts = (evaluateScripts !== undefined)              ? evaluateScripts              : settings.evaluateScripts            ;            if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {              $tab                .empty()                .append($(html).clone(true))              ;            }            else {              if(evaluateScripts) {                module.debug('Updating HTML and evaluating inline scripts', tabPath, html);                $tab.html(html);              }              else {                module.debug('Updating HTML', tabPath, html);                tab.innerHTML = html;              }            }          }        },        fetch: {          content: function(tabPath, fullTabPath) {            var              $tab        = module.get.tabElement(tabPath),              apiSettings = {                dataType         : 'html',                encodeParameters : false,                on               : 'now',                cache            : settings.alwaysRefresh,                headers          : {                  'X-Remote': true                },                onSuccess : function(response) {                  if(settings.cacheType == 'response') {                    module.cache.add(fullTabPath, response);                  }                  module.update.content(tabPath, response);                  if(tabPath == activeTabPath) {                    module.debug('Content loaded', tabPath);                    module.activate.tab(tabPath);                  }                  else {                    module.debug('Content loaded in background', tabPath);                  }                  settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);                  settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);                  if(settings.loadOnce) {                    module.cache.add(fullTabPath, true);                  }                  else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {                    setTimeout(function() {                      var                        $clone = $tab.children().clone(true)                      ;                      $clone = $clone.not('script');                      module.cache.add(fullTabPath, $clone);                    }, 0);                  }                  else {                    module.cache.add(fullTabPath, $tab.html());                  }                },                urlData: {                  tab: fullTabPath                }              },              request         = $tab.api('get request') || false,              existingRequest = ( request && request.state() === 'pending' ),              requestSettings,              cachedContent            ;            fullTabPath   = fullTabPath || tabPath;            cachedContent = module.cache.read(fullTabPath);            if(settings.cache && cachedContent) {              module.activate.tab(tabPath);              module.debug('Adding cached content', fullTabPath);              if(!settings.loadOnce) {                if(settings.evaluateScripts == 'once') {                  module.update.content(tabPath, cachedContent, false);                }                else {                  module.update.content(tabPath, cachedContent);                }              }              settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);            }            else if(existingRequest) {              module.set.loading(tabPath);              module.debug('Content is already loading', fullTabPath);            }            else if($.api !== undefined) {              requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);              module.debug('Retrieving remote content', fullTabPath, requestSettings);              module.set.loading(tabPath);              $tab.api(requestSettings);            }            else {              module.error(error.api);            }          }        },        activate: {          all: function(tabPath) {            module.activate.tab(tabPath);            module.activate.navigation(tabPath);          },          tab: function(tabPath) {            var              $tab          = module.get.tabElement(tabPath),              $deactiveTabs = (settings.deactivate == 'siblings')                ? $tab.siblings($tabs)                : $tabs.not($tab),              isActive      = $tab.hasClass(className.active)            ;            module.verbose('Showing tab content for', $tab);            if(!isActive) {              $tab                .addClass(className.active)              ;              $deactiveTabs                .removeClass(className.active + ' ' + className.loading)              ;              if($tab.length > 0) {                settings.onVisible.call($tab[0], tabPath);              }            }          },          navigation: function(tabPath) {            var              $navigation         = module.get.navElement(tabPath),              $deactiveNavigation = (settings.deactivate == 'siblings')                ? $navigation.siblings($allModules)                : $allModules.not($navigation),              isActive    = $navigation.hasClass(className.active)            ;            module.verbose('Activating tab navigation for', $navigation, tabPath);            if(!isActive) {              $navigation                .addClass(className.active)              ;              $deactiveNavigation                .removeClass(className.active + ' ' + className.loading)              ;            }          }        },        deactivate: {          all: function() {            module.deactivate.navigation();            module.deactivate.tabs();          },          navigation: function() {            $allModules              .removeClass(className.active)            ;          },          tabs: function() {            $tabs              .removeClass(className.active + ' ' + className.loading)            ;          }        },        is: {          tab: function(tabName) {            return (tabName !== undefined)              ? ( module.get.tabElement(tabName).length > 0 )              : false            ;          }        },        get: {          initialPath: function() {            return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);          },          path: function() {            return $.address.value();          },          // adds default tabs to tab path          defaultPathArray: function(tabPath) {            return module.utilities.pathToArray( module.get.defaultPath(tabPath) );          },          defaultPath: function(tabPath) {            var              $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + tabPath + '/"]').eq(0),              defaultTab  = $defaultNav.data(metadata.tab) || false            ;            if( defaultTab ) {              module.debug('Found default tab', defaultTab);              if(recursionDepth < settings.maxDepth) {                recursionDepth++;                return module.get.defaultPath(defaultTab);              }              module.error(error.recursion);            }            else {              module.debug('No default tabs found for', tabPath, $tabs);            }            recursionDepth = 0;            return tabPath;          },          navElement: function(tabPath) {            tabPath = tabPath || activeTabPath;            return $allModules.filter('[data-' + metadata.tab + '="' + tabPath + '"]');          },          tabElement: function(tabPath) {            var              $fullPathTab,              $simplePathTab,              tabPathArray,              lastTab            ;            tabPath        = tabPath || activeTabPath;            tabPathArray   = module.utilities.pathToArray(tabPath);            lastTab        = module.utilities.last(tabPathArray);            $fullPathTab   = $tabs.filter('[data-' + metadata.tab + '="' + tabPath + '"]');            $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + lastTab + '"]');            return ($fullPathTab.length > 0)              ? $fullPathTab              : $simplePathTab            ;          },          tab: function() {            return activeTabPath;          }        },        utilities: {          filterArray: function(keepArray, removeArray) {            return $.grep(keepArray, function(keepValue) {              return ( $.inArray(keepValue, removeArray) == -1);            });          },          last: function(array) {            return $.isArray(array)              ? array[ array.length - 1]              : false            ;          },          pathToArray: function(pathName) {            if(pathName === undefined) {              pathName = activeTabPath;            }            return typeof pathName == 'string'              ? pathName.split('/')              : [pathName]            ;          },          arrayToPath: function(pathArray) {            return $.isArray(pathArray)              ? pathArray.join('/')              : false            ;          }        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};// shortcut for tabbed content with no defined navigation$.tab = function() {  $(window).tab.apply(this, arguments);};$.fn.tab.settings = {  name            : 'Tab',  namespace       : 'tab',  silent          : false,  debug           : false,  verbose         : false,  performance     : true,  auto            : false,      // uses pjax style endpoints fetching content from same url with remote-content headers  history         : false,      // use browser history  historyType     : 'hash',     // #/ or html5 state  path            : false,      // base path of url  context         : false,      // specify a context that tabs must appear inside  childrenOnly    : false,      // use only tabs that are children of context  maxDepth        : 25,         // max depth a tab can be nested  deactivate      : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together  alwaysRefresh   : false,      // load tab content new every tab click  cache           : true,       // cache the content requests to pull locally  loadOnce        : false,      // Whether tab data should only be loaded once when using remote content  cacheType       : 'response', // Whether to cache exact response, or to html cache contents after scripts execute  ignoreFirstLoad : false,      // don't load remote content on first load  apiSettings     : false,      // settings for api call  evaluateScripts : 'once',     // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content  onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded  onLoad      : function(tabPath, parameterArray, historyEvent) {}, // called on every load  onVisible   : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible  onRequest   : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content  templates : {    determineTitle: function(tabArray) {} // returns page title for path  },  error: {    api        : 'You attempted to load content without API module',    method     : 'The method you called is not defined',    missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',    noContent  : 'The tab you specified is missing a content url.',    path       : 'History enabled, but no path was specified',    recursion  : 'Max recursive depth reached',    legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',    legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',    state      : 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>'  },  metadata : {    tab    : 'tab',    loaded : 'loaded',    promise: 'promise'  },  className   : {    loading : 'loading',    active  : 'active'  },  selector    : {    tabs : '.ui.tab',    ui   : '.ui'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Transition * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.transition = function() {  var    $allModules     = $(this),    moduleSelector  = $allModules.selector || '',    time            = new Date().getTime(),    performance     = [],    moduleArguments = arguments,    query           = moduleArguments[0],    queryArguments  = [].slice.call(arguments, 1),    methodInvoked   = (typeof query === 'string'),    requestAnimationFrame = window.requestAnimationFrame      || window.mozRequestAnimationFrame      || window.webkitRequestAnimationFrame      || window.msRequestAnimationFrame      || function(callback) { setTimeout(callback, 0); },    returnedValue  ;  $allModules    .each(function(index) {      var        $module  = $(this),        element  = this,        // set at run time        settings,        instance,        error,        className,        metadata,        animationEnd,        animationName,        namespace,        moduleNamespace,        eventNamespace,        module      ;      module = {        initialize: function() {          // get full settings          settings        = module.get.settings.apply(element, moduleArguments);          // shorthand          className       = settings.className;          error           = settings.error;          metadata        = settings.metadata;          // define namespace          eventNamespace  = '.' + settings.namespace;          moduleNamespace = 'module-' + settings.namespace;          instance        = $module.data(moduleNamespace) || module;          // get vendor specific events          animationEnd    = module.get.animationEndEvent();          if(methodInvoked) {            methodInvoked = module.invoke(query);          }          // method not invoked, lets run an animation          if(methodInvoked === false) {            module.verbose('Converted arguments into settings object', settings);            if(settings.interval) {              module.delay(settings.animate);            }            else  {              module.animate();            }            module.instantiate();          }        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        destroy: function() {          module.verbose('Destroying previous module for', element);          $module            .removeData(moduleNamespace)          ;        },        refresh: function() {          module.verbose('Refreshing display type on next animation');          delete module.displayType;        },        forceRepaint: function() {          module.verbose('Forcing element repaint');          var            $parentElement = $module.parent(),            $nextElement = $module.next()          ;          if($nextElement.length === 0) {            $module.detach().appendTo($parentElement);          }          else {            $module.detach().insertBefore($nextElement);          }        },        repaint: function() {          module.verbose('Repainting element');          var            fakeAssignment = element.offsetWidth          ;        },        delay: function(interval) {          var            direction = module.get.animationDirection(),            shouldReverse,            delay          ;          if(!direction) {            direction = module.can.transition()              ? module.get.direction()              : 'static'            ;          }          interval = (interval !== undefined)            ? interval            : settings.interval          ;          shouldReverse = (settings.reverse == 'auto' && direction == className.outward);          delay = (shouldReverse || settings.reverse == true)            ? ($allModules.length - index) * settings.interval            : index * settings.interval          ;          module.debug('Delaying animation by', delay);          setTimeout(module.animate, delay);        },        animate: function(overrideSettings) {          settings = overrideSettings || settings;          if(!module.is.supported()) {            module.error(error.support);            return false;          }          module.debug('Preparing animation', settings.animation);          if(module.is.animating()) {            if(settings.queue) {              if(!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) {                module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation);              }              else {                module.queue(settings.animation);              }              return false;            }            else if(!settings.allowRepeats && module.is.occurring()) {              module.debug('Animation is already occurring, will not execute repeated animation', settings.animation);              return false;            }            else {              module.debug('New animation started, completing previous early', settings.animation);              instance.complete();            }          }          if( module.can.animate() ) {            module.set.animating(settings.animation);          }          else {            module.error(error.noAnimation, settings.animation, element);          }        },        reset: function() {          module.debug('Resetting animation to beginning conditions');          module.remove.animationCallbacks();          module.restore.conditions();          module.remove.animating();        },        queue: function(animation) {          module.debug('Queueing animation of', animation);          module.queuing = true;          $module            .one(animationEnd + '.queue' + eventNamespace, function() {              module.queuing = false;              module.repaint();              module.animate.apply(this, settings);            })          ;        },        complete: function (event) {          module.debug('Animation complete', settings.animation);          module.remove.completeCallback();          module.remove.failSafe();          if(!module.is.looping()) {            if( module.is.outward() ) {              module.verbose('Animation is outward, hiding element');              module.restore.conditions();              module.hide();            }            else if( module.is.inward() ) {              module.verbose('Animation is outward, showing element');              module.restore.conditions();              module.show();            }            else {              module.verbose('Static animation completed');              module.restore.conditions();              settings.onComplete.call(element);            }          }        },        force: {          visible: function() {            var              style          = $module.attr('style'),              userStyle      = module.get.userStyle(),              displayType    = module.get.displayType(),              overrideStyle  = userStyle + 'display: ' + displayType + ' !important;',              currentDisplay = $module.css('display'),              emptyStyle     = (style === undefined || style === '')            ;            if(currentDisplay !== displayType) {              module.verbose('Overriding default display to show element', displayType);              $module                .attr('style', overrideStyle)              ;            }            else if(emptyStyle) {              $module.removeAttr('style');            }          },          hidden: function() {            var              style          = $module.attr('style'),              currentDisplay = $module.css('display'),              emptyStyle     = (style === undefined || style === '')            ;            if(currentDisplay !== 'none' && !module.is.hidden()) {              module.verbose('Overriding default display to hide element');              $module                .css('display', 'none')              ;            }            else if(emptyStyle) {              $module                .removeAttr('style')              ;            }          }        },        has: {          direction: function(animation) {            var              hasDirection = false            ;            animation = animation || settings.animation;            if(typeof animation === 'string') {              animation = animation.split(' ');              $.each(animation, function(index, word){                if(word === className.inward || word === className.outward) {                  hasDirection = true;                }              });            }            return hasDirection;          },          inlineDisplay: function() {            var              style = $module.attr('style') || ''            ;            return $.isArray(style.match(/display.*?;/, ''));          }        },        set: {          animating: function(animation) {            var              animationClass,              direction            ;            // remove previous callbacks            module.remove.completeCallback();            // determine exact animation            animation      = animation || settings.animation;            animationClass = module.get.animationClass(animation);            // save animation class in cache to restore class names            module.save.animation(animationClass);            // override display if necessary so animation appears visibly            module.force.visible();            module.remove.hidden();            module.remove.direction();            module.start.animation(animationClass);          },          duration: function(animationName, duration) {            duration = duration || settings.duration;            duration = (typeof duration == 'number')              ? duration + 'ms'              : duration            ;            if(duration || duration === 0) {              module.verbose('Setting animation duration', duration);              $module                .css({                  'animation-duration':  duration                })              ;            }          },          direction: function(direction) {            direction = direction || module.get.direction();            if(direction == className.inward) {              module.set.inward();            }            else {              module.set.outward();            }          },          looping: function() {            module.debug('Transition set to loop');            $module              .addClass(className.looping)            ;          },          hidden: function() {            $module              .addClass(className.transition)              .addClass(className.hidden)            ;          },          inward: function() {            module.debug('Setting direction to inward');            $module              .removeClass(className.outward)              .addClass(className.inward)            ;          },          outward: function() {            module.debug('Setting direction to outward');            $module              .removeClass(className.inward)              .addClass(className.outward)            ;          },          visible: function() {            $module              .addClass(className.transition)              .addClass(className.visible)            ;          }        },        start: {          animation: function(animationClass) {            animationClass = animationClass || module.get.animationClass();            module.debug('Starting tween', animationClass);            $module              .addClass(animationClass)              .one(animationEnd + '.complete' + eventNamespace, module.complete)            ;            if(settings.useFailSafe) {              module.add.failSafe();            }            module.set.duration(settings.duration);            settings.onStart.call(element);          }        },        save: {          animation: function(animation) {            if(!module.cache) {              module.cache = {};            }            module.cache.animation = animation;          },          displayType: function(displayType) {            if(displayType !== 'none') {              $module.data(metadata.displayType, displayType);            }          },          transitionExists: function(animation, exists) {            $.fn.transition.exists[animation] = exists;            module.verbose('Saving existence of transition', animation, exists);          }        },        restore: {          conditions: function() {            var              animation = module.get.currentAnimation()            ;            if(animation) {              $module                .removeClass(animation)              ;              module.verbose('Removing animation class', module.cache);            }            module.remove.duration();          }        },        add: {          failSafe: function() {            var              duration = module.get.duration()            ;            module.timer = setTimeout(function() {              $module.triggerHandler(animationEnd);            }, duration + settings.failSafeDelay);            module.verbose('Adding fail safe timer', module.timer);          }        },        remove: {          animating: function() {            $module.removeClass(className.animating);          },          animationCallbacks: function() {            module.remove.queueCallback();            module.remove.completeCallback();          },          queueCallback: function() {            $module.off('.queue' + eventNamespace);          },          completeCallback: function() {            $module.off('.complete' + eventNamespace);          },          display: function() {            $module.css('display', '');          },          direction: function() {            $module              .removeClass(className.inward)              .removeClass(className.outward)            ;          },          duration: function() {            $module              .css('animation-duration', '')            ;          },          failSafe: function() {            module.verbose('Removing fail safe timer', module.timer);            if(module.timer) {              clearTimeout(module.timer);            }          },          hidden: function() {            $module.removeClass(className.hidden);          },          visible: function() {            $module.removeClass(className.visible);          },          looping: function() {            module.debug('Transitions are no longer looping');            if( module.is.looping() ) {              module.reset();              $module                .removeClass(className.looping)              ;            }          },          transition: function() {            $module              .removeClass(className.visible)              .removeClass(className.hidden)            ;          }        },        get: {          settings: function(animation, duration, onComplete) {            // single settings object            if(typeof animation == 'object') {              return $.extend(true, {}, $.fn.transition.settings, animation);            }            // all arguments provided            else if(typeof onComplete == 'function') {              return $.extend({}, $.fn.transition.settings, {                animation  : animation,                onComplete : onComplete,                duration   : duration              });            }            // only duration provided            else if(typeof duration == 'string' || typeof duration == 'number') {              return $.extend({}, $.fn.transition.settings, {                animation : animation,                duration  : duration              });            }            // duration is actually settings object            else if(typeof duration == 'object') {              return $.extend({}, $.fn.transition.settings, duration, {                animation : animation              });            }            // duration is actually callback            else if(typeof duration == 'function') {              return $.extend({}, $.fn.transition.settings, {                animation  : animation,                onComplete : duration              });            }            // only animation provided            else {              return $.extend({}, $.fn.transition.settings, {                animation : animation              });            }          },          animationClass: function(animation) {            var              animationClass = animation || settings.animation,              directionClass = (module.can.transition() && !module.has.direction())                ? module.get.direction() + ' '                : ''            ;            return className.animating + ' '              + className.transition + ' '              + directionClass              + animationClass            ;          },          currentAnimation: function() {            return (module.cache && module.cache.animation !== undefined)              ? module.cache.animation              : false            ;          },          currentDirection: function() {            return module.is.inward()              ? className.inward              : className.outward            ;          },          direction: function() {            return module.is.hidden() || !module.is.visible()              ? className.inward              : className.outward            ;          },          animationDirection: function(animation) {            var              direction            ;            animation = animation || settings.animation;            if(typeof animation === 'string') {              animation = animation.split(' ');              // search animation name for out/in class              $.each(animation, function(index, word){                if(word === className.inward) {                  direction = className.inward;                }                else if(word === className.outward) {                  direction = className.outward;                }              });            }            // return found direction            if(direction) {              return direction;            }            return false;          },          duration: function(duration) {            duration = duration || settings.duration;            if(duration === false) {              duration = $module.css('animation-duration') || 0;            }            return (typeof duration === 'string')              ? (duration.indexOf('ms') > -1)                ? parseFloat(duration)                : parseFloat(duration) * 1000              : duration            ;          },          displayType: function(shouldDetermine) {            shouldDetermine = (shouldDetermine !== undefined)              ? shouldDetermine              : true            ;            if(settings.displayType) {              return settings.displayType;            }            if(shouldDetermine && $module.data(metadata.displayType) === undefined) {              // create fake element to determine display state              module.can.transition(true);            }            return $module.data(metadata.displayType);          },          userStyle: function(style) {            style = style || $module.attr('style') || '';            return style.replace(/display.*?;/, '');          },          transitionExists: function(animation) {            return $.fn.transition.exists[animation];          },          animationStartEvent: function() {            var              element     = document.createElement('div'),              animations  = {                'animation'       :'animationstart',                'OAnimation'      :'oAnimationStart',                'MozAnimation'    :'mozAnimationStart',                'WebkitAnimation' :'webkitAnimationStart'              },              animation            ;            for(animation in animations){              if( element.style[animation] !== undefined ){                return animations[animation];              }            }            return false;          },          animationEndEvent: function() {            var              element     = document.createElement('div'),              animations  = {                'animation'       :'animationend',                'OAnimation'      :'oAnimationEnd',                'MozAnimation'    :'mozAnimationEnd',                'WebkitAnimation' :'webkitAnimationEnd'              },              animation            ;            for(animation in animations){              if( element.style[animation] !== undefined ){                return animations[animation];              }            }            return false;          }        },        can: {          transition: function(forced) {            var              animation         = settings.animation,              transitionExists  = module.get.transitionExists(animation),              displayType       = module.get.displayType(false),              elementClass,              tagName,              $clone,              currentAnimation,              inAnimation,              directionExists            ;            if( transitionExists === undefined || forced) {              module.verbose('Determining whether animation exists');              elementClass = $module.attr('class');              tagName      = $module.prop('tagName');              $clone = $('<' + tagName + ' />').addClass( elementClass ).insertAfter($module);              currentAnimation = $clone                .addClass(animation)                .removeClass(className.inward)                .removeClass(className.outward)                .addClass(className.animating)                .addClass(className.transition)                .css('animationName')              ;              inAnimation = $clone                .addClass(className.inward)                .css('animationName')              ;              if(!displayType) {                displayType = $clone                  .attr('class', elementClass)                  .removeAttr('style')                  .removeClass(className.hidden)                  .removeClass(className.visible)                  .show()                  .css('display')                ;                module.verbose('Determining final display state', displayType);                module.save.displayType(displayType);              }              $clone.remove();              if(currentAnimation != inAnimation) {                module.debug('Direction exists for animation', animation);                directionExists = true;              }              else if(currentAnimation == 'none' || !currentAnimation) {                module.debug('No animation defined in css', animation);                return;              }              else {                module.debug('Static animation found', animation, displayType);                directionExists = false;              }              module.save.transitionExists(animation, directionExists);            }            return (transitionExists !== undefined)              ? transitionExists              : directionExists            ;          },          animate: function() {            // can transition does not return a value if animation does not exist            return (module.can.transition() !== undefined);          }        },        is: {          animating: function() {            return $module.hasClass(className.animating);          },          inward: function() {            return $module.hasClass(className.inward);          },          outward: function() {            return $module.hasClass(className.outward);          },          looping: function() {            return $module.hasClass(className.looping);          },          occurring: function(animation) {            animation = animation || settings.animation;            animation = '.' + animation.replace(' ', '.');            return ( $module.filter(animation).length > 0 );          },          visible: function() {            return $module.is(':visible');          },          hidden: function() {            return $module.css('visibility') === 'hidden';          },          supported: function() {            return(animationEnd !== false);          }        },        hide: function() {          module.verbose('Hiding element');          if( module.is.animating() ) {            module.reset();          }          element.blur(); // IE will trigger focus change if element is not blurred before hiding          module.remove.display();          module.remove.visible();          module.set.hidden();          module.force.hidden();          settings.onHide.call(element);          settings.onComplete.call(element);          // module.repaint();        },        show: function(display) {          module.verbose('Showing element', display);          module.remove.hidden();          module.set.visible();          module.force.visible();          settings.onShow.call(element);          settings.onComplete.call(element);          // module.repaint();        },        toggle: function() {          if( module.is.visible() ) {            module.hide();          }          else {            module.show();          }        },        stop: function() {          module.debug('Stopping current animation');          $module.triggerHandler(animationEnd);        },        stopAll: function() {          module.debug('Stopping all animation');          module.remove.queueCallback();          $module.triggerHandler(animationEnd);        },        clear: {          queue: function() {            module.debug('Clearing animation queue');            module.remove.queueCallback();          }        },        enable: function() {          module.verbose('Starting animation');          $module.removeClass(className.disabled);        },        disable: function() {          module.debug('Stopping animation');          $module.addClass(className.disabled);        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if($allModules.length > 1) {              title += ' ' + '(' + $allModules.length + ')';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        // modified for transition to return invoke success        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return (found !== undefined)            ? found            : false          ;        }      };      module.initialize();    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};// Records if CSS transition is available$.fn.transition.exists = {};$.fn.transition.settings = {  // module info  name          : 'Transition',  // hide all output from this component regardless of other settings  silent        : false,  // debug content outputted to console  debug         : false,  // verbose debug output  verbose       : false,  // performance data output  performance   : true,  // event namespace  namespace     : 'transition',  // delay between animations in group  interval      : 0,  // whether group animations should be reversed  reverse       : 'auto',  // animation callback event  onStart       : function() {},  onComplete    : function() {},  onShow        : function() {},  onHide        : function() {},  // whether timeout should be used to ensure callback fires in cases animationend does not  useFailSafe   : true,  // delay in ms for fail safe  failSafeDelay : 100,  // whether EXACT animation can occur twice in a row  allowRepeats  : false,  // Override final display type on visible  displayType   : false,  // animation duration  animation     : 'fade',  duration      : false,  // new animations will occur after previous ones  queue         : true,  metadata : {    displayType: 'display'  },  className   : {    animating  : 'animating',    disabled   : 'disabled',    hidden     : 'hidden',    inward     : 'in',    loading    : 'loading',    looping    : 'looping',    outward    : 'out',    transition : 'transition',    visible    : 'visible'  },  // possible errors  error: {    noAnimation : 'Element is no longer attached to DOM. Unable to animate.  Use silent setting to surpress this warning in production.',    repeated    : 'That animation is already occurring, cancelling repeated animation',    method      : 'The method you called is not defined',    support     : 'This browser does not support CSS animations'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - API * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';var  window = (typeof window != 'undefined' && window.Math == Math)    ? window    : (typeof self != 'undefined' && self.Math == Math)      ? self      : Function('return this')();$.api = $.fn.api = function(parameters) {  var    // use window context if none specified    $allModules     = $.isFunction(this)        ? $(window)        : $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue  ;  $allModules    .each(function() {      var        settings          = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.api.settings, parameters)          : $.extend({}, $.fn.api.settings),        // internal aliases        namespace       = settings.namespace,        metadata        = settings.metadata,        selector        = settings.selector,        error           = settings.error,        className       = settings.className,        // define namespaces for modules        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        // element that creates request        $module         = $(this),        $form           = $module.closest(selector.form),        // context used for state        $context        = (settings.stateContext)          ? $(settings.stateContext)          : $module,        // request details        ajaxSettings,        requestSettings,        url,        data,        requestStartTime,        // standard module        element         = this,        context         = $context[0],        instance        = $module.data(moduleNamespace),        module      ;      module = {        initialize: function() {          if(!methodInvoked) {            module.bind.events();          }          module.instantiate();        },        instantiate: function() {          module.verbose('Storing instance of module', module);          instance = module;          $module            .data(moduleNamespace, instance)          ;        },        destroy: function() {          module.verbose('Destroying previous module for', element);          $module            .removeData(moduleNamespace)            .off(eventNamespace)          ;        },        bind: {          events: function() {            var              triggerEvent = module.get.event()            ;            if( triggerEvent ) {              module.verbose('Attaching API events to element', triggerEvent);              $module                .on(triggerEvent + eventNamespace, module.event.trigger)              ;            }            else if(settings.on == 'now') {              module.debug('Querying API endpoint immediately');              module.query();            }          }        },        decode: {          json: function(response) {            if(response !== undefined && typeof response == 'string') {              try {               response = JSON.parse(response);              }              catch(e) {                // isnt json string              }            }            return response;          }        },        read: {          cachedResponse: function(url) {            var              response            ;            if(window.Storage === undefined) {              module.error(error.noStorage);              return;            }            response = sessionStorage.getItem(url);            module.debug('Using cached response', url, response);            response = module.decode.json(response);            return response;          }        },        write: {          cachedResponse: function(url, response) {            if(response && response === '') {              module.debug('Response empty, not caching', response);              return;            }            if(window.Storage === undefined) {              module.error(error.noStorage);              return;            }            if( $.isPlainObject(response) ) {              response = JSON.stringify(response);            }            sessionStorage.setItem(url, response);            module.verbose('Storing cached response for url', url, response);          }        },        query: function() {          if(module.is.disabled()) {            module.debug('Element is disabled API request aborted');            return;          }          if(module.is.loading()) {            if(settings.interruptRequests) {              module.debug('Interrupting previous request');              module.abort();            }            else {              module.debug('Cancelling request, previous request is still pending');              return;            }          }          // pass element metadata to url (value, text)          if(settings.defaultData) {            $.extend(true, settings.urlData, module.get.defaultData());          }          // Add form content          if(settings.serializeForm) {            settings.data = module.add.formData(settings.data);          }          // call beforesend and get any settings changes          requestSettings = module.get.settings();          // check if before send cancelled request          if(requestSettings === false) {            module.cancelled = true;            module.error(error.beforeSend);            return;          }          else {            module.cancelled = false;          }          // get url          url = module.get.templatedURL();          if(!url && !module.is.mocked()) {            module.error(error.missingURL);            return;          }          // replace variables          url = module.add.urlData( url );          // missing url parameters          if( !url && !module.is.mocked()) {            return;          }          requestSettings.url = settings.base + url;          // look for jQuery ajax parameters in settings          ajaxSettings = $.extend(true, {}, settings, {            type       : settings.method || settings.type,            data       : data,            url        : settings.base + url,            beforeSend : settings.beforeXHR,            success    : function() {},            failure    : function() {},            complete   : function() {}          });          module.debug('Querying URL', ajaxSettings.url);          module.verbose('Using AJAX settings', ajaxSettings);          if(settings.cache === 'local' && module.read.cachedResponse(url)) {            module.debug('Response returned from local cache');            module.request = module.create.request();            module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);            return;          }          if( !settings.throttle ) {            module.debug('Sending request', data, ajaxSettings.method);            module.send.request();          }          else {            if(!settings.throttleFirstRequest && !module.timer) {              module.debug('Sending request', data, ajaxSettings.method);              module.send.request();              module.timer = setTimeout(function(){}, settings.throttle);            }            else {              module.debug('Throttling request', settings.throttle);              clearTimeout(module.timer);              module.timer = setTimeout(function() {                if(module.timer) {                  delete module.timer;                }                module.debug('Sending throttled request', data, ajaxSettings.method);                module.send.request();              }, settings.throttle);            }          }        },        should: {          removeError: function() {            return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );          }        },        is: {          disabled: function() {            return ($module.filter(selector.disabled).length > 0);          },          expectingJSON: function() {            return settings.dataType === 'json' || settings.dataType === 'jsonp';          },          form: function() {            return $module.is('form') || $context.is('form');          },          mocked: function() {            return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);          },          input: function() {            return $module.is('input');          },          loading: function() {            return (module.request)              ? (module.request.state() == 'pending')              : false            ;          },          abortedRequest: function(xhr) {            if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {              module.verbose('XHR request determined to be aborted');              return true;            }            else {              module.verbose('XHR request was not aborted');              return false;            }          },          validResponse: function(response) {            if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {              module.verbose('Response is not JSON, skipping validation', settings.successTest, response);              return true;            }            module.debug('Checking JSON returned success', settings.successTest, response);            if( settings.successTest(response) ) {              module.debug('Response passed success test', response);              return true;            }            else {              module.debug('Response failed success test', response);              return false;            }          }        },        was: {          cancelled: function() {            return (module.cancelled || false);          },          succesful: function() {            return (module.request && module.request.state() == 'resolved');          },          failure: function() {            return (module.request && module.request.state() == 'rejected');          },          complete: function() {            return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );          }        },        add: {          urlData: function(url, urlData) {            var              requiredVariables,              optionalVariables            ;            if(url) {              requiredVariables = url.match(settings.regExp.required);              optionalVariables = url.match(settings.regExp.optional);              urlData           = urlData || settings.urlData;              if(requiredVariables) {                module.debug('Looking for required URL variables', requiredVariables);                $.each(requiredVariables, function(index, templatedString) {                  var                    // allow legacy {$var} style                    variable = (templatedString.indexOf('$') !== -1)                      ? templatedString.substr(2, templatedString.length - 3)                      : templatedString.substr(1, templatedString.length - 2),                    value   = ($.isPlainObject(urlData) && urlData[variable] !== undefined)                      ? urlData[variable]                      : ($module.data(variable) !== undefined)                        ? $module.data(variable)                        : ($context.data(variable) !== undefined)                          ? $context.data(variable)                          : urlData[variable]                  ;                  // remove value                  if(value === undefined) {                    module.error(error.requiredParameter, variable, url);                    url = false;                    return false;                  }                  else {                    module.verbose('Found required variable', variable, value);                    value = (settings.encodeParameters)                      ? module.get.urlEncodedValue(value)                      : value                    ;                    url = url.replace(templatedString, value);                  }                });              }              if(optionalVariables) {                module.debug('Looking for optional URL variables', requiredVariables);                $.each(optionalVariables, function(index, templatedString) {                  var                    // allow legacy {/$var} style                    variable = (templatedString.indexOf('$') !== -1)                      ? templatedString.substr(3, templatedString.length - 4)                      : templatedString.substr(2, templatedString.length - 3),                    value   = ($.isPlainObject(urlData) && urlData[variable] !== undefined)                      ? urlData[variable]                      : ($module.data(variable) !== undefined)                        ? $module.data(variable)                        : ($context.data(variable) !== undefined)                          ? $context.data(variable)                          : urlData[variable]                  ;                  // optional replacement                  if(value !== undefined) {                    module.verbose('Optional variable Found', variable, value);                    url = url.replace(templatedString, value);                  }                  else {                    module.verbose('Optional variable not found', variable);                    // remove preceding slash if set                    if(url.indexOf('/' + templatedString) !== -1) {                      url = url.replace('/' + templatedString, '');                    }                    else {                      url = url.replace(templatedString, '');                    }                  }                });              }            }            return url;          },          formData: function(data) {            var              canSerialize = ($.fn.serializeObject !== undefined),              formData     = (canSerialize)                ? $form.serializeObject()                : $form.serialize(),              hasOtherData            ;            data         = data || settings.data;            hasOtherData = $.isPlainObject(data);            if(hasOtherData) {              if(canSerialize) {                module.debug('Extending existing data with form data', data, formData);                data = $.extend(true, {}, data, formData);              }              else {                module.error(error.missingSerialize);                module.debug('Cant extend data. Replacing data with form data', data, formData);                data = formData;              }            }            else {              module.debug('Adding form data', formData);              data = formData;            }            return data;          }        },        send: {          request: function() {            module.set.loading();            module.request = module.create.request();            if( module.is.mocked() ) {              module.mockedXHR = module.create.mockedXHR();            }            else {              module.xhr = module.create.xhr();            }            settings.onRequest.call(context, module.request, module.xhr);          }        },        event: {          trigger: function(event) {            module.query();            if(event.type == 'submit' || event.type == 'click') {              event.preventDefault();            }          },          xhr: {            always: function() {              // nothing special            },            done: function(response, textStatus, xhr) {              var                context            = this,                elapsedTime        = (new Date().getTime() - requestStartTime),                timeLeft           = (settings.loadingDuration - elapsedTime),                translatedResponse = ( $.isFunction(settings.onResponse) )                  ? module.is.expectingJSON()                    ? settings.onResponse.call(context, $.extend(true, {}, response))                    : settings.onResponse.call(context, response)                  : false              ;              timeLeft = (timeLeft > 0)                ? timeLeft                : 0              ;              if(translatedResponse) {                module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);                response = translatedResponse;              }              if(timeLeft > 0) {                module.debug('Response completed early delaying state change by', timeLeft);              }              setTimeout(function() {                if( module.is.validResponse(response) ) {                  module.request.resolveWith(context, [response, xhr]);                }                else {                  module.request.rejectWith(context, [xhr, 'invalid']);                }              }, timeLeft);            },            fail: function(xhr, status, httpMessage) {              var                context     = this,                elapsedTime = (new Date().getTime() - requestStartTime),                timeLeft    = (settings.loadingDuration - elapsedTime)              ;              timeLeft = (timeLeft > 0)                ? timeLeft                : 0              ;              if(timeLeft > 0) {                module.debug('Response completed early delaying state change by', timeLeft);              }              setTimeout(function() {                if( module.is.abortedRequest(xhr) ) {                  module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);                }                else {                  module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);                }              }, timeLeft);            }          },          request: {            done: function(response, xhr) {              module.debug('Successful API Response', response);              if(settings.cache === 'local' && url) {                module.write.cachedResponse(url, response);                module.debug('Saving server response locally', module.cache);              }              settings.onSuccess.call(context, response, $module, xhr);            },            complete: function(firstParameter, secondParameter) {              var                xhr,                response              ;              // have to guess callback parameters based on request success              if( module.was.succesful() ) {                response = firstParameter;                xhr      = secondParameter;              }              else {                xhr      = firstParameter;                response = module.get.responseFromXHR(xhr);              }              module.remove.loading();              settings.onComplete.call(context, response, $module, xhr);            },            fail: function(xhr, status, httpMessage) {              var                // pull response from xhr if available                response     = module.get.responseFromXHR(xhr),                errorMessage = module.get.errorFromRequest(response, status, httpMessage)              ;              if(status == 'aborted') {                module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);                settings.onAbort.call(context, status, $module, xhr);                return true;              }              else if(status == 'invalid') {                module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);              }              else if(status == 'error') {                if(xhr !== undefined) {                  module.debug('XHR produced a server error', status, httpMessage);                  // make sure we have an error to display to console                  if( xhr.status != 200 && httpMessage !== undefined && httpMessage !== '') {                    module.error(error.statusMessage + httpMessage, ajaxSettings.url);                  }                  settings.onError.call(context, errorMessage, $module, xhr);                }              }              if(settings.errorDuration && status !== 'aborted') {                module.debug('Adding error state');                module.set.error();                if( module.should.removeError() ) {                  setTimeout(module.remove.error, settings.errorDuration);                }              }              module.debug('API Request failed', errorMessage, xhr);              settings.onFailure.call(context, response, $module, xhr);            }          }        },        create: {          request: function() {            // api request promise            return $.Deferred()              .always(module.event.request.complete)              .done(module.event.request.done)              .fail(module.event.request.fail)            ;          },          mockedXHR: function () {            var              // xhr does not simulate these properties of xhr but must return them              textStatus     = false,              status         = false,              httpMessage    = false,              responder      = settings.mockResponse      || settings.response,              asyncResponder = settings.mockResponseAsync || settings.responseAsync,              asyncCallback,              response,              mockedXHR            ;            mockedXHR = $.Deferred()              .always(module.event.xhr.complete)              .done(module.event.xhr.done)              .fail(module.event.xhr.fail)            ;            if(responder) {              if( $.isFunction(responder) ) {                module.debug('Using specified synchronous callback', responder);                response = responder.call(context, requestSettings);              }              else {                module.debug('Using settings specified response', responder);                response = responder;              }              // simulating response              mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);            }            else if( $.isFunction(asyncResponder) ) {              asyncCallback = function(response) {                module.debug('Async callback returned response', response);                if(response) {                  mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);                }                else {                  mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);                }              };              module.debug('Using specified async response callback', asyncResponder);              asyncResponder.call(context, requestSettings, asyncCallback);            }            return mockedXHR;          },          xhr: function() {            var              xhr            ;            // ajax request promise            xhr = $.ajax(ajaxSettings)              .always(module.event.xhr.always)              .done(module.event.xhr.done)              .fail(module.event.xhr.fail)            ;            module.verbose('Created server request', xhr, ajaxSettings);            return xhr;          }        },        set: {          error: function() {            module.verbose('Adding error state to element', $context);            $context.addClass(className.error);          },          loading: function() {            module.verbose('Adding loading state to element', $context);            $context.addClass(className.loading);            requestStartTime = new Date().getTime();          }        },        remove: {          error: function() {            module.verbose('Removing error state from element', $context);            $context.removeClass(className.error);          },          loading: function() {            module.verbose('Removing loading state from element', $context);            $context.removeClass(className.loading);          }        },        get: {          responseFromXHR: function(xhr) {            return $.isPlainObject(xhr)              ? (module.is.expectingJSON())                ? module.decode.json(xhr.responseText)                : xhr.responseText              : false            ;          },          errorFromRequest: function(response, status, httpMessage) {            return ($.isPlainObject(response) && response.error !== undefined)              ? response.error // use json error message              : (settings.error[status] !== undefined) // use server error message                ? settings.error[status]                : httpMessage            ;          },          request: function() {            return module.request || false;          },          xhr: function() {            return module.xhr || false;          },          settings: function() {            var              runSettings            ;            runSettings = settings.beforeSend.call(context, settings);            if(runSettings) {              if(runSettings.success !== undefined) {                module.debug('Legacy success callback detected', runSettings);                module.error(error.legacyParameters, runSettings.success);                runSettings.onSuccess = runSettings.success;              }              if(runSettings.failure !== undefined) {                module.debug('Legacy failure callback detected', runSettings);                module.error(error.legacyParameters, runSettings.failure);                runSettings.onFailure = runSettings.failure;              }              if(runSettings.complete !== undefined) {                module.debug('Legacy complete callback detected', runSettings);                module.error(error.legacyParameters, runSettings.complete);                runSettings.onComplete = runSettings.complete;              }            }            if(runSettings === undefined) {              module.error(error.noReturnedValue);            }            if(runSettings === false) {              return runSettings;            }            return (runSettings !== undefined)              ? $.extend(true, {}, runSettings)              : $.extend(true, {}, settings)            ;          },          urlEncodedValue: function(value) {            var              decodedValue   = window.decodeURIComponent(value),              encodedValue   = window.encodeURIComponent(value),              alreadyEncoded = (decodedValue !== value)            ;            if(alreadyEncoded) {              module.debug('URL value is already encoded, avoiding double encoding', value);              return value;            }            module.verbose('Encoding value using encodeURIComponent', value, encodedValue);            return encodedValue;          },          defaultData: function() {            var              data = {}            ;            if( !$.isWindow(element) ) {              if( module.is.input() ) {                data.value = $module.val();              }              else if( module.is.form() ) {              }              else {                data.text = $module.text();              }            }            return data;          },          event: function() {            if( $.isWindow(element) || settings.on == 'now' ) {              module.debug('API called without element, no events attached');              return false;            }            else if(settings.on == 'auto') {              if( $module.is('input') ) {                return (element.oninput !== undefined)                  ? 'input'                  : (element.onpropertychange !== undefined)                    ? 'propertychange'                    : 'keyup'                ;              }              else if( $module.is('form') ) {                return 'submit';              }              else {                return 'click';              }            }            else {              return settings.on;            }          },          templatedURL: function(action) {            action = action || $module.data(metadata.action) || settings.action || false;            url    = $module.data(metadata.url) || settings.url || false;            if(url) {              module.debug('Using specified url', url);              return url;            }            if(action) {              module.debug('Looking up url for action', action, settings.api);              if(settings.api[action] === undefined && !module.is.mocked()) {                module.error(error.missingAction, settings.action, settings.api);                return;              }              url = settings.api[action];            }            else if( module.is.form() ) {              url = $module.attr('action') || $context.attr('action') || false;              module.debug('No url or action specified, defaulting to form action', url);            }            return url;          }        },        abort: function() {          var            xhr = module.get.xhr()          ;          if( xhr && xhr.state() !== 'resolved') {            module.debug('Cancelling API request');            xhr.abort();          }        },        // reset state        reset: function() {          module.remove.error();          module.remove.loading();        },        setting: function(name, value) {          module.debug('Changing setting', name, value);          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            if($.isPlainObject(settings[name])) {              $.extend(true, settings[name], value);            }            else {              settings[name] = value;            }          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                //'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.api.settings = {  name              : 'API',  namespace         : 'api',  debug             : false,  verbose           : false,  performance       : true,  // object containing all templates endpoints  api               : {},  // whether to cache responses  cache             : true,  // whether new requests should abort previous requests  interruptRequests : true,  // event binding  on                : 'auto',  // context for applying state classes  stateContext      : false,  // duration for loading state  loadingDuration   : 0,  // whether to hide errors after a period of time  hideError         : 'auto',  // duration for error state  errorDuration     : 2000,  // whether parameters should be encoded with encodeURIComponent  encodeParameters  : true,  // API action to use  action            : false,  // templated URL to use  url               : false,  // base URL to apply to all endpoints  base              : '',  // data that will  urlData           : {},  // whether to add default data to url data  defaultData          : true,  // whether to serialize closest form  serializeForm        : false,  // how long to wait before request should occur  throttle             : 0,  // whether to throttle first request or only repeated  throttleFirstRequest : true,  // standard ajax settings  method            : 'get',  data              : {},  dataType          : 'json',  // mock response  mockResponse      : false,  mockResponseAsync : false,  // aliases for mock  response          : false,  responseAsync     : false,  // callbacks before request  beforeSend  : function(settings) { return settings; },  beforeXHR   : function(xhr) {},  onRequest   : function(promise, xhr) {},  // after request  onResponse  : false, // function(response) { },  // response was successful, if JSON passed validation  onSuccess   : function(response, $module) {},  // request finished without aborting  onComplete  : function(response, $module) {},  // failed JSON success test  onFailure   : function(response, $module) {},  // server error  onError     : function(errorMessage, $module) {},  // request aborted  onAbort     : function(errorMessage, $module) {},  successTest : false,  // errors  error : {    beforeSend        : 'The before send function has aborted the request',    error             : 'There was an error with your request',    exitConditions    : 'API Request Aborted. Exit conditions met',    JSONParse         : 'JSON could not be parsed during error handling',    legacyParameters  : 'You are using legacy API success callback names',    method            : 'The method you called is not defined',    missingAction     : 'API action used but no url was defined',    missingSerialize  : 'jquery-serialize-object is required to add form data to an existing data object',    missingURL        : 'No URL specified for api event',    noReturnedValue   : 'The beforeSend callback must return a settings object, beforeSend ignored.',    noStorage         : 'Caching responses locally requires session storage',    parseError        : 'There was an error parsing your request',    requiredParameter : 'Missing a required URL parameter: ',    statusMessage     : 'Server gave an error: ',    timeout           : 'Your request timed out'  },  regExp  : {    required : /\{\$*[A-z0-9]+\}/g,    optional : /\{\/\$*[A-z0-9]+\}/g,  },  className: {    loading : 'loading',    error   : 'error'  },  selector: {    disabled : '.disabled',    form      : 'form'  },  metadata: {    action  : 'action',    url     : 'url'  }};})( jQuery, window, document );/*! * # Semantic UI 2.4.2 - Visibility * http://github.com/semantic-org/semantic-ui/ * * * Released under the MIT license * http://opensource.org/licenses/MIT * */;(function ($, window, document, undefined) {'use strict';window = (typeof window != 'undefined' && window.Math == Math)  ? window  : (typeof self != 'undefined' && self.Math == Math)    ? self    : Function('return this')();$.fn.visibility = function(parameters) {  var    $allModules    = $(this),    moduleSelector = $allModules.selector || '',    time           = new Date().getTime(),    performance    = [],    query          = arguments[0],    methodInvoked  = (typeof query == 'string'),    queryArguments = [].slice.call(arguments, 1),    returnedValue,    moduleCount    = $allModules.length,    loadedCount    = 0  ;  $allModules    .each(function() {      var        settings        = ( $.isPlainObject(parameters) )          ? $.extend(true, {}, $.fn.visibility.settings, parameters)          : $.extend({}, $.fn.visibility.settings),        className       = settings.className,        namespace       = settings.namespace,        error           = settings.error,        metadata        = settings.metadata,        eventNamespace  = '.' + namespace,        moduleNamespace = 'module-' + namespace,        $window         = $(window),        $module         = $(this),        $context        = $(settings.context),        $placeholder,        selector        = $module.selector || '',        instance        = $module.data(moduleNamespace),        requestAnimationFrame = window.requestAnimationFrame          || window.mozRequestAnimationFrame          || window.webkitRequestAnimationFrame          || window.msRequestAnimationFrame          || function(callback) { setTimeout(callback, 0); },        element         = this,        disabled        = false,        contextObserver,        observer,        module      ;      module = {        initialize: function() {          module.debug('Initializing', settings);          module.setup.cache();          if( module.should.trackChanges() ) {            if(settings.type == 'image') {              module.setup.image();            }            if(settings.type == 'fixed') {              module.setup.fixed();            }            if(settings.observeChanges) {              module.observeChanges();            }            module.bind.events();          }          module.save.position();          if( !module.is.visible() ) {            module.error(error.visible, $module);          }          if(settings.initialCheck) {            module.checkVisibility();          }          module.instantiate();        },        instantiate: function() {          module.debug('Storing instance', module);          $module            .data(moduleNamespace, module)          ;          instance = module;        },        destroy: function() {          module.verbose('Destroying previous module');          if(observer) {            observer.disconnect();          }          if(contextObserver) {            contextObserver.disconnect();          }          $window            .off('load'   + eventNamespace, module.event.load)            .off('resize' + eventNamespace, module.event.resize)          ;          $context            .off('scroll'       + eventNamespace, module.event.scroll)            .off('scrollchange' + eventNamespace, module.event.scrollchange)          ;          if(settings.type == 'fixed') {            module.resetFixed();            module.remove.placeholder();          }          $module            .off(eventNamespace)            .removeData(moduleNamespace)          ;        },        observeChanges: function() {          if('MutationObserver' in window) {            contextObserver = new MutationObserver(module.event.contextChanged);            observer        = new MutationObserver(module.event.changed);            contextObserver.observe(document, {              childList : true,              subtree   : true            });            observer.observe(element, {              childList : true,              subtree   : true            });            module.debug('Setting up mutation observer', observer);          }        },        bind: {          events: function() {            module.verbose('Binding visibility events to scroll and resize');            if(settings.refreshOnLoad) {              $window                .on('load'   + eventNamespace, module.event.load)              ;            }            $window              .on('resize' + eventNamespace, module.event.resize)            ;            // pub/sub pattern            $context              .off('scroll'      + eventNamespace)              .on('scroll'       + eventNamespace, module.event.scroll)              .on('scrollchange' + eventNamespace, module.event.scrollchange)            ;          }        },        event: {          changed: function(mutations) {            module.verbose('DOM tree modified, updating visibility calculations');            module.timer = setTimeout(function() {              module.verbose('DOM tree modified, updating sticky menu');              module.refresh();            }, 100);          },          contextChanged: function(mutations) {            [].forEach.call(mutations, function(mutation) {              if(mutation.removedNodes) {                [].forEach.call(mutation.removedNodes, function(node) {                  if(node == element || $(node).find(element).length > 0) {                    module.debug('Element removed from DOM, tearing down events');                    module.destroy();                  }                });              }            });          },          resize: function() {            module.debug('Window resized');            if(settings.refreshOnResize) {              requestAnimationFrame(module.refresh);            }          },          load: function() {            module.debug('Page finished loading');            requestAnimationFrame(module.refresh);          },          // publishes scrollchange event on one scroll          scroll: function() {            if(settings.throttle) {              clearTimeout(module.timer);              module.timer = setTimeout(function() {                $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);              }, settings.throttle);            }            else {              requestAnimationFrame(function() {                $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);              });            }          },          // subscribes to scrollchange          scrollchange: function(event, scrollPosition) {            module.checkVisibility(scrollPosition);          },        },        precache: function(images, callback) {          if (!(images instanceof Array)) {            images = [images];          }          var            imagesLength  = images.length,            loadedCounter = 0,            cache         = [],            cacheImage    = document.createElement('img'),            handleLoad    = function() {              loadedCounter++;              if (loadedCounter >= images.length) {                if ($.isFunction(callback)) {                  callback();                }              }            }          ;          while (imagesLength--) {            cacheImage         = document.createElement('img');            cacheImage.onload  = handleLoad;            cacheImage.onerror = handleLoad;            cacheImage.src     = images[imagesLength];            cache.push(cacheImage);          }        },        enableCallbacks: function() {          module.debug('Allowing callbacks to occur');          disabled = false;        },        disableCallbacks: function() {          module.debug('Disabling all callbacks temporarily');          disabled = true;        },        should: {          trackChanges: function() {            if(methodInvoked) {              module.debug('One time query, no need to bind events');              return false;            }            module.debug('Callbacks being attached');            return true;          }        },        setup: {          cache: function() {            module.cache = {              occurred : {},              screen   : {},              element  : {},            };          },          image: function() {            var              src = $module.data(metadata.src)            ;            if(src) {              module.verbose('Lazy loading image', src);              settings.once           = true;              settings.observeChanges = false;              // show when top visible              settings.onOnScreen = function() {                module.debug('Image on screen', element);                module.precache(src, function() {                  module.set.image(src, function() {                    loadedCount++;                    if(loadedCount == moduleCount) {                      settings.onAllLoaded.call(this);                    }                    settings.onLoad.call(this);                  });                });              };            }          },          fixed: function() {            module.debug('Setting up fixed');            settings.once           = false;            settings.observeChanges = false;            settings.initialCheck   = true;            settings.refreshOnLoad  = true;            if(!parameters.transition) {              settings.transition = false;            }            module.create.placeholder();            module.debug('Added placeholder', $placeholder);            settings.onTopPassed = function() {              module.debug('Element passed, adding fixed position', $module);              module.show.placeholder();              module.set.fixed();              if(settings.transition) {                if($.fn.transition !== undefined) {                  $module.transition(settings.transition, settings.duration);                }              }            };            settings.onTopPassedReverse = function() {              module.debug('Element returned to position, removing fixed', $module);              module.hide.placeholder();              module.remove.fixed();            };          }        },        create: {          placeholder: function() {            module.verbose('Creating fixed position placeholder');            $placeholder = $module              .clone(false)              .css('display', 'none')              .addClass(className.placeholder)              .insertAfter($module)            ;          }        },        show: {          placeholder: function() {            module.verbose('Showing placeholder');            $placeholder              .css('display', 'block')              .css('visibility', 'hidden')            ;          }        },        hide: {          placeholder: function() {            module.verbose('Hiding placeholder');            $placeholder              .css('display', 'none')              .css('visibility', '')            ;          }        },        set: {          fixed: function() {            module.verbose('Setting element to fixed position');            $module              .addClass(className.fixed)              .css({                position : 'fixed',                top      : settings.offset + 'px',                left     : 'auto',                zIndex   : settings.zIndex              })            ;            settings.onFixed.call(element);          },          image: function(src, callback) {            $module              .attr('src', src)            ;            if(settings.transition) {              if( $.fn.transition !== undefined) {                if($module.hasClass(className.visible)) {                  module.debug('Transition already occurred on this image, skipping animation');                  return;                }                $module.transition(settings.transition, settings.duration, callback);              }              else {                $module.fadeIn(settings.duration, callback);              }            }            else {              $module.show();            }          }        },        is: {          onScreen: function() {            var              calculations   = module.get.elementCalculations()            ;            return calculations.onScreen;          },          offScreen: function() {            var              calculations   = module.get.elementCalculations()            ;            return calculations.offScreen;          },          visible: function() {            if(module.cache && module.cache.element) {              return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);            }            return false;          },          verticallyScrollableContext: function() {            var              overflowY = ($context.get(0) !== window)                ? $context.css('overflow-y')                : false            ;            return (overflowY == 'auto' || overflowY == 'scroll');          },          horizontallyScrollableContext: function() {            var              overflowX = ($context.get(0) !== window)                ? $context.css('overflow-x')                : false            ;            return (overflowX == 'auto' || overflowX == 'scroll');          }        },        refresh: function() {          module.debug('Refreshing constants (width/height)');          if(settings.type == 'fixed') {            module.resetFixed();          }          module.reset();          module.save.position();          if(settings.checkOnRefresh) {            module.checkVisibility();          }          settings.onRefresh.call(element);        },        resetFixed: function () {          module.remove.fixed();          module.remove.occurred();        },        reset: function() {          module.verbose('Resetting all cached values');          if( $.isPlainObject(module.cache) ) {            module.cache.screen = {};            module.cache.element = {};          }        },        checkVisibility: function(scroll) {          module.verbose('Checking visibility of element', module.cache.element);          if( !disabled && module.is.visible() ) {            // save scroll position            module.save.scroll(scroll);            // update calculations derived from scroll            module.save.calculations();            // percentage            module.passed();            // reverse (must be first)            module.passingReverse();            module.topVisibleReverse();            module.bottomVisibleReverse();            module.topPassedReverse();            module.bottomPassedReverse();            // one time            module.onScreen();            module.offScreen();            module.passing();            module.topVisible();            module.bottomVisible();            module.topPassed();            module.bottomPassed();            // on update callback            if(settings.onUpdate) {              settings.onUpdate.call(element, module.get.elementCalculations());            }          }        },        passed: function(amount, newCallback) {          var            calculations   = module.get.elementCalculations(),            amountInPixels          ;          // assign callback          if(amount && newCallback) {            settings.onPassed[amount] = newCallback;          }          else if(amount !== undefined) {            return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);          }          else if(calculations.passing) {            $.each(settings.onPassed, function(amount, callback) {              if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {                module.execute(callback, amount);              }              else if(!settings.once) {                module.remove.occurred(callback);              }            });          }        },        onScreen: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onOnScreen,            callbackName = 'onScreen'          ;          if(newCallback) {            module.debug('Adding callback for onScreen', newCallback);            settings.onOnScreen = newCallback;          }          if(calculations.onScreen) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback !== undefined) {            return calculations.onOnScreen;          }        },        offScreen: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onOffScreen,            callbackName = 'offScreen'          ;          if(newCallback) {            module.debug('Adding callback for offScreen', newCallback);            settings.onOffScreen = newCallback;          }          if(calculations.offScreen) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback !== undefined) {            return calculations.onOffScreen;          }        },        passing: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onPassing,            callbackName = 'passing'          ;          if(newCallback) {            module.debug('Adding callback for passing', newCallback);            settings.onPassing = newCallback;          }          if(calculations.passing) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback !== undefined) {            return calculations.passing;          }        },        topVisible: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onTopVisible,            callbackName = 'topVisible'          ;          if(newCallback) {            module.debug('Adding callback for top visible', newCallback);            settings.onTopVisible = newCallback;          }          if(calculations.topVisible) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return calculations.topVisible;          }        },        bottomVisible: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onBottomVisible,            callbackName = 'bottomVisible'          ;          if(newCallback) {            module.debug('Adding callback for bottom visible', newCallback);            settings.onBottomVisible = newCallback;          }          if(calculations.bottomVisible) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return calculations.bottomVisible;          }        },        topPassed: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onTopPassed,            callbackName = 'topPassed'          ;          if(newCallback) {            module.debug('Adding callback for top passed', newCallback);            settings.onTopPassed = newCallback;          }          if(calculations.topPassed) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return calculations.topPassed;          }        },        bottomPassed: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onBottomPassed,            callbackName = 'bottomPassed'          ;          if(newCallback) {            module.debug('Adding callback for bottom passed', newCallback);            settings.onBottomPassed = newCallback;          }          if(calculations.bottomPassed) {            module.execute(callback, callbackName);          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return calculations.bottomPassed;          }        },        passingReverse: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onPassingReverse,            callbackName = 'passingReverse'          ;          if(newCallback) {            module.debug('Adding callback for passing reverse', newCallback);            settings.onPassingReverse = newCallback;          }          if(!calculations.passing) {            if(module.get.occurred('passing')) {              module.execute(callback, callbackName);            }          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback !== undefined) {            return !calculations.passing;          }        },        topVisibleReverse: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onTopVisibleReverse,            callbackName = 'topVisibleReverse'          ;          if(newCallback) {            module.debug('Adding callback for top visible reverse', newCallback);            settings.onTopVisibleReverse = newCallback;          }          if(!calculations.topVisible) {            if(module.get.occurred('topVisible')) {              module.execute(callback, callbackName);            }          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return !calculations.topVisible;          }        },        bottomVisibleReverse: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onBottomVisibleReverse,            callbackName = 'bottomVisibleReverse'          ;          if(newCallback) {            module.debug('Adding callback for bottom visible reverse', newCallback);            settings.onBottomVisibleReverse = newCallback;          }          if(!calculations.bottomVisible) {            if(module.get.occurred('bottomVisible')) {              module.execute(callback, callbackName);            }          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return !calculations.bottomVisible;          }        },        topPassedReverse: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onTopPassedReverse,            callbackName = 'topPassedReverse'          ;          if(newCallback) {            module.debug('Adding callback for top passed reverse', newCallback);            settings.onTopPassedReverse = newCallback;          }          if(!calculations.topPassed) {            if(module.get.occurred('topPassed')) {              module.execute(callback, callbackName);            }          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return !calculations.onTopPassed;          }        },        bottomPassedReverse: function(newCallback) {          var            calculations = module.get.elementCalculations(),            callback     = newCallback || settings.onBottomPassedReverse,            callbackName = 'bottomPassedReverse'          ;          if(newCallback) {            module.debug('Adding callback for bottom passed reverse', newCallback);            settings.onBottomPassedReverse = newCallback;          }          if(!calculations.bottomPassed) {            if(module.get.occurred('bottomPassed')) {              module.execute(callback, callbackName);            }          }          else if(!settings.once) {            module.remove.occurred(callbackName);          }          if(newCallback === undefined) {            return !calculations.bottomPassed;          }        },        execute: function(callback, callbackName) {          var            calculations = module.get.elementCalculations(),            screen       = module.get.screenCalculations()          ;          callback = callback || false;          if(callback) {            if(settings.continuous) {              module.debug('Callback being called continuously', callbackName, calculations);              callback.call(element, calculations, screen);            }            else if(!module.get.occurred(callbackName)) {              module.debug('Conditions met', callbackName, calculations);              callback.call(element, calculations, screen);            }          }          module.save.occurred(callbackName);        },        remove: {          fixed: function() {            module.debug('Removing fixed position');            $module              .removeClass(className.fixed)              .css({                position : '',                top      : '',                left     : '',                zIndex   : ''              })            ;            settings.onUnfixed.call(element);          },          placeholder: function() {            module.debug('Removing placeholder content');            if($placeholder) {              $placeholder.remove();            }          },          occurred: function(callback) {            if(callback) {              var                occurred = module.cache.occurred              ;              if(occurred[callback] !== undefined && occurred[callback] === true) {                module.debug('Callback can now be called again', callback);                module.cache.occurred[callback] = false;              }            }            else {              module.cache.occurred = {};            }          }        },        save: {          calculations: function() {            module.verbose('Saving all calculations necessary to determine positioning');            module.save.direction();            module.save.screenCalculations();            module.save.elementCalculations();          },          occurred: function(callback) {            if(callback) {              if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {                module.verbose('Saving callback occurred', callback);                module.cache.occurred[callback] = true;              }            }          },          scroll: function(scrollPosition) {            scrollPosition      = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;            module.cache.scroll = scrollPosition;          },          direction: function() {            var              scroll     = module.get.scroll(),              lastScroll = module.get.lastScroll(),              direction            ;            if(scroll > lastScroll && lastScroll) {              direction = 'down';            }            else if(scroll < lastScroll && lastScroll) {              direction = 'up';            }            else {              direction = 'static';            }            module.cache.direction = direction;            return module.cache.direction;          },          elementPosition: function() {            var              element = module.cache.element,              screen  = module.get.screenSize()            ;            module.verbose('Saving element position');            // (quicker than $.extend)            element.fits          = (element.height < screen.height);            element.offset        = $module.offset();            element.width         = $module.outerWidth();            element.height        = $module.outerHeight();            // compensate for scroll in context            if(module.is.verticallyScrollableContext()) {              element.offset.top += $context.scrollTop() - $context.offset().top;            }            if(module.is.horizontallyScrollableContext()) {              element.offset.left += $context.scrollLeft - $context.offset().left;            }            // store            module.cache.element = element;            return element;          },          elementCalculations: function() {            var              screen     = module.get.screenCalculations(),              element    = module.get.elementPosition()            ;            // offset            if(settings.includeMargin) {              element.margin        = {};              element.margin.top    = parseInt($module.css('margin-top'), 10);              element.margin.bottom = parseInt($module.css('margin-bottom'), 10);              element.top    = element.offset.top - element.margin.top;              element.bottom = element.offset.top + element.height + element.margin.bottom;            }            else {              element.top    = element.offset.top;              element.bottom = element.offset.top + element.height;            }            // visibility            element.topPassed        = (screen.top >= element.top);            element.bottomPassed     = (screen.top >= element.bottom);            element.topVisible       = (screen.bottom >= element.top) && !element.topPassed;            element.bottomVisible    = (screen.bottom >= element.bottom) && !element.bottomPassed;            element.pixelsPassed     = 0;            element.percentagePassed = 0;            // meta calculations            element.onScreen  = ((element.topVisible || element.passing) && !element.bottomPassed);            element.passing   = (element.topPassed && !element.bottomPassed);            element.offScreen = (!element.onScreen);            // passing calculations            if(element.passing) {              element.pixelsPassed     = (screen.top - element.top);              element.percentagePassed = (screen.top - element.top) / element.height;            }            module.cache.element = element;            module.verbose('Updated element calculations', element);            return element;          },          screenCalculations: function() {            var              scroll = module.get.scroll()            ;            module.save.direction();            module.cache.screen.top    = scroll;            module.cache.screen.bottom = scroll + module.cache.screen.height;            return module.cache.screen;          },          screenSize: function() {            module.verbose('Saving window position');            module.cache.screen = {              height: $context.height()            };          },          position: function() {            module.save.screenSize();            module.save.elementPosition();          }        },        get: {          pixelsPassed: function(amount) {            var              element = module.get.elementCalculations()            ;            if(amount.search('%') > -1) {              return ( element.height * (parseInt(amount, 10) / 100) );            }            return parseInt(amount, 10);          },          occurred: function(callback) {            return (module.cache.occurred !== undefined)              ? module.cache.occurred[callback] || false              : false            ;          },          direction: function() {            if(module.cache.direction === undefined) {              module.save.direction();            }            return module.cache.direction;          },          elementPosition: function() {            if(module.cache.element === undefined) {              module.save.elementPosition();            }            return module.cache.element;          },          elementCalculations: function() {            if(module.cache.element === undefined) {              module.save.elementCalculations();            }            return module.cache.element;          },          screenCalculations: function() {            if(module.cache.screen === undefined) {              module.save.screenCalculations();            }            return module.cache.screen;          },          screenSize: function() {            if(module.cache.screen === undefined) {              module.save.screenSize();            }            return module.cache.screen;          },          scroll: function() {            if(module.cache.scroll === undefined) {              module.save.scroll();            }            return module.cache.scroll;          },          lastScroll: function() {            if(module.cache.screen === undefined) {              module.debug('First scroll event, no last scroll could be found');              return false;            }            return module.cache.screen.top;          }        },        setting: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, settings, name);          }          else if(value !== undefined) {            settings[name] = value;          }          else {            return settings[name];          }        },        internal: function(name, value) {          if( $.isPlainObject(name) ) {            $.extend(true, module, name);          }          else if(value !== undefined) {            module[name] = value;          }          else {            return module[name];          }        },        debug: function() {          if(!settings.silent && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.debug.apply(console, arguments);            }          }        },        verbose: function() {          if(!settings.silent && settings.verbose && settings.debug) {            if(settings.performance) {              module.performance.log(arguments);            }            else {              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');              module.verbose.apply(console, arguments);            }          }        },        error: function() {          if(!settings.silent) {            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');            module.error.apply(console, arguments);          }        },        performance: {          log: function(message) {            var              currentTime,              executionTime,              previousTime            ;            if(settings.performance) {              currentTime   = new Date().getTime();              previousTime  = time || currentTime;              executionTime = currentTime - previousTime;              time          = currentTime;              performance.push({                'Name'           : message[0],                'Arguments'      : [].slice.call(message, 1) || '',                'Element'        : element,                'Execution Time' : executionTime              });            }            clearTimeout(module.performance.timer);            module.performance.timer = setTimeout(module.performance.display, 500);          },          display: function() {            var              title = settings.name + ':',              totalTime = 0            ;            time = false;            clearTimeout(module.performance.timer);            $.each(performance, function(index, data) {              totalTime += data['Execution Time'];            });            title += ' ' + totalTime + 'ms';            if(moduleSelector) {              title += ' \'' + moduleSelector + '\'';            }            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {              console.groupCollapsed(title);              if(console.table) {                console.table(performance);              }              else {                $.each(performance, function(index, data) {                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');                });              }              console.groupEnd();            }            performance = [];          }        },        invoke: function(query, passedArguments, context) {          var            object = instance,            maxDepth,            found,            response          ;          passedArguments = passedArguments || queryArguments;          context         = element         || context;          if(typeof query == 'string' && object !== undefined) {            query    = query.split(/[\. ]/);            maxDepth = query.length - 1;            $.each(query, function(depth, value) {              var camelCaseValue = (depth != maxDepth)                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)                : query              ;              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {                object = object[camelCaseValue];              }              else if( object[camelCaseValue] !== undefined ) {                found = object[camelCaseValue];                return false;              }              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {                object = object[value];              }              else if( object[value] !== undefined ) {                found = object[value];                return false;              }              else {                module.error(error.method, query);                return false;              }            });          }          if ( $.isFunction( found ) ) {            response = found.apply(context, passedArguments);          }          else if(found !== undefined) {            response = found;          }          if($.isArray(returnedValue)) {            returnedValue.push(response);          }          else if(returnedValue !== undefined) {            returnedValue = [returnedValue, response];          }          else if(response !== undefined) {            returnedValue = response;          }          return found;        }      };      if(methodInvoked) {        if(instance === undefined) {          module.initialize();        }        instance.save.scroll();        instance.save.calculations();        module.invoke(query);      }      else {        if(instance !== undefined) {          instance.invoke('destroy');        }        module.initialize();      }    })  ;  return (returnedValue !== undefined)    ? returnedValue    : this  ;};$.fn.visibility.settings = {  name                   : 'Visibility',  namespace              : 'visibility',  debug                  : false,  verbose                : false,  performance            : true,  // whether to use mutation observers to follow changes  observeChanges         : true,  // check position immediately on init  initialCheck           : true,  // whether to refresh calculations after all page images load  refreshOnLoad          : true,  // whether to refresh calculations after page resize event  refreshOnResize        : true,  // should call callbacks on refresh event (resize, etc)  checkOnRefresh         : true,  // callback should only occur one time  once                   : true,  // callback should fire continuously whe evaluates to true  continuous             : false,  // offset to use with scroll top  offset                 : 0,  // whether to include margin in elements position  includeMargin          : false,  // scroll context for visibility checks  context                : window,  // visibility check delay in ms (defaults to animationFrame)  throttle               : false,  // special visibility type (image, fixed)  type                   : false,  // z-index to use with visibility 'fixed'  zIndex                 : '10',  // image only animation settings  transition             : 'fade in',  duration               : 1000,  // array of callbacks for percentage  onPassed               : {},  // standard callbacks  onOnScreen             : false,  onOffScreen            : false,  onPassing              : false,  onTopVisible           : false,  onBottomVisible        : false,  onTopPassed            : false,  onBottomPassed         : false,  // reverse callbacks  onPassingReverse       : false,  onTopVisibleReverse    : false,  onBottomVisibleReverse : false,  onTopPassedReverse     : false,  onBottomPassedReverse  : false,  // special callbacks for image  onLoad                 : function() {},  onAllLoaded            : function() {},  // special callbacks for fixed position  onFixed                : function() {},  onUnfixed              : function() {},  // utility callbacks  onUpdate               : false, // disabled by default for performance  onRefresh              : function(){},  metadata : {    src: 'src'  },  className: {    fixed       : 'fixed',    placeholder : 'placeholder',    visible     : 'visible'  },  error : {    method  : 'The method you called is not defined.',    visible : 'Element is hidden, you must call refresh after element becomes visible'  }};})( jQuery, window, document );
 |