| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777 | /*! * jQuery JavaScript Library v2.1.4 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2015-04-28T16:01Z */(function (global, factory) {    if (typeof module === "object" && typeof module.exports === "object") {        // For CommonJS and CommonJS-like environments where a proper `window`        // is present, execute the factory and get jQuery.        // For environments that do not have a `window` with a `document`        // (such as Node.js), expose a factory as module.exports.        // This accentuates the need for the creation of a real `window`.        // e.g. var jQuery = require("jquery")(window);        // See ticket #14549 for more info.        module.exports = global.document ?            factory(global, true) :            function (w) {                if (!w.document) {                    throw new Error("jQuery requires a window with a document");                }                return factory(w);            };    } else {        factory(global);    }// Pass this if window is not defined yet}(typeof window !== "undefined" ? window : this, function (window, noGlobal) {// Support: Firefox 18+// Can't be in strict mode, several libs including ASP.NET trace// the stack via arguments.caller.callee and Firefox dies if// you try to trace through "use strict" call chains. (#13335)//    var arr = [];    var slice = arr.slice;    var concat = arr.concat;    var push = arr.push;    var indexOf = arr.indexOf;    var class2type = {};    var toString = class2type.toString;    var hasOwn = class2type.hasOwnProperty;    var support = {};    var    // Use the correct document accordingly with window argument (sandbox)        document = window.document,        version = "2.1.4",    // Define a local copy of jQuery        jQuery = function (selector, context) {            // The jQuery object is actually just the init constructor 'enhanced'            // Need init if jQuery is called (just allow error to be thrown if not included)            return new jQuery.fn.init(selector, context);        },    // Support: Android<4.1    // Make sure we trim BOM and NBSP        rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,    // Matches dashed string for camelizing        rmsPrefix = /^-ms-/,        rdashAlpha = /-([\da-z])/gi,    // Used by jQuery.camelCase as callback to replace()        fcamelCase = function (all, letter) {            return letter.toUpperCase();        };    jQuery.fn = jQuery.prototype = {        // The current version of jQuery being used        jquery: version,        constructor: jQuery,        // Start with an empty selector        selector: "",        // The default length of a jQuery object is 0        length: 0,        toArray: function () {            return slice.call(this);        },        // Get the Nth element in the matched element set OR        // Get the whole matched element set as a clean array        get: function (num) {            return num != null ?                // Return just the one element from the set                ( num < 0 ? this[num + this.length] : this[num] ) :                // Return all the elements in a clean array                slice.call(this);        },        // Take an array of elements and push it onto the stack        // (returning the new matched element set)        pushStack: function (elems) {            // Build a new jQuery matched element set            var ret = jQuery.merge(this.constructor(), elems);            // Add the old object onto the stack (as a reference)            ret.prevObject = this;            ret.context = this.context;            // Return the newly-formed element set            return ret;        },        // Execute a callback for every element in the matched set.        // (You can seed the arguments with an array of args, but this is        // only used internally.)        each: function (callback, args) {            return jQuery.each(this, callback, args);        },        map: function (callback) {            return this.pushStack(jQuery.map(this, function (elem, i) {                return callback.call(elem, i, elem);            }));        },        slice: function () {            return this.pushStack(slice.apply(this, arguments));        },        first: function () {            return this.eq(0);        },        last: function () {            return this.eq(-1);        },        eq: function (i) {            var len = this.length,                j = +i + ( i < 0 ? len : 0 );            return this.pushStack(j >= 0 && j < len ? [this[j]] : []);        },        end: function () {            return this.prevObject || this.constructor(null);        },        // For internal use only.        // Behaves like an Array's method, not like a jQuery method.        push: push,        sort: arr.sort,        splice: arr.splice    };    jQuery.extend = jQuery.fn.extend = function () {        var options, name, src, copy, copyIsArray, clone,            target = arguments[0] || {},            i = 1,            length = arguments.length,            deep = false;        // Handle a deep copy situation        if (typeof target === "boolean") {            deep = target;            // Skip the boolean and the target            target = arguments[i] || {};            i++;        }        // Handle case when target is a string or something (possible in deep copy)        if (typeof target !== "object" && !jQuery.isFunction(target)) {            target = {};        }        // Extend jQuery itself if only one argument is passed        if (i === length) {            target = this;            i--;        }        for (; i < length; i++) {            // Only deal with non-null/undefined values            if ((options = arguments[i]) != null) {                // Extend the base object                for (name in options) {                    src = target[name];                    copy = options[name];                    // Prevent never-ending loop                    if (target === copy) {                        continue;                    }                    // Recurse if we're merging plain objects or arrays                    if (deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) )) {                        if (copyIsArray) {                            copyIsArray = false;                            clone = src && jQuery.isArray(src) ? src : [];                        } else {                            clone = src && jQuery.isPlainObject(src) ? src : {};                        }                        // Never move original objects, clone them                        target[name] = jQuery.extend(deep, clone, copy);                        // Don't bring in undefined values                    } else if (copy !== undefined) {                        target[name] = copy;                    }                }            }        }        // Return the modified object        return target;    };    jQuery.extend({        // Unique for each copy of jQuery on the page        expando: "jQuery" + ( version + Math.random() ).replace(/\D/g, ""),        // Assume jQuery is ready without the ready module        isReady: true,        error: function (msg) {            throw new Error(msg);        },        noop: function () {        },        isFunction: function (obj) {            return jQuery.type(obj) === "function";        },        isArray: Array.isArray,        isWindow: function (obj) {            return obj != null && obj === obj.window;        },        isNumeric: function (obj) {            // parseFloat NaNs numeric-cast false positives (null|true|false|"")            // ...but misinterprets leading-number strings, particularly hex literals ("0x...")            // subtraction forces infinities to NaN            // adding 1 corrects loss of precision from parseFloat (#15100)            return !jQuery.isArray(obj) && (obj - parseFloat(obj) + 1) >= 0;        },        isPlainObject: function (obj) {            // Not plain objects:            // - Any object or value whose internal [[Class]] property is not "[object Object]"            // - DOM nodes            // - window            if (jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {                return false;            }            if (obj.constructor && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {                return false;            }            // If the function hasn't returned already, we're confident that            // |obj| is a plain object, created by {} or constructed with new Object            return true;        },        isEmptyObject: function (obj) {            var name;            for (name in obj) {                return false;            }            return true;        },        type: function (obj) {            if (obj == null) {                return obj + "";            }            // Support: Android<4.0, iOS<6 (functionish RegExp)            return typeof obj === "object" || typeof obj === "function" ?            class2type[toString.call(obj)] || "object" :                typeof obj;        },        // Evaluates a script in a global context        globalEval: function (code) {            var script,                indirect = eval;            code = jQuery.trim(code);            if (code) {                // If the code includes a valid, prologue position                // strict mode pragma, execute code by injecting a                // script tag into the document.                if (code.indexOf("use strict") === 1) {                    script = document.createElement("script");                    script.text = code;                    document.head.appendChild(script).parentNode.removeChild(script);                } else {                    // Otherwise, avoid the DOM node creation, insertion                    // and removal by using an indirect global eval                    indirect(code);                }            }        },        // Convert dashed to camelCase; used by the css and data modules        // Support: IE9-11+        // Microsoft forgot to hump their vendor prefix (#9572)        camelCase: function (string) {            return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);        },        nodeName: function (elem, name) {            return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();        },        // args is for internal usage only        each: function (obj, callback, args) {            var value,                i = 0,                length = obj.length,                isArray = isArraylike(obj);            if (args) {                if (isArray) {                    for (; i < length; i++) {                        value = callback.apply(obj[i], args);                        if (value === false) {                            break;                        }                    }                } else {                    for (i in obj) {                        value = callback.apply(obj[i], args);                        if (value === false) {                            break;                        }                    }                }                // A special, fast, case for the most common use of each            } else {                if (isArray) {                    for (; i < length; i++) {                        value = callback.call(obj[i], i, obj[i]);                        if (value === false) {                            break;                        }                    }                } else {                    for (i in obj) {                        value = callback.call(obj[i], i, obj[i]);                        if (value === false) {                            break;                        }                    }                }            }            return obj;        },        // Support: Android<4.1        trim: function (text) {            return text == null ?                "" :                ( text + "" ).replace(rtrim, "");        },        // results is for internal usage only        makeArray: function (arr, results) {            var ret = results || [];            if (arr != null) {                if (isArraylike(Object(arr))) {                    jQuery.merge(ret,                        typeof arr === "string" ?                            [arr] : arr                    );                } else {                    push.call(ret, arr);                }            }            return ret;        },        inArray: function (elem, arr, i) {            return arr == null ? -1 : indexOf.call(arr, elem, i);        },        merge: function (first, second) {            var len = +second.length,                j = 0,                i = first.length;            for (; j < len; j++) {                first[i++] = second[j];            }            first.length = i;            return first;        },        grep: function (elems, callback, invert) {            var callbackInverse,                matches = [],                i = 0,                length = elems.length,                callbackExpect = !invert;            // Go through the array, only saving the items            // that pass the validator function            for (; i < length; i++) {                callbackInverse = !callback(elems[i], i);                if (callbackInverse !== callbackExpect) {                    matches.push(elems[i]);                }            }            return matches;        },        // arg is for internal usage only        map: function (elems, callback, arg) {            var value,                i = 0,                length = elems.length,                isArray = isArraylike(elems),                ret = [];            // Go through the array, translating each of the items to their new values            if (isArray) {                for (; i < length; i++) {                    value = callback(elems[i], i, arg);                    if (value != null) {                        ret.push(value);                    }                }                // Go through every key on the object,            } else {                for (i in elems) {                    value = callback(elems[i], i, arg);                    if (value != null) {                        ret.push(value);                    }                }            }            // Flatten any nested arrays            return concat.apply([], ret);        },        // A global GUID counter for objects        guid: 1,        // Bind a function to a context, optionally partially applying any        // arguments.        proxy: function (fn, context) {            var tmp, args, proxy;            if (typeof context === "string") {                tmp = fn[context];                context = fn;                fn = tmp;            }            // Quick check to determine if target is callable, in the spec            // this throws a TypeError, but we will just return undefined.            if (!jQuery.isFunction(fn)) {                return undefined;            }            // Simulated bind            args = slice.call(arguments, 2);            proxy = function () {                return fn.apply(context || this, args.concat(slice.call(arguments)));            };            // Set the guid of unique handler to the same of original handler, so it can be removed            proxy.guid = fn.guid = fn.guid || jQuery.guid++;            return proxy;        },        now: Date.now,        // jQuery.support is not used in Core but other projects attach their        // properties to it so it needs to exist.        support: support    });// Populate the class2type map    jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) {        class2type["[object " + name + "]"] = name.toLowerCase();    });    function isArraylike(obj) {        // Support: iOS 8.2 (not reproducible in simulator)        // `in` check used to prevent JIT error (gh-2145)        // hasOwn isn't used here due to false negatives        // regarding Nodelist length in IE        var length = "length" in obj && obj.length,            type = jQuery.type(obj);        if (type === "function" || jQuery.isWindow(obj)) {            return false;        }        if (obj.nodeType === 1 && length) {            return true;        }        return type === "array" || length === 0 ||            typeof length === "number" && length > 0 && ( length - 1 ) in obj;    }    var Sizzle =        /*!         * Sizzle CSS Selector Engine v2.2.0-pre         * http://sizzlejs.com/         *         * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors         * Released under the MIT license         * http://jquery.org/license         *         * Date: 2014-12-16         */        (function (window) {            var i,                support,                Expr,                getText,                isXML,                tokenize,                compile,                select,                outermostContext,                sortInput,                hasDuplicate,            // Local document vars                setDocument,                document,                docElem,                documentIsHTML,                rbuggyQSA,                rbuggyMatches,                matches,                contains,            // Instance-specific data                expando = "sizzle" + 1 * new Date(),                preferredDoc = window.document,                dirruns = 0,                done = 0,                classCache = createCache(),                tokenCache = createCache(),                compilerCache = createCache(),                sortOrder = function (a, b) {                    if (a === b) {                        hasDuplicate = true;                    }                    return 0;                },            // General-purpose constants                MAX_NEGATIVE = 1 << 31,            // Instance methods                hasOwn = ({}).hasOwnProperty,                arr = [],                pop = arr.pop,                push_native = arr.push,                push = arr.push,                slice = arr.slice,            // Use a stripped-down indexOf as it's faster than native            // http://jsperf.com/thor-indexof-vs-for/5                indexOf = function (list, elem) {                    var i = 0,                        len = list.length;                    for (; i < len; i++) {                        if (list[i] === elem) {                            return i;                        }                    }                    return -1;                },                booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",            // Regular expressions            // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace                whitespace = "[\\x20\\t\\r\\n\\f]",            // http://www.w3.org/TR/css3-syntax/#characters                characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",            // Loosely modeled on CSS identifier characters            // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors            // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier                identifier = characterEncoding.replace("w", "w#"),            // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors                attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +                        // Operator (capture 2)                    "*([*^$|!~]?=)" + whitespace +                        // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"                    "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +                    "*\\]",                pseudos = ":(" + characterEncoding + ")(?:\\((" +                        // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:                        // 1. quoted (capture 3; capture 4 or capture 5)                    "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +                        // 2. simple (capture 6)                    "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +                        // 3. anything else (capture 2)                    ".*" +                    ")\\)|)",            // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter                rwhitespace = new RegExp(whitespace + "+", "g"),                rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),                rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),                rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),                rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),                rpseudo = new RegExp(pseudos),                ridentifier = new RegExp("^" + identifier + "$"),                matchExpr = {                    "ID": new RegExp("^#(" + characterEncoding + ")"),                    "CLASS": new RegExp("^\\.(" + characterEncoding + ")"),                    "TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),                    "ATTR": new RegExp("^" + attributes),                    "PSEUDO": new RegExp("^" + pseudos),                    "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +                        "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +                        "*(\\d+)|))" + whitespace + "*\\)|)", "i"),                    "bool": new RegExp("^(?:" + booleans + ")$", "i"),                    // For use in libraries implementing .is()                    // We use this for POS matching in `select`                    "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")                },                rinputs = /^(?:input|select|textarea|button)$/i,                rheader = /^h\d$/i,                rnative = /^[^{]+\{\s*\[native \w/,            // Easily-parseable/retrievable ID or TAG or CLASS selectors                rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,                rsibling = /[+~]/,                rescape = /'|\\/g,            // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters                runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),                funescape = function (_, escaped, escapedWhitespace) {                    var high = "0x" + escaped - 0x10000;                    // NaN means non-codepoint                    // Support: Firefox<24                    // Workaround erroneous numeric interpretation of +"0x"                    return high !== high || escapedWhitespace ?                        escaped :                        high < 0 ?                            // BMP codepoint                            String.fromCharCode(high + 0x10000) :                            // Supplemental Plane codepoint (surrogate pair)                            String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);                },            // Used for iframes            // See setDocument()            // Removing the function wrapper causes a "Permission Denied"            // error in IE                unloadHandler = function () {                    setDocument();                };// Optimize for push.apply( _, NodeList )            try {                push.apply(                    (arr = slice.call(preferredDoc.childNodes)),                    preferredDoc.childNodes                );                // Support: Android<4.0                // Detect silently failing push.apply                arr[preferredDoc.childNodes.length].nodeType;            } catch (e) {                push = {                    apply: arr.length ?                        // Leverage slice if possible                        function (target, els) {                            push_native.apply(target, slice.call(els));                        } :                        // Support: IE<9                        // Otherwise append directly                        function (target, els) {                            var j = target.length,                                i = 0;                            // Can't trust NodeList.length                            while ((target[j++] = els[i++])) {                            }                            target.length = j - 1;                        }                };            }            function Sizzle(selector, context, results, seed) {                var match, elem, m, nodeType,                // QSA vars                    i, groups, old, nid, newContext, newSelector;                if (( context ? context.ownerDocument || context : preferredDoc ) !== document) {                    setDocument(context);                }                context = context || document;                results = results || [];                nodeType = context.nodeType;                if (typeof selector !== "string" || !selector ||                    nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {                    return results;                }                if (!seed && documentIsHTML) {                    // Try to shortcut find operations when possible (e.g., not under DocumentFragment)                    if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {                        // Speed-up: Sizzle("#ID")                        if ((m = match[1])) {                            if (nodeType === 9) {                                elem = context.getElementById(m);                                // Check parentNode to catch when Blackberry 4.6 returns                                // nodes that are no longer in the document (jQuery #6963)                                if (elem && elem.parentNode) {                                    // Handle the case where IE, Opera, and Webkit return items                                    // by name instead of ID                                    if (elem.id === m) {                                        results.push(elem);                                        return results;                                    }                                } else {                                    return results;                                }                            } else {                                // Context is not a document                                if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) &&                                    contains(context, elem) && elem.id === m) {                                    results.push(elem);                                    return results;                                }                            }                            // Speed-up: Sizzle("TAG")                        } else if (match[2]) {                            push.apply(results, context.getElementsByTagName(selector));                            return results;                            // Speed-up: Sizzle(".CLASS")                        } else if ((m = match[3]) && support.getElementsByClassName) {                            push.apply(results, context.getElementsByClassName(m));                            return results;                        }                    }                    // QSA path                    if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {                        nid = old = expando;                        newContext = context;                        newSelector = nodeType !== 1 && selector;                        // qSA works strangely on Element-rooted queries                        // We can work around this by specifying an extra ID on the root                        // and working up from there (Thanks to Andrew Dupont for the technique)                        // IE 8 doesn't work on object elements                        if (nodeType === 1 && context.nodeName.toLowerCase() !== "object") {                            groups = tokenize(selector);                            if ((old = context.getAttribute("id"))) {                                nid = old.replace(rescape, "\\$&");                            } else {                                context.setAttribute("id", nid);                            }                            nid = "[id='" + nid + "'] ";                            i = groups.length;                            while (i--) {                                groups[i] = nid + toSelector(groups[i]);                            }                            newContext = rsibling.test(selector) && testContext(context.parentNode) || context;                            newSelector = groups.join(",");                        }                        if (newSelector) {                            try {                                push.apply(results,                                    newContext.querySelectorAll(newSelector)                                );                                return results;                            } catch (qsaError) {                            } finally {                                if (!old) {                                    context.removeAttribute("id");                                }                            }                        }                    }                }                // All others                return select(selector.replace(rtrim, "$1"), context, results, seed);            }            /**             * Create key-value caches of limited size             * @returns {Function(string, Object)} Returns the Object data after storing it on itself with             *    property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)             *    deleting the oldest entry             */            function createCache() {                var keys = [];                function cache(key, value) {                    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)                    if (keys.push(key + " ") > Expr.cacheLength) {                        // Only keep the most recent entries                        delete cache[keys.shift()];                    }                    return (cache[key + " "] = value);                }                return cache;            }            /**             * Mark a function for special use by Sizzle             * @param {Function} fn The function to mark             */            function markFunction(fn) {                fn[expando] = true;                return fn;            }            /**             * Support testing using an element             * @param {Function} fn Passed the created div and expects a boolean result             */            function assert(fn) {                var div = document.createElement("div");                try {                    return !!fn(div);                } catch (e) {                    return false;                } finally {                    // Remove from its parent by default                    if (div.parentNode) {                        div.parentNode.removeChild(div);                    }                    // release memory in IE                    div = null;                }            }            /**             * Adds the same handler for all of the specified attrs             * @param {String} attrs Pipe-separated list of attributes             * @param {Function} handler The method that will be applied             */            function addHandle(attrs, handler) {                var arr = attrs.split("|"),                    i = attrs.length;                while (i--) {                    Expr.attrHandle[arr[i]] = handler;                }            }            /**             * Checks document order of two siblings             * @param {Element} a             * @param {Element} b             * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b             */            function siblingCheck(a, b) {                var cur = b && a,                    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&                        ( ~b.sourceIndex || MAX_NEGATIVE ) -                        ( ~a.sourceIndex || MAX_NEGATIVE );                // Use IE sourceIndex if available on both nodes                if (diff) {                    return diff;                }                // Check if b follows a                if (cur) {                    while ((cur = cur.nextSibling)) {                        if (cur === b) {                            return -1;                        }                    }                }                return a ? 1 : -1;            }            /**             * Returns a function to use in pseudos for input types             * @param {String} type             */            function createInputPseudo(type) {                return function (elem) {                    var name = elem.nodeName.toLowerCase();                    return name === "input" && elem.type === type;                };            }            /**             * Returns a function to use in pseudos for buttons             * @param {String} type             */            function createButtonPseudo(type) {                return function (elem) {                    var name = elem.nodeName.toLowerCase();                    return (name === "input" || name === "button") && elem.type === type;                };            }            /**             * Returns a function to use in pseudos for positionals             * @param {Function} fn             */            function createPositionalPseudo(fn) {                return markFunction(function (argument) {                    argument = +argument;                    return markFunction(function (seed, matches) {                        var j,                            matchIndexes = fn([], seed.length, argument),                            i = matchIndexes.length;                        // Match elements found at the specified indexes                        while (i--) {                            if (seed[(j = matchIndexes[i])]) {                                seed[j] = !(matches[j] = seed[j]);                            }                        }                    });                });            }            /**             * Checks a node for validity as a Sizzle context             * @param {Element|Object=} context             * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value             */            function testContext(context) {                return context && typeof context.getElementsByTagName !== "undefined" && context;            }// Expose support vars for convenience            support = Sizzle.support = {};            /**             * Detects XML nodes             * @param {Element|Object} elem An element or a document             * @returns {Boolean} True iff elem is a non-HTML XML node             */            isXML = Sizzle.isXML = function (elem) {                // documentElement is verified for cases where it doesn't yet exist                // (such as loading iframes in IE - #4833)                var documentElement = elem && (elem.ownerDocument || elem).documentElement;                return documentElement ? documentElement.nodeName !== "HTML" : false;            };            /**             * Sets document-related variables once based on the current document             * @param {Element|Object} [doc] An element or document object to use to set the document             * @returns {Object} Returns the current document             */            setDocument = Sizzle.setDocument = function (node) {                var hasCompare, parent,                    doc = node ? node.ownerDocument || node : preferredDoc;                // If no document and documentElement is available, return                if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {                    return document;                }                // Set our document                document = doc;                docElem = doc.documentElement;                parent = doc.defaultView;                // Support: IE>8                // If iframe document is assigned to "document" variable and if iframe has been reloaded,                // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936                // IE6-8 do not support the defaultView property so parent will be undefined                if (parent && parent !== parent.top) {                    // IE11 does not have attachEvent, so all must suffer                    if (parent.addEventListener) {                        parent.addEventListener("unload", unloadHandler, false);                    } else if (parent.attachEvent) {                        parent.attachEvent("onunload", unloadHandler);                    }                }                /* Support tests                 ---------------------------------------------------------------------- */                documentIsHTML = !isXML(doc);                /* Attributes                 ---------------------------------------------------------------------- */                // Support: IE<8                // Verify that getAttribute really returns attributes and not properties                // (excepting IE8 booleans)                support.attributes = assert(function (div) {                    div.className = "i";                    return !div.getAttribute("className");                });                /* getElement(s)By*                 ---------------------------------------------------------------------- */                // Check if getElementsByTagName("*") returns only elements                support.getElementsByTagName = assert(function (div) {                    div.appendChild(doc.createComment(""));                    return !div.getElementsByTagName("*").length;                });                // Support: IE<9                support.getElementsByClassName = rnative.test(doc.getElementsByClassName);                // Support: IE<10                // Check if getElementById returns elements by name                // The broken getElementById methods don't pick up programatically-set names,                // so use a roundabout getElementsByName test                support.getById = assert(function (div) {                    docElem.appendChild(div).id = expando;                    return !doc.getElementsByName || !doc.getElementsByName(expando).length;                });                // ID find and filter                if (support.getById) {                    Expr.find["ID"] = function (id, context) {                        if (typeof context.getElementById !== "undefined" && documentIsHTML) {                            var m = context.getElementById(id);                            // Check parentNode to catch when Blackberry 4.6 returns                            // nodes that are no longer in the document #6963                            return m && m.parentNode ? [m] : [];                        }                    };                    Expr.filter["ID"] = function (id) {                        var attrId = id.replace(runescape, funescape);                        return function (elem) {                            return elem.getAttribute("id") === attrId;                        };                    };                } else {                    // Support: IE6/7                    // getElementById is not reliable as a find shortcut                    delete Expr.find["ID"];                    Expr.filter["ID"] = function (id) {                        var attrId = id.replace(runescape, funescape);                        return function (elem) {                            var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");                            return node && node.value === attrId;                        };                    };                }                // Tag                Expr.find["TAG"] = support.getElementsByTagName ?                    function (tag, context) {                        if (typeof context.getElementsByTagName !== "undefined") {                            return context.getElementsByTagName(tag);                            // DocumentFragment nodes don't have gEBTN                        } else if (support.qsa) {                            return context.querySelectorAll(tag);                        }                    } :                    function (tag, context) {                        var elem,                            tmp = [],                            i = 0,                        // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too                            results = context.getElementsByTagName(tag);                        // Filter out possible comments                        if (tag === "*") {                            while ((elem = results[i++])) {                                if (elem.nodeType === 1) {                                    tmp.push(elem);                                }                            }                            return tmp;                        }                        return results;                    };                // Class                Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {                        if (documentIsHTML) {                            return context.getElementsByClassName(className);                        }                    };                /* QSA/matchesSelector                 ---------------------------------------------------------------------- */                // QSA and matchesSelector support                // matchesSelector(:active) reports false when true (IE9/Opera 11.5)                rbuggyMatches = [];                // qSa(:focus) reports false when true (Chrome 21)                // We allow this because of a bug in IE8/9 that throws an error                // whenever `document.activeElement` is accessed on an iframe                // So, we allow :focus to pass through QSA all the time to avoid the IE error                // See http://bugs.jquery.com/ticket/13378                rbuggyQSA = [];                if ((support.qsa = rnative.test(doc.querySelectorAll))) {                    // Build QSA regex                    // Regex strategy adopted from Diego Perini                    assert(function (div) {                        // Select is set to empty string on purpose                        // This is to test IE's treatment of not explicitly                        // setting a boolean content attribute,                        // since its presence should be enough                        // http://bugs.jquery.com/ticket/12359                        docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" +                            "<select id='" + expando + "-\f]' msallowcapture=''>" +                            "<option selected=''></option></select>";                        // Support: IE8, Opera 11-12.16                        // Nothing should be selected when empty strings follow ^= or $= or *=                        // The test attribute must be unknown in Opera but "safe" for WinRT                        // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section                        if (div.querySelectorAll("[msallowcapture^='']").length) {                            rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");                        }                        // Support: IE8                        // Boolean attributes and "value" are not treated correctly                        if (!div.querySelectorAll("[selected]").length) {                            rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");                        }                        // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+                        if (!div.querySelectorAll("[id~=" + expando + "-]").length) {                            rbuggyQSA.push("~=");                        }                        // Webkit/Opera - :checked should return selected option elements                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked                        // IE8 throws error here and will not see later tests                        if (!div.querySelectorAll(":checked").length) {                            rbuggyQSA.push(":checked");                        }                        // Support: Safari 8+, iOS 8+                        // https://bugs.webkit.org/show_bug.cgi?id=136851                        // In-page `selector#id sibing-combinator selector` fails                        if (!div.querySelectorAll("a#" + expando + "+*").length) {                            rbuggyQSA.push(".#.+[+~]");                        }                    });                    assert(function (div) {                        // Support: Windows 8 Native Apps                        // The type and name attributes are restricted during .innerHTML assignment                        var input = doc.createElement("input");                        input.setAttribute("type", "hidden");                        div.appendChild(input).setAttribute("name", "D");                        // Support: IE8                        // Enforce case-sensitivity of name attribute                        if (div.querySelectorAll("[name=d]").length) {                            rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");                        }                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)                        // IE8 throws error here and will not see later tests                        if (!div.querySelectorAll(":enabled").length) {                            rbuggyQSA.push(":enabled", ":disabled");                        }                        // Opera 10-11 does not throw on post-comma invalid pseudos                        div.querySelectorAll("*,:x");                        rbuggyQSA.push(",.*:");                    });                }                if ((support.matchesSelector = rnative.test((matches = docElem.matches ||                        docElem.webkitMatchesSelector ||                        docElem.mozMatchesSelector ||                        docElem.oMatchesSelector ||                        docElem.msMatchesSelector)))) {                    assert(function (div) {                        // Check to see if it's possible to do matchesSelector                        // on a disconnected node (IE 9)                        support.disconnectedMatch = matches.call(div, "div");                        // This should fail with an exception                        // Gecko does not error, returns false instead                        matches.call(div, "[s!='']:x");                        rbuggyMatches.push("!=", pseudos);                    });                }                rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));                rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));                /* Contains                 ---------------------------------------------------------------------- */                hasCompare = rnative.test(docElem.compareDocumentPosition);                // Element contains another                // Purposefully does not implement inclusive descendent                // As in, an element does not contain itself                contains = hasCompare || rnative.test(docElem.contains) ?                    function (a, b) {                        var adown = a.nodeType === 9 ? a.documentElement : a,                            bup = b && b.parentNode;                        return a === bup || !!( bup && bup.nodeType === 1 && (                                adown.contains ?                                    adown.contains(bup) :                                a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16                            ));                    } :                    function (a, b) {                        if (b) {                            while ((b = b.parentNode)) {                                if (b === a) {                                    return true;                                }                            }                        }                        return false;                    };                /* Sorting                 ---------------------------------------------------------------------- */                // Document order sorting                sortOrder = hasCompare ?                    function (a, b) {                        // Flag for duplicate removal                        if (a === b) {                            hasDuplicate = true;                            return 0;                        }                        // Sort on method existence if only one input has compareDocumentPosition                        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;                        if (compare) {                            return compare;                        }                        // Calculate position if both inputs belong to the same document                        compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?                            a.compareDocumentPosition(b) :                            // Otherwise we know they are disconnected                            1;                        // Disconnected nodes                        if (compare & 1 ||                            (!support.sortDetached && b.compareDocumentPosition(a) === compare)) {                            // Choose the first element that is related to our preferred document                            if (a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {                                return -1;                            }                            if (b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {                                return 1;                            }                            // Maintain original order                            return sortInput ?                                ( indexOf(sortInput, a) - indexOf(sortInput, b) ) :                                0;                        }                        return compare & 4 ? -1 : 1;                    } :                    function (a, b) {                        // Exit early if the nodes are identical                        if (a === b) {                            hasDuplicate = true;                            return 0;                        }                        var cur,                            i = 0,                            aup = a.parentNode,                            bup = b.parentNode,                            ap = [a],                            bp = [b];                        // Parentless nodes are either documents or disconnected                        if (!aup || !bup) {                            return a === doc ? -1 :                                b === doc ? 1 :                                    aup ? -1 :                                        bup ? 1 :                                            sortInput ?                                                ( indexOf(sortInput, a) - indexOf(sortInput, b) ) :                                                0;                            // If the nodes are siblings, we can do a quick check                        } else if (aup === bup) {                            return siblingCheck(a, b);                        }                        // Otherwise we need full lists of their ancestors for comparison                        cur = a;                        while ((cur = cur.parentNode)) {                            ap.unshift(cur);                        }                        cur = b;                        while ((cur = cur.parentNode)) {                            bp.unshift(cur);                        }                        // Walk down the tree looking for a discrepancy                        while (ap[i] === bp[i]) {                            i++;                        }                        return i ?                            // Do a sibling check if the nodes have a common ancestor                            siblingCheck(ap[i], bp[i]) :                            // Otherwise nodes in our document sort first                            ap[i] === preferredDoc ? -1 :                                bp[i] === preferredDoc ? 1 :                                    0;                    };                return doc;            };            Sizzle.matches = function (expr, elements) {                return Sizzle(expr, null, null, elements);            };            Sizzle.matchesSelector = function (elem, expr) {                // Set document vars if needed                if (( elem.ownerDocument || elem ) !== document) {                    setDocument(elem);                }                // Make sure that attribute selectors are quoted                expr = expr.replace(rattributeQuotes, "='$1']");                if (support.matchesSelector && documentIsHTML &&                    ( !rbuggyMatches || !rbuggyMatches.test(expr) ) &&                    ( !rbuggyQSA || !rbuggyQSA.test(expr) )) {                    try {                        var ret = matches.call(elem, expr);                        // IE 9's matchesSelector returns false on disconnected nodes                        if (ret || support.disconnectedMatch ||                                // As well, disconnected nodes are said to be in a document                                // fragment in IE 9                            elem.document && elem.document.nodeType !== 11) {                            return ret;                        }                    } catch (e) {                    }                }                return Sizzle(expr, document, null, [elem]).length > 0;            };            Sizzle.contains = function (context, elem) {                // Set document vars if needed                if (( context.ownerDocument || context ) !== document) {                    setDocument(context);                }                return contains(context, elem);            };            Sizzle.attr = function (elem, name) {                // Set document vars if needed                if (( elem.ownerDocument || elem ) !== document) {                    setDocument(elem);                }                var fn = Expr.attrHandle[name.toLowerCase()],                // Don't get fooled by Object.prototype properties (jQuery #13807)                    val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?                        fn(elem, name, !documentIsHTML) :                        undefined;                return val !== undefined ?                    val :                    support.attributes || !documentIsHTML ?                        elem.getAttribute(name) :                        (val = elem.getAttributeNode(name)) && val.specified ?                            val.value :                            null;            };            Sizzle.error = function (msg) {                throw new Error("Syntax error, unrecognized expression: " + msg);            };            /**             * Document sorting and removing duplicates             * @param {ArrayLike} results             */            Sizzle.uniqueSort = function (results) {                var elem,                    duplicates = [],                    j = 0,                    i = 0;                // Unless we *know* we can detect duplicates, assume their presence                hasDuplicate = !support.detectDuplicates;                sortInput = !support.sortStable && results.slice(0);                results.sort(sortOrder);                if (hasDuplicate) {                    while ((elem = results[i++])) {                        if (elem === results[i]) {                            j = duplicates.push(i);                        }                    }                    while (j--) {                        results.splice(duplicates[j], 1);                    }                }                // Clear input after sorting to release objects                // See https://github.com/jquery/sizzle/pull/225                sortInput = null;                return results;            };            /**             * Utility function for retrieving the text value of an array of DOM nodes             * @param {Array|Element} elem             */            getText = Sizzle.getText = function (elem) {                var node,                    ret = "",                    i = 0,                    nodeType = elem.nodeType;                if (!nodeType) {                    // If no nodeType, this is expected to be an array                    while ((node = elem[i++])) {                        // Do not traverse comment nodes                        ret += getText(node);                    }                } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {                    // Use textContent for elements                    // innerText usage removed for consistency of new lines (jQuery #11153)                    if (typeof elem.textContent === "string") {                        return elem.textContent;                    } else {                        // Traverse its children                        for (elem = elem.firstChild; elem; elem = elem.nextSibling) {                            ret += getText(elem);                        }                    }                } else if (nodeType === 3 || nodeType === 4) {                    return elem.nodeValue;                }                // Do not include comment or processing instruction nodes                return ret;            };            Expr = Sizzle.selectors = {                // Can be adjusted by the user                cacheLength: 50,                createPseudo: markFunction,                match: matchExpr,                attrHandle: {},                find: {},                relative: {                    ">": {dir: "parentNode", first: true},                    " ": {dir: "parentNode"},                    "+": {dir: "previousSibling", first: true},                    "~": {dir: "previousSibling"}                },                preFilter: {                    "ATTR": function (match) {                        match[1] = match[1].replace(runescape, funescape);                        // Move the given value to match[3] whether quoted or unquoted                        match[3] = ( match[3] || match[4] || match[5] || "" ).replace(runescape, funescape);                        if (match[2] === "~=") {                            match[3] = " " + match[3] + " ";                        }                        return match.slice(0, 4);                    },                    "CHILD": function (match) {                        /* matches from matchExpr["CHILD"]                         1 type (only|nth|...)                         2 what (child|of-type)                         3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)                         4 xn-component of xn+y argument ([+-]?\d*n|)                         5 sign of xn-component                         6 x of xn-component                         7 sign of y-component                         8 y of y-component                         */                        match[1] = match[1].toLowerCase();                        if (match[1].slice(0, 3) === "nth") {                            // nth-* requires argument                            if (!match[3]) {                                Sizzle.error(match[0]);                            }                            // numeric x and y parameters for Expr.filter.CHILD                            // remember that false/true cast respectively to 0/1                            match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );                            match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );                            // other types prohibit arguments                        } else if (match[3]) {                            Sizzle.error(match[0]);                        }                        return match;                    },                    "PSEUDO": function (match) {                        var excess,                            unquoted = !match[6] && match[2];                        if (matchExpr["CHILD"].test(match[0])) {                            return null;                        }                        // Accept quoted arguments as-is                        if (match[3]) {                            match[2] = match[4] || match[5] || "";                            // Strip excess characters from unquoted arguments                        } else if (unquoted && rpseudo.test(unquoted) &&                                // Get excess from tokenize (recursively)                            (excess = tokenize(unquoted, true)) &&                                // advance to the next closing parenthesis                            (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {                            // excess is a negative index                            match[0] = match[0].slice(0, excess);                            match[2] = unquoted.slice(0, excess);                        }                        // Return only captures needed by the pseudo filter method (type and argument)                        return match.slice(0, 3);                    }                },                filter: {                    "TAG": function (nodeNameSelector) {                        var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();                        return nodeNameSelector === "*" ?                            function () {                                return true;                            } :                            function (elem) {                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;                            };                    },                    "CLASS": function (className) {                        var pattern = classCache[className + " "];                        return pattern ||                            (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) &&                            classCache(className, function (elem) {                                return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");                            });                    },                    "ATTR": function (name, operator, check) {                        return function (elem) {                            var result = Sizzle.attr(elem, name);                            if (result == null) {                                return operator === "!=";                            }                            if (!operator) {                                return true;                            }                            result += "";                            return operator === "=" ? result === check :                                operator === "!=" ? result !== check :                                    operator === "^=" ? check && result.indexOf(check) === 0 :                                        operator === "*=" ? check && result.indexOf(check) > -1 :                                            operator === "$=" ? check && result.slice(-check.length) === check :                                                operator === "~=" ? ( " " + result.replace(rwhitespace, " ") + " " ).indexOf(check) > -1 :                                                    operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" :                                                        false;                        };                    },                    "CHILD": function (type, what, argument, first, last) {                        var simple = type.slice(0, 3) !== "nth",                            forward = type.slice(-4) !== "last",                            ofType = what === "of-type";                        return first === 1 && last === 0 ?                            // Shortcut for :nth-*(n)                            function (elem) {                                return !!elem.parentNode;                            } :                            function (elem, context, xml) {                                var cache, outerCache, node, diff, nodeIndex, start,                                    dir = simple !== forward ? "nextSibling" : "previousSibling",                                    parent = elem.parentNode,                                    name = ofType && elem.nodeName.toLowerCase(),                                    useCache = !xml && !ofType;                                if (parent) {                                    // :(first|last|only)-(child|of-type)                                    if (simple) {                                        while (dir) {                                            node = elem;                                            while ((node = node[dir])) {                                                if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {                                                    return false;                                                }                                            }                                            // Reverse direction for :only-* (if we haven't yet done so)                                            start = dir = type === "only" && !start && "nextSibling";                                        }                                        return true;                                    }                                    start = [forward ? parent.firstChild : parent.lastChild];                                    // non-xml :nth-child(...) stores cache data on `parent`                                    if (forward && useCache) {                                        // Seek `elem` from a previously-cached index                                        outerCache = parent[expando] || (parent[expando] = {});                                        cache = outerCache[type] || [];                                        nodeIndex = cache[0] === dirruns && cache[1];                                        diff = cache[0] === dirruns && cache[2];                                        node = nodeIndex && parent.childNodes[nodeIndex];                                        while ((node = ++nodeIndex && node && node[dir] ||                                                // Fallback to seeking `elem` from the start                                            (diff = nodeIndex = 0) || start.pop())) {                                            // When found, cache indexes on `parent` and break                                            if (node.nodeType === 1 && ++diff && node === elem) {                                                outerCache[type] = [dirruns, nodeIndex, diff];                                                break;                                            }                                        }                                        // Use previously-cached element index if available                                    } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) {                                        diff = cache[1];                                        // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)                                    } else {                                        // Use the same loop as above to seek `elem` from the start                                        while ((node = ++nodeIndex && node && node[dir] ||                                            (diff = nodeIndex = 0) || start.pop())) {                                            if (( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff) {                                                // Cache the index of each encountered element                                                if (useCache) {                                                    (node[expando] || (node[expando] = {}))[type] = [dirruns, diff];                                                }                                                if (node === elem) {                                                    break;                                                }                                            }                                        }                                    }                                    // Incorporate the offset, then check against cycle size                                    diff -= last;                                    return diff === first || ( diff % first === 0 && diff / first >= 0 );                                }                            };                    },                    "PSEUDO": function (pseudo, argument) {                        // pseudo-class names are case-insensitive                        // http://www.w3.org/TR/selectors/#pseudo-classes                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters                        // Remember that setFilters inherits from pseudos                        var args,                            fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] ||                                Sizzle.error("unsupported pseudo: " + pseudo);                        // The user may use createPseudo to indicate that                        // arguments are needed to create the filter function                        // just as Sizzle does                        if (fn[expando]) {                            return fn(argument);                        }                        // But maintain support for old signatures                        if (fn.length > 1) {                            args = [pseudo, pseudo, "", argument];                            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?                                markFunction(function (seed, matches) {                                    var idx,                                        matched = fn(seed, argument),                                        i = matched.length;                                    while (i--) {                                        idx = indexOf(seed, matched[i]);                                        seed[idx] = !( matches[idx] = matched[i] );                                    }                                }) :                                function (elem) {                                    return fn(elem, 0, args);                                };                        }                        return fn;                    }                },                pseudos: {                    // Potentially complex pseudos                    "not": markFunction(function (selector) {                        // Trim the selector passed to compile                        // to avoid treating leading and trailing                        // spaces as combinators                        var input = [],                            results = [],                            matcher = compile(selector.replace(rtrim, "$1"));                        return matcher[expando] ?                            markFunction(function (seed, matches, context, xml) {                                var elem,                                    unmatched = matcher(seed, null, xml, []),                                    i = seed.length;                                // Match elements unmatched by `matcher`                                while (i--) {                                    if ((elem = unmatched[i])) {                                        seed[i] = !(matches[i] = elem);                                    }                                }                            }) :                            function (elem, context, xml) {                                input[0] = elem;                                matcher(input, null, xml, results);                                // Don't keep the element (issue #299)                                input[0] = null;                                return !results.pop();                            };                    }),                    "has": markFunction(function (selector) {                        return function (elem) {                            return Sizzle(selector, elem).length > 0;                        };                    }),                    "contains": markFunction(function (text) {                        text = text.replace(runescape, funescape);                        return function (elem) {                            return ( elem.textContent || elem.innerText || getText(elem) ).indexOf(text) > -1;                        };                    }),                    // "Whether an element is represented by a :lang() selector                    // is based solely on the element's language value                    // being equal to the identifier C,                    // or beginning with the identifier C immediately followed by "-".                    // The matching of C against the element's language value is performed case-insensitively.                    // The identifier C does not have to be a valid language name."                    // http://www.w3.org/TR/selectors/#lang-pseudo                    "lang": markFunction(function (lang) {                        // lang value must be a valid identifier                        if (!ridentifier.test(lang || "")) {                            Sizzle.error("unsupported lang: " + lang);                        }                        lang = lang.replace(runescape, funescape).toLowerCase();                        return function (elem) {                            var elemLang;                            do {                                if ((elemLang = documentIsHTML ?                                        elem.lang :                                    elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) {                                    elemLang = elemLang.toLowerCase();                                    return elemLang === lang || elemLang.indexOf(lang + "-") === 0;                                }                            } while ((elem = elem.parentNode) && elem.nodeType === 1);                            return false;                        };                    }),                    // Miscellaneous                    "target": function (elem) {                        var hash = window.location && window.location.hash;                        return hash && hash.slice(1) === elem.id;                    },                    "root": function (elem) {                        return elem === docElem;                    },                    "focus": function (elem) {                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);                    },                    // Boolean properties                    "enabled": function (elem) {                        return elem.disabled === false;                    },                    "disabled": function (elem) {                        return elem.disabled === true;                    },                    "checked": function (elem) {                        // In CSS3, :checked should return both checked and selected elements                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked                        var nodeName = elem.nodeName.toLowerCase();                        return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);                    },                    "selected": function (elem) {                        // Accessing this property makes selected-by-default                        // options in Safari work properly                        if (elem.parentNode) {                            elem.parentNode.selectedIndex;                        }                        return elem.selected === true;                    },                    // Contents                    "empty": function (elem) {                        // http://www.w3.org/TR/selectors/#empty-pseudo                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),                        //   but not by others (comment: 8; processing instruction: 7; etc.)                        // nodeType < 6 works because attributes (2) do not appear as children                        for (elem = elem.firstChild; elem; elem = elem.nextSibling) {                            if (elem.nodeType < 6) {                                return false;                            }                        }                        return true;                    },                    "parent": function (elem) {                        return !Expr.pseudos["empty"](elem);                    },                    // Element/input types                    "header": function (elem) {                        return rheader.test(elem.nodeName);                    },                    "input": function (elem) {                        return rinputs.test(elem.nodeName);                    },                    "button": function (elem) {                        var name = elem.nodeName.toLowerCase();                        return name === "input" && elem.type === "button" || name === "button";                    },                    "text": function (elem) {                        var attr;                        return elem.nodeName.toLowerCase() === "input" &&                            elem.type === "text" &&                                // Support: IE<8                                // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"                            ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );                    },                    // Position-in-collection                    "first": createPositionalPseudo(function () {                        return [0];                    }),                    "last": createPositionalPseudo(function (matchIndexes, length) {                        return [length - 1];                    }),                    "eq": createPositionalPseudo(function (matchIndexes, length, argument) {                        return [argument < 0 ? argument + length : argument];                    }),                    "even": createPositionalPseudo(function (matchIndexes, length) {                        var i = 0;                        for (; i < length; i += 2) {                            matchIndexes.push(i);                        }                        return matchIndexes;                    }),                    "odd": createPositionalPseudo(function (matchIndexes, length) {                        var i = 1;                        for (; i < length; i += 2) {                            matchIndexes.push(i);                        }                        return matchIndexes;                    }),                    "lt": createPositionalPseudo(function (matchIndexes, length, argument) {                        var i = argument < 0 ? argument + length : argument;                        for (; --i >= 0;) {                            matchIndexes.push(i);                        }                        return matchIndexes;                    }),                    "gt": createPositionalPseudo(function (matchIndexes, length, argument) {                        var i = argument < 0 ? argument + length : argument;                        for (; ++i < length;) {                            matchIndexes.push(i);                        }                        return matchIndexes;                    })                }            };            Expr.pseudos["nth"] = Expr.pseudos["eq"];// Add button/input type pseudos            for (i in {radio: true, checkbox: true, file: true, password: true, image: true}) {                Expr.pseudos[i] = createInputPseudo(i);            }            for (i in {submit: true, reset: true}) {                Expr.pseudos[i] = createButtonPseudo(i);            }// Easy API for creating new setFilters            function setFilters() {            }            setFilters.prototype = Expr.filters = Expr.pseudos;            Expr.setFilters = new setFilters();            tokenize = Sizzle.tokenize = function (selector, parseOnly) {                var matched, match, tokens, type,                    soFar, groups, preFilters,                    cached = tokenCache[selector + " "];                if (cached) {                    return parseOnly ? 0 : cached.slice(0);                }                soFar = selector;                groups = [];                preFilters = Expr.preFilter;                while (soFar) {                    // Comma and first run                    if (!matched || (match = rcomma.exec(soFar))) {                        if (match) {                            // Don't consume trailing commas as valid                            soFar = soFar.slice(match[0].length) || soFar;                        }                        groups.push((tokens = []));                    }                    matched = false;                    // Combinators                    if ((match = rcombinators.exec(soFar))) {                        matched = match.shift();                        tokens.push({                            value: matched,                            // Cast descendant combinators to space                            type: match[0].replace(rtrim, " ")                        });                        soFar = soFar.slice(matched.length);                    }                    // Filters                    for (type in Expr.filter) {                        if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] ||                            (match = preFilters[type](match)))) {                            matched = match.shift();                            tokens.push({                                value: matched,                                type: type,                                matches: match                            });                            soFar = soFar.slice(matched.length);                        }                    }                    if (!matched) {                        break;                    }                }                // Return the length of the invalid excess                // if we're just parsing                // Otherwise, throw an error or return tokens                return parseOnly ?                    soFar.length :                    soFar ?                        Sizzle.error(selector) :                        // Cache the tokens                        tokenCache(selector, groups).slice(0);            };            function toSelector(tokens) {                var i = 0,                    len = tokens.length,                    selector = "";                for (; i < len; i++) {                    selector += tokens[i].value;                }                return selector;            }            function addCombinator(matcher, combinator, base) {                var dir = combinator.dir,                    checkNonElements = base && dir === "parentNode",                    doneName = done++;                return combinator.first ?                    // Check against closest ancestor/preceding element                    function (elem, context, xml) {                        while ((elem = elem[dir])) {                            if (elem.nodeType === 1 || checkNonElements) {                                return matcher(elem, context, xml);                            }                        }                    } :                    // Check against all ancestor/preceding elements                    function (elem, context, xml) {                        var oldCache, outerCache,                            newCache = [dirruns, doneName];                        // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching                        if (xml) {                            while ((elem = elem[dir])) {                                if (elem.nodeType === 1 || checkNonElements) {                                    if (matcher(elem, context, xml)) {                                        return true;                                    }                                }                            }                        } else {                            while ((elem = elem[dir])) {                                if (elem.nodeType === 1 || checkNonElements) {                                    outerCache = elem[expando] || (elem[expando] = {});                                    if ((oldCache = outerCache[dir]) &&                                        oldCache[0] === dirruns && oldCache[1] === doneName) {                                        // Assign to newCache so results back-propagate to previous elements                                        return (newCache[2] = oldCache[2]);                                    } else {                                        // Reuse newcache so results back-propagate to previous elements                                        outerCache[dir] = newCache;                                        // A match means we're done; a fail means we have to keep checking                                        if ((newCache[2] = matcher(elem, context, xml))) {                                            return true;                                        }                                    }                                }                            }                        }                    };            }            function elementMatcher(matchers) {                return matchers.length > 1 ?                    function (elem, context, xml) {                        var i = matchers.length;                        while (i--) {                            if (!matchers[i](elem, context, xml)) {                                return false;                            }                        }                        return true;                    } :                    matchers[0];            }            function multipleContexts(selector, contexts, results) {                var i = 0,                    len = contexts.length;                for (; i < len; i++) {                    Sizzle(selector, contexts[i], results);                }                return results;            }            function condense(unmatched, map, filter, context, xml) {                var elem,                    newUnmatched = [],                    i = 0,                    len = unmatched.length,                    mapped = map != null;                for (; i < len; i++) {                    if ((elem = unmatched[i])) {                        if (!filter || filter(elem, context, xml)) {                            newUnmatched.push(elem);                            if (mapped) {                                map.push(i);                            }                        }                    }                }                return newUnmatched;            }            function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {                if (postFilter && !postFilter[expando]) {                    postFilter = setMatcher(postFilter);                }                if (postFinder && !postFinder[expando]) {                    postFinder = setMatcher(postFinder, postSelector);                }                return markFunction(function (seed, results, context, xml) {                    var temp, i, elem,                        preMap = [],                        postMap = [],                        preexisting = results.length,                    // Get initial elements from seed or context                        elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),                    // Prefilter to get matcher input, preserving a map for seed-results synchronization                        matcherIn = preFilter && ( seed || !selector ) ?                            condense(elems, preMap, preFilter, context, xml) :                            elems,                        matcherOut = matcher ?                            // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,                            postFinder || ( seed ? preFilter : preexisting || postFilter ) ?                                // ...intermediate processing is necessary                                [] :                                // ...otherwise use results directly                                results :                            matcherIn;                    // Find primary matches                    if (matcher) {                        matcher(matcherIn, matcherOut, context, xml);                    }                    // Apply postFilter                    if (postFilter) {                        temp = condense(matcherOut, postMap);                        postFilter(temp, [], context, xml);                        // Un-match failing elements by moving them back to matcherIn                        i = temp.length;                        while (i--) {                            if ((elem = temp[i])) {                                matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);                            }                        }                    }                    if (seed) {                        if (postFinder || preFilter) {                            if (postFinder) {                                // Get the final matcherOut by condensing this intermediate into postFinder contexts                                temp = [];                                i = matcherOut.length;                                while (i--) {                                    if ((elem = matcherOut[i])) {                                        // Restore matcherIn since elem is not yet a final match                                        temp.push((matcherIn[i] = elem));                                    }                                }                                postFinder(null, (matcherOut = []), temp, xml);                            }                            // Move matched elements from seed to results to keep them synchronized                            i = matcherOut.length;                            while (i--) {                                if ((elem = matcherOut[i]) &&                                    (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {                                    seed[temp] = !(results[temp] = elem);                                }                            }                        }                        // Add elements to results, through postFinder if defined                    } else {                        matcherOut = condense(                            matcherOut === results ?                                matcherOut.splice(preexisting, matcherOut.length) :                                matcherOut                        );                        if (postFinder) {                            postFinder(null, results, matcherOut, xml);                        } else {                            push.apply(results, matcherOut);                        }                    }                });            }            function matcherFromTokens(tokens) {                var checkContext, matcher, j,                    len = tokens.length,                    leadingRelative = Expr.relative[tokens[0].type],                    implicitRelative = leadingRelative || Expr.relative[" "],                    i = leadingRelative ? 1 : 0,                // The foundational matcher ensures that elements are reachable from top-level context(s)                    matchContext = addCombinator(function (elem) {                        return elem === checkContext;                    }, implicitRelative, true),                    matchAnyContext = addCombinator(function (elem) {                        return indexOf(checkContext, elem) > -1;                    }, implicitRelative, true),                    matchers = [function (elem, context, xml) {                        var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (                                (checkContext = context).nodeType ?                                    matchContext(elem, context, xml) :                                    matchAnyContext(elem, context, xml) );                        // Avoid hanging onto element (issue #299)                        checkContext = null;                        return ret;                    }];                for (; i < len; i++) {                    if ((matcher = Expr.relative[tokens[i].type])) {                        matchers = [addCombinator(elementMatcher(matchers), matcher)];                    } else {                        matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);                        // Return special upon seeing a positional matcher                        if (matcher[expando]) {                            // Find the next relative operator (if any) for proper handling                            j = ++i;                            for (; j < len; j++) {                                if (Expr.relative[tokens[j].type]) {                                    break;                                }                            }                            return setMatcher(                                i > 1 && elementMatcher(matchers),                                i > 1 && toSelector(                                    // If the preceding token was a descendant combinator, insert an implicit any-element `*`                                    tokens.slice(0, i - 1).concat({value: tokens[i - 2].type === " " ? "*" : ""})                                ).replace(rtrim, "$1"),                                matcher,                                i < j && matcherFromTokens(tokens.slice(i, j)),                                j < len && matcherFromTokens((tokens = tokens.slice(j))),                                j < len && toSelector(tokens)                            );                        }                        matchers.push(matcher);                    }                }                return elementMatcher(matchers);            }            function matcherFromGroupMatchers(elementMatchers, setMatchers) {                var bySet = setMatchers.length > 0,                    byElement = elementMatchers.length > 0,                    superMatcher = function (seed, context, xml, results, outermost) {                        var elem, j, matcher,                            matchedCount = 0,                            i = "0",                            unmatched = seed && [],                            setMatched = [],                            contextBackup = outermostContext,                        // We must always have either seed elements or outermost context                            elems = seed || byElement && Expr.find["TAG"]("*", outermost),                        // Use integer dirruns iff this is the outermost matcher                            dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),                            len = elems.length;                        if (outermost) {                            outermostContext = context !== document && context;                        }                        // Add elements passing elementMatchers directly to results                        // Keep `i` a string if there are no elements so `matchedCount` will be "00" below                        // Support: IE<9, Safari                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id                        for (; i !== len && (elem = elems[i]) != null; i++) {                            if (byElement && elem) {                                j = 0;                                while ((matcher = elementMatchers[j++])) {                                    if (matcher(elem, context, xml)) {                                        results.push(elem);                                        break;                                    }                                }                                if (outermost) {                                    dirruns = dirrunsUnique;                                }                            }                            // Track unmatched elements for set filters                            if (bySet) {                                // They will have gone through all possible matchers                                if ((elem = !matcher && elem)) {                                    matchedCount--;                                }                                // Lengthen the array for every element, matched or not                                if (seed) {                                    unmatched.push(elem);                                }                            }                        }                        // Apply set filters to unmatched elements                        matchedCount += i;                        if (bySet && i !== matchedCount) {                            j = 0;                            while ((matcher = setMatchers[j++])) {                                matcher(unmatched, setMatched, context, xml);                            }                            if (seed) {                                // Reintegrate element matches to eliminate the need for sorting                                if (matchedCount > 0) {                                    while (i--) {                                        if (!(unmatched[i] || setMatched[i])) {                                            setMatched[i] = pop.call(results);                                        }                                    }                                }                                // Discard index placeholder values to get only actual matches                                setMatched = condense(setMatched);                            }                            // Add matches to results                            push.apply(results, setMatched);                            // Seedless set matches succeeding multiple successful matchers stipulate sorting                            if (outermost && !seed && setMatched.length > 0 &&                                ( matchedCount + setMatchers.length ) > 1) {                                Sizzle.uniqueSort(results);                            }                        }                        // Override manipulation of globals by nested matchers                        if (outermost) {                            dirruns = dirrunsUnique;                            outermostContext = contextBackup;                        }                        return unmatched;                    };                return bySet ?                    markFunction(superMatcher) :                    superMatcher;            }            compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {                var i,                    setMatchers = [],                    elementMatchers = [],                    cached = compilerCache[selector + " "];                if (!cached) {                    // Generate a function of recursive functions that can be used to check each element                    if (!match) {                        match = tokenize(selector);                    }                    i = match.length;                    while (i--) {                        cached = matcherFromTokens(match[i]);                        if (cached[expando]) {                            setMatchers.push(cached);                        } else {                            elementMatchers.push(cached);                        }                    }                    // Cache the compiled function                    cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));                    // Save selector and tokenization                    cached.selector = selector;                }                return cached;            };            /**             * A low-level selection function that works with Sizzle's compiled             *  selector functions             * @param {String|Function} selector A selector or a pre-compiled             *  selector function built with Sizzle.compile             * @param {Element} context             * @param {Array} [results]             * @param {Array} [seed] A set of elements to match against             */            select = Sizzle.select = function (selector, context, results, seed) {                var i, tokens, token, type, find,                    compiled = typeof selector === "function" && selector,                    match = !seed && tokenize((selector = compiled.selector || selector));                results = results || [];                // Try to minimize operations if there is no seed and only one group                if (match.length === 1) {                    // Take a shortcut and set the context if the root selector is an ID                    tokens = match[0] = match[0].slice(0);                    if (tokens.length > 2 && (token = tokens[0]).type === "ID" &&                        support.getById && context.nodeType === 9 && documentIsHTML &&                        Expr.relative[tokens[1].type]) {                        context = ( Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [] )[0];                        if (!context) {                            return results;                            // Precompiled matchers will still verify ancestry, so step up a level                        } else if (compiled) {                            context = context.parentNode;                        }                        selector = selector.slice(tokens.shift().value.length);                    }                    // Fetch a seed set for right-to-left matching                    i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;                    while (i--) {                        token = tokens[i];                        // Abort if we hit a combinator                        if (Expr.relative[(type = token.type)]) {                            break;                        }                        if ((find = Expr.find[type])) {                            // Search, expanding context for leading sibling combinators                            if ((seed = find(                                    token.matches[0].replace(runescape, funescape),                                    rsibling.test(tokens[0].type) && testContext(context.parentNode) || context                                ))) {                                // If seed is empty or no tokens remain, we can return early                                tokens.splice(i, 1);                                selector = seed.length && toSelector(tokens);                                if (!selector) {                                    push.apply(results, seed);                                    return results;                                }                                break;                            }                        }                    }                }                // Compile and execute a filtering function if one is not provided                // Provide `match` to avoid retokenization if we modified the selector above                ( compiled || compile(selector, match) )(                    seed,                    context,                    !documentIsHTML,                    results,                    rsibling.test(selector) && testContext(context.parentNode) || context                );                return results;            };// One-time assignments// Sort stability            support.sortStable = expando.split("").sort(sortOrder).join("") === expando;// Support: Chrome 14-35+// Always assume duplicates if they aren't passed to the comparison function            support.detectDuplicates = !!hasDuplicate;// Initialize against the default document            setDocument();// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)// Detached nodes confoundingly follow *each other*            support.sortDetached = assert(function (div1) {                // Should return 1, but returns 4 (following)                return div1.compareDocumentPosition(document.createElement("div")) & 1;            });// Support: IE<8// Prevent attribute/property "interpolation"// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx            if (!assert(function (div) {                    div.innerHTML = "<a href='#'></a>";                    return div.firstChild.getAttribute("href") === "#";                })) {                addHandle("type|href|height|width", function (elem, name, isXML) {                    if (!isXML) {                        return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);                    }                });            }// Support: IE<9// Use defaultValue in place of getAttribute("value")            if (!support.attributes || !assert(function (div) {                    div.innerHTML = "<input/>";                    div.firstChild.setAttribute("value", "");                    return div.firstChild.getAttribute("value") === "";                })) {                addHandle("value", function (elem, name, isXML) {                    if (!isXML && elem.nodeName.toLowerCase() === "input") {                        return elem.defaultValue;                    }                });            }// Support: IE<9// Use getAttributeNode to fetch booleans when getAttribute lies            if (!assert(function (div) {                    return div.getAttribute("disabled") == null;                })) {                addHandle(booleans, function (elem, name, isXML) {                    var val;                    if (!isXML) {                        return elem[name] === true ? name.toLowerCase() :                            (val = elem.getAttributeNode(name)) && val.specified ?                                val.value :                                null;                    }                });            }            return Sizzle;        })(window);    jQuery.find = Sizzle;    jQuery.expr = Sizzle.selectors;    jQuery.expr[":"] = jQuery.expr.pseudos;    jQuery.unique = Sizzle.uniqueSort;    jQuery.text = Sizzle.getText;    jQuery.isXMLDoc = Sizzle.isXML;    jQuery.contains = Sizzle.contains;    var rneedsContext = jQuery.expr.match.needsContext;    var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);    var risSimple = /^.[^:#\[\.,]*$/;// Implement the identical functionality for filter and not    function winnow(elements, qualifier, not) {        if (jQuery.isFunction(qualifier)) {            return jQuery.grep(elements, function (elem, i) {                /* jshint -W018 */                return !!qualifier.call(elem, i, elem) !== not;            });        }        if (qualifier.nodeType) {            return jQuery.grep(elements, function (elem) {                return ( elem === qualifier ) !== not;            });        }        if (typeof qualifier === "string") {            if (risSimple.test(qualifier)) {                return jQuery.filter(qualifier, elements, not);            }            qualifier = jQuery.filter(qualifier, elements);        }        return jQuery.grep(elements, function (elem) {            return ( indexOf.call(qualifier, elem) >= 0 ) !== not;        });    }    jQuery.filter = function (expr, elems, not) {        var elem = elems[0];        if (not) {            expr = ":not(" + expr + ")";        }        return elems.length === 1 && elem.nodeType === 1 ?            jQuery.find.matchesSelector(elem, expr) ? [elem] : [] :            jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {                return elem.nodeType === 1;            }));    };    jQuery.fn.extend({        find: function (selector) {            var i,                len = this.length,                ret = [],                self = this;            if (typeof selector !== "string") {                return this.pushStack(jQuery(selector).filter(function () {                    for (i = 0; i < len; i++) {                        if (jQuery.contains(self[i], this)) {                            return true;                        }                    }                }));            }            for (i = 0; i < len; i++) {                jQuery.find(selector, self[i], ret);            }            // Needed because $( selector, context ) becomes $( context ).find( selector )            ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);            ret.selector = this.selector ? this.selector + " " + selector : selector;            return ret;        },        filter: function (selector) {            return this.pushStack(winnow(this, selector || [], false));        },        not: function (selector) {            return this.pushStack(winnow(this, selector || [], true));        },        is: function (selector) {            return !!winnow(                this,                // If this is a positional/relative selector, check membership in the returned set                // so $("p:first").is("p:last") won't return true for a doc with two "p".                typeof selector === "string" && rneedsContext.test(selector) ?                    jQuery(selector) :                selector || [],                false            ).length;        }    });// Initialize a jQuery object// A central reference to the root jQuery(document)    var rootjQuery,    // A simple way to check for HTML strings    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)    // Strict HTML recognition (#11290: must start with <)        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,        init = jQuery.fn.init = function (selector, context) {            var match, elem;            // HANDLE: $(""), $(null), $(undefined), $(false)            if (!selector) {                return this;            }            // Handle HTML strings            if (typeof selector === "string") {                if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {                    // Assume that strings that start and end with <> are HTML and skip the regex check                    match = [null, selector, null];                } else {                    match = rquickExpr.exec(selector);                }                // Match html or make sure no context is specified for #id                if (match && (match[1] || !context)) {                    // HANDLE: $(html) -> $(array)                    if (match[1]) {                        context = context instanceof jQuery ? context[0] : context;                        // Option to run scripts is true for back-compat                        // Intentionally let the error be thrown if parseHTML is not present                        jQuery.merge(this, jQuery.parseHTML(                            match[1],                            context && context.nodeType ? context.ownerDocument || context : document,                            true                        ));                        // HANDLE: $(html, props)                        if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {                            for (match in context) {                                // Properties of context are called as methods if possible                                if (jQuery.isFunction(this[match])) {                                    this[match](context[match]);                                    // ...and otherwise set as attributes                                } else {                                    this.attr(match, context[match]);                                }                            }                        }                        return this;                        // HANDLE: $(#id)                    } else {                        elem = document.getElementById(match[2]);                        // Support: Blackberry 4.6                        // gEBID returns nodes no longer in the document (#6963)                        if (elem && elem.parentNode) {                            // Inject the element directly into the jQuery object                            this.length = 1;                            this[0] = elem;                        }                        this.context = document;                        this.selector = selector;                        return this;                    }                    // HANDLE: $(expr, $(...))                } else if (!context || context.jquery) {                    return ( context || rootjQuery ).find(selector);                    // HANDLE: $(expr, context)                    // (which is just equivalent to: $(context).find(expr)                } else {                    return this.constructor(context).find(selector);                }                // HANDLE: $(DOMElement)            } else if (selector.nodeType) {                this.context = this[0] = selector;                this.length = 1;                return this;                // HANDLE: $(function)                // Shortcut for document ready            } else if (jQuery.isFunction(selector)) {                return typeof rootjQuery.ready !== "undefined" ?                    rootjQuery.ready(selector) :                    // Execute immediately if ready is not present                    selector(jQuery);            }            if (selector.selector !== undefined) {                this.selector = selector.selector;                this.context = selector.context;            }            return jQuery.makeArray(selector, this);        };// Give the init function the jQuery prototype for later instantiation    init.prototype = jQuery.fn;// Initialize central reference    rootjQuery = jQuery(document);    var rparentsprev = /^(?:parents|prev(?:Until|All))/,    // Methods guaranteed to produce a unique set when starting from a unique set        guaranteedUnique = {            children: true,            contents: true,            next: true,            prev: true        };    jQuery.extend({        dir: function (elem, dir, until) {            var matched = [],                truncate = until !== undefined;            while ((elem = elem[dir]) && elem.nodeType !== 9) {                if (elem.nodeType === 1) {                    if (truncate && jQuery(elem).is(until)) {                        break;                    }                    matched.push(elem);                }            }            return matched;        },        sibling: function (n, elem) {            var matched = [];            for (; n; n = n.nextSibling) {                if (n.nodeType === 1 && n !== elem) {                    matched.push(n);                }            }            return matched;        }    });    jQuery.fn.extend({        has: function (target) {            var targets = jQuery(target, this),                l = targets.length;            return this.filter(function () {                var i = 0;                for (; i < l; i++) {                    if (jQuery.contains(this, targets[i])) {                        return true;                    }                }            });        },        closest: function (selectors, context) {            var cur,                i = 0,                l = this.length,                matched = [],                pos = rneedsContext.test(selectors) || typeof selectors !== "string" ?                    jQuery(selectors, context || this.context) :                    0;            for (; i < l; i++) {                for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {                    // Always skip document fragments                    if (cur.nodeType < 11 && (pos ?                        pos.index(cur) > -1 :                            // Don't pass non-elements to Sizzle                        cur.nodeType === 1 &&                        jQuery.find.matchesSelector(cur, selectors))) {                        matched.push(cur);                        break;                    }                }            }            return this.pushStack(matched.length > 1 ? jQuery.unique(matched) : matched);        },        // Determine the position of an element within the set        index: function (elem) {            // No argument, return index in parent            if (!elem) {                return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;            }            // Index in selector            if (typeof elem === "string") {                return indexOf.call(jQuery(elem), this[0]);            }            // Locate the position of the desired element            return indexOf.call(this,                // If it receives a jQuery object, the first element is used                elem.jquery ? elem[0] : elem            );        },        add: function (selector, context) {            return this.pushStack(                jQuery.unique(                    jQuery.merge(this.get(), jQuery(selector, context))                )            );        },        addBack: function (selector) {            return this.add(selector == null ?                this.prevObject : this.prevObject.filter(selector)            );        }    });    function sibling(cur, dir) {        while ((cur = cur[dir]) && cur.nodeType !== 1) {        }        return cur;    }    jQuery.each({        parent: function (elem) {            var parent = elem.parentNode;            return parent && parent.nodeType !== 11 ? parent : null;        },        parents: function (elem) {            return jQuery.dir(elem, "parentNode");        },        parentsUntil: function (elem, i, until) {            return jQuery.dir(elem, "parentNode", until);        },        next: function (elem) {            return sibling(elem, "nextSibling");        },        prev: function (elem) {            return sibling(elem, "previousSibling");        },        nextAll: function (elem) {            return jQuery.dir(elem, "nextSibling");        },        prevAll: function (elem) {            return jQuery.dir(elem, "previousSibling");        },        nextUntil: function (elem, i, until) {            return jQuery.dir(elem, "nextSibling", until);        },        prevUntil: function (elem, i, until) {            return jQuery.dir(elem, "previousSibling", until);        },        siblings: function (elem) {            return jQuery.sibling(( elem.parentNode || {} ).firstChild, elem);        },        children: function (elem) {            return jQuery.sibling(elem.firstChild);        },        contents: function (elem) {            return elem.contentDocument || jQuery.merge([], elem.childNodes);        }    }, function (name, fn) {        jQuery.fn[name] = function (until, selector) {            var matched = jQuery.map(this, fn, until);            if (name.slice(-5) !== "Until") {                selector = until;            }            if (selector && typeof selector === "string") {                matched = jQuery.filter(selector, matched);            }            if (this.length > 1) {                // Remove duplicates                if (!guaranteedUnique[name]) {                    jQuery.unique(matched);                }                // Reverse order for parents* and prev-derivatives                if (rparentsprev.test(name)) {                    matched.reverse();                }            }            return this.pushStack(matched);        };    });    var rnotwhite = (/\S+/g);// String to Object options format cache    var optionsCache = {};// Convert String-formatted options into Object-formatted ones and store in cache    function createOptions(options) {        var object = optionsCache[options] = {};        jQuery.each(options.match(rnotwhite) || [], function (_, flag) {            object[flag] = true;        });        return object;    }    /*     * Create a callback list using the following parameters:     *     *	options: an optional list of space-separated options that will change how     *			the callback list behaves or a more traditional option object     *     * By default a callback list will act like an event callback list and can be     * "fired" multiple times.     *     * Possible options:     *     *	once:			will ensure the callback list can only be fired once (like a Deferred)     *     *	memory:			will keep track of previous values and will call any callback added     *					after the list has been fired right away with the latest "memorized"     *					values (like a Deferred)     *     *	unique:			will ensure a callback can only be added once (no duplicate in the list)     *     *	stopOnFalse:	interrupt callings when a callback returns false     *     */    jQuery.Callbacks = function (options) {        // Convert options from String-formatted to Object-formatted if needed        // (we check in cache first)        options = typeof options === "string" ?            ( optionsCache[options] || createOptions(options) ) :            jQuery.extend({}, options);        var // Last fire value (for non-forgettable lists)            memory,        // Flag to know if list was already fired            fired,        // Flag to know if list is currently firing            firing,        // First callback to fire (used internally by add and fireWith)            firingStart,        // End of the loop when firing            firingLength,        // Index of currently firing callback (modified by remove if needed)            firingIndex,        // Actual callback list            list = [],        // Stack of fire calls for repeatable lists            stack = !options.once && [],        // Fire callbacks            fire = function (data) {                memory = options.memory && data;                fired = true;                firingIndex = firingStart || 0;                firingStart = 0;                firingLength = list.length;                firing = true;                for (; list && firingIndex < firingLength; firingIndex++) {                    if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {                        memory = false; // To prevent further calls using add                        break;                    }                }                firing = false;                if (list) {                    if (stack) {                        if (stack.length) {                            fire(stack.shift());                        }                    } else if (memory) {                        list = [];                    } else {                        self.disable();                    }                }            },        // Actual Callbacks object            self = {                // Add a callback or a collection of callbacks to the list                add: function () {                    if (list) {                        // First, we save the current length                        var start = list.length;                        (function add(args) {                            jQuery.each(args, function (_, arg) {                                var type = jQuery.type(arg);                                if (type === "function") {                                    if (!options.unique || !self.has(arg)) {                                        list.push(arg);                                    }                                } else if (arg && arg.length && type !== "string") {                                    // Inspect recursively                                    add(arg);                                }                            });                        })(arguments);                        // Do we need to add the callbacks to the                        // current firing batch?                        if (firing) {                            firingLength = list.length;                            // With memory, if we're not firing then                            // we should call right away                        } else if (memory) {                            firingStart = start;                            fire(memory);                        }                    }                    return this;                },                // Remove a callback from the list                remove: function () {                    if (list) {                        jQuery.each(arguments, function (_, arg) {                            var index;                            while (( index = jQuery.inArray(arg, list, index) ) > -1) {                                list.splice(index, 1);                                // Handle firing indexes                                if (firing) {                                    if (index <= firingLength) {                                        firingLength--;                                    }                                    if (index <= firingIndex) {                                        firingIndex--;                                    }                                }                            }                        });                    }                    return this;                },                // Check if a given callback is in the list.                // If no argument is given, return whether or not list has callbacks attached.                has: function (fn) {                    return fn ? jQuery.inArray(fn, list) > -1 : !!( list && list.length );                },                // Remove all callbacks from the list                empty: function () {                    list = [];                    firingLength = 0;                    return this;                },                // Have the list do nothing anymore                disable: function () {                    list = stack = memory = undefined;                    return this;                },                // Is it disabled?                disabled: function () {                    return !list;                },                // Lock the list in its current state                lock: function () {                    stack = undefined;                    if (!memory) {                        self.disable();                    }                    return this;                },                // Is it locked?                locked: function () {                    return !stack;                },                // Call all callbacks with the given context and arguments                fireWith: function (context, args) {                    if (list && ( !fired || stack )) {                        args = args || [];                        args = [context, args.slice ? args.slice() : args];                        if (firing) {                            stack.push(args);                        } else {                            fire(args);                        }                    }                    return this;                },                // Call all the callbacks with the given arguments                fire: function () {                    self.fireWith(this, arguments);                    return this;                },                // To know if the callbacks have already been called at least once                fired: function () {                    return !!fired;                }            };        return self;    };    jQuery.extend({        Deferred: function (func) {            var tuples = [                    // action, add listener, listener list, final state                    ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],                    ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],                    ["notify", "progress", jQuery.Callbacks("memory")]                ],                state = "pending",                promise = {                    state: function () {                        return state;                    },                    always: function () {                        deferred.done(arguments).fail(arguments);                        return this;                    },                    then: function (/* fnDone, fnFail, fnProgress */) {                        var fns = arguments;                        return jQuery.Deferred(function (newDefer) {                            jQuery.each(tuples, function (i, tuple) {                                var fn = jQuery.isFunction(fns[i]) && fns[i];                                // deferred[ done | fail | progress ] for forwarding actions to newDefer                                deferred[tuple[1]](function () {                                    var returned = fn && fn.apply(this, arguments);                                    if (returned && jQuery.isFunction(returned.promise)) {                                        returned.promise()                                            .done(newDefer.resolve)                                            .fail(newDefer.reject)                                            .progress(newDefer.notify);                                    } else {                                        newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);                                    }                                });                            });                            fns = null;                        }).promise();                    },                    // Get a promise for this deferred                    // If obj is provided, the promise aspect is added to the object                    promise: function (obj) {                        return obj != null ? jQuery.extend(obj, promise) : promise;                    }                },                deferred = {};            // Keep pipe for back-compat            promise.pipe = promise.then;            // Add list-specific methods            jQuery.each(tuples, function (i, tuple) {                var list = tuple[2],                    stateString = tuple[3];                // promise[ done | fail | progress ] = list.add                promise[tuple[1]] = list.add;                // Handle state                if (stateString) {                    list.add(function () {                        // state = [ resolved | rejected ]                        state = stateString;                        // [ reject_list | resolve_list ].disable; progress_list.lock                    }, tuples[i ^ 1][2].disable, tuples[2][2].lock);                }                // deferred[ resolve | reject | notify ]                deferred[tuple[0]] = function () {                    deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);                    return this;                };                deferred[tuple[0] + "With"] = list.fireWith;            });            // Make the deferred a promise            promise.promise(deferred);            // Call given func if any            if (func) {                func.call(deferred, deferred);            }            // All done!            return deferred;        },        // Deferred helper        when: function (subordinate /* , ..., subordinateN */) {            var i = 0,                resolveValues = slice.call(arguments),                length = resolveValues.length,            // the count of uncompleted subordinates                remaining = length !== 1 || ( subordinate && jQuery.isFunction(subordinate.promise) ) ? length : 0,            // the master Deferred. If resolveValues consist of only a single Deferred, just use that.                deferred = remaining === 1 ? subordinate : jQuery.Deferred(),            // Update function for both resolve and progress values                updateFunc = function (i, contexts, values) {                    return function (value) {                        contexts[i] = this;                        values[i] = arguments.length > 1 ? slice.call(arguments) : value;                        if (values === progressValues) {                            deferred.notifyWith(contexts, values);                        } else if (!( --remaining )) {                            deferred.resolveWith(contexts, values);                        }                    };                },                progressValues, progressContexts, resolveContexts;            // Add listeners to Deferred subordinates; treat others as resolved            if (length > 1) {                progressValues = new Array(length);                progressContexts = new Array(length);                resolveContexts = new Array(length);                for (; i < length; i++) {                    if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {                        resolveValues[i].promise()                            .done(updateFunc(i, resolveContexts, resolveValues))                            .fail(deferred.reject)                            .progress(updateFunc(i, progressContexts, progressValues));                    } else {                        --remaining;                    }                }            }            // If we're not waiting on anything, resolve the master            if (!remaining) {                deferred.resolveWith(resolveContexts, resolveValues);            }            return deferred.promise();        }    });// The deferred used on DOM ready    var readyList;    jQuery.fn.ready = function (fn) {        // Add the callback        jQuery.ready.promise().done(fn);        return this;    };    jQuery.extend({        // Is the DOM ready to be used? Set to true once it occurs.        isReady: false,        // A counter to track how many items to wait for before        // the ready event fires. See #6781        readyWait: 1,        // Hold (or release) the ready event        holdReady: function (hold) {            if (hold) {                jQuery.readyWait++;            } else {                jQuery.ready(true);            }        },        // Handle when the DOM is ready        ready: function (wait) {            // Abort if there are pending holds or we're already ready            if (wait === true ? --jQuery.readyWait : jQuery.isReady) {                return;            }            // Remember that the DOM is ready            jQuery.isReady = true;            // If a normal DOM Ready event fired, decrement, and wait if need be            if (wait !== true && --jQuery.readyWait > 0) {                return;            }            // If there are functions bound, to execute            readyList.resolveWith(document, [jQuery]);            // Trigger any bound ready events            if (jQuery.fn.triggerHandler) {                jQuery(document).triggerHandler("ready");                jQuery(document).off("ready");            }        }    });    /**     * The ready event handler and self cleanup method     */    function completed() {        document.removeEventListener("DOMContentLoaded", completed, false);        window.removeEventListener("load", completed, false);        jQuery.ready();    }    jQuery.ready.promise = function (obj) {        if (!readyList) {            readyList = jQuery.Deferred();            // Catch cases where $(document).ready() is called after the browser event has already occurred.            // We once tried to use readyState "interactive" here, but it caused issues like the one            // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15            if (document.readyState === "complete") {                // Handle it asynchronously to allow scripts the opportunity to delay ready                setTimeout(jQuery.ready);            } else {                // Use the handy event callback                document.addEventListener("DOMContentLoaded", completed, false);                // A fallback to window.onload, that will always work                window.addEventListener("load", completed, false);            }        }        return readyList.promise(obj);    };// Kick off the DOM ready check even if the user does not    jQuery.ready.promise();// Multifunctional method to get and set values of a collection// The value/s can optionally be executed if it's a function    var access = jQuery.access = function (elems, fn, key, value, chainable, emptyGet, raw) {        var i = 0,            len = elems.length,            bulk = key == null;        // Sets many values        if (jQuery.type(key) === "object") {            chainable = true;            for (i in key) {                jQuery.access(elems, fn, i, key[i], true, emptyGet, raw);            }            // Sets one value        } else if (value !== undefined) {            chainable = true;            if (!jQuery.isFunction(value)) {                raw = true;            }            if (bulk) {                // Bulk operations run against the entire set                if (raw) {                    fn.call(elems, value);                    fn = null;                    // ...except when executing function values                } else {                    bulk = fn;                    fn = function (elem, key, value) {                        return bulk.call(jQuery(elem), value);                    };                }            }            if (fn) {                for (; i < len; i++) {                    fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));                }            }        }        return chainable ?            elems :            // Gets            bulk ?                fn.call(elems) :                len ? fn(elems[0], key) : emptyGet;    };    /**     * Determines whether an object can have data     */    jQuery.acceptData = function (owner) {        // Accepts only:        //  - Node        //    - Node.ELEMENT_NODE        //    - Node.DOCUMENT_NODE        //  - Object        //    - Any        /* jshint -W018 */        return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );    };    function Data() {        // Support: Android<4,        // Old WebKit does not have Object.preventExtensions/freeze method,        // return new empty object instead with no [[set]] accessor        Object.defineProperty(this.cache = {}, 0, {            get: function () {                return {};            }        });        this.expando = jQuery.expando + Data.uid++;    }    Data.uid = 1;    Data.accepts = jQuery.acceptData;    Data.prototype = {        key: function (owner) {            // We can accept data for non-element nodes in modern browsers,            // but we should not, see #8335.            // Always return the key for a frozen object.            if (!Data.accepts(owner)) {                return 0;            }            var descriptor = {},            // Check if the owner object already has a cache key                unlock = owner[this.expando];            // If not, create one            if (!unlock) {                unlock = Data.uid++;                // Secure it in a non-enumerable, non-writable property                try {                    descriptor[this.expando] = {value: unlock};                    Object.defineProperties(owner, descriptor);                    // Support: Android<4                    // Fallback to a less secure definition                } catch (e) {                    descriptor[this.expando] = unlock;                    jQuery.extend(owner, descriptor);                }            }            // Ensure the cache object            if (!this.cache[unlock]) {                this.cache[unlock] = {};            }            return unlock;        },        set: function (owner, data, value) {            var prop,            // There may be an unlock assigned to this node,            // if there is no entry for this "owner", create one inline            // and set the unlock as though an owner entry had always existed                unlock = this.key(owner),                cache = this.cache[unlock];            // Handle: [ owner, key, value ] args            if (typeof data === "string") {                cache[data] = value;                // Handle: [ owner, { properties } ] args            } else {                // Fresh assignments by object are shallow copied                if (jQuery.isEmptyObject(cache)) {                    jQuery.extend(this.cache[unlock], data);                    // Otherwise, copy the properties one-by-one to the cache object                } else {                    for (prop in data) {                        cache[prop] = data[prop];                    }                }            }            return cache;        },        get: function (owner, key) {            // Either a valid cache is found, or will be created.            // New caches will be created and the unlock returned,            // allowing direct access to the newly created            // empty data object. A valid owner object must be provided.            var cache = this.cache[this.key(owner)];            return key === undefined ?                cache : cache[key];        },        access: function (owner, key, value) {            var stored;            // In cases where either:            //            //   1. No key was specified            //   2. A string key was specified, but no value provided            //            // Take the "read" path and allow the get method to determine            // which value to return, respectively either:            //            //   1. The entire cache object            //   2. The data stored at the key            //            if (key === undefined ||                ((key && typeof key === "string") && value === undefined)) {                stored = this.get(owner, key);                return stored !== undefined ?                    stored : this.get(owner, jQuery.camelCase(key));            }            // [*]When the key is not a string, or both a key and value            // are specified, set or extend (existing objects) with either:            //            //   1. An object of properties            //   2. A key and value            //            this.set(owner, key, value);            // Since the "set" path can have two possible entry points            // return the expected data based on which path was taken[*]            return value !== undefined ? value : key;        },        remove: function (owner, key) {            var i, name, camel,                unlock = this.key(owner),                cache = this.cache[unlock];            if (key === undefined) {                this.cache[unlock] = {};            } else {                // Support array or space separated string of keys                if (jQuery.isArray(key)) {                    // If "name" is an array of keys...                    // When data is initially created, via ("key", "val") signature,                    // keys will be converted to camelCase.                    // Since there is no way to tell _how_ a key was added, remove                    // both plain key and camelCase key. #12786                    // This will only penalize the array argument path.                    name = key.concat(key.map(jQuery.camelCase));                } else {                    camel = jQuery.camelCase(key);                    // Try the string as a key before any manipulation                    if (key in cache) {                        name = [key, camel];                    } else {                        // If a key with the spaces exists, use it.                        // Otherwise, create an array by matching non-whitespace                        name = camel;                        name = name in cache ?                            [name] : ( name.match(rnotwhite) || [] );                    }                }                i = name.length;                while (i--) {                    delete cache[name[i]];                }            }        },        hasData: function (owner) {            return !jQuery.isEmptyObject(                this.cache[owner[this.expando]] || {}            );        },        discard: function (owner) {            if (owner[this.expando]) {                delete this.cache[owner[this.expando]];            }        }    };    var data_priv = new Data();    var data_user = new Data();//	Implementation Summary////	1. Enforce API surface and semantic compatibility with 1.9.x branch//	2. Improve the module's maintainability by reducing the storage//		paths to a single mechanism.//	3. Use the same single mechanism to support "private" and "user" data.//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)//	5. Avoid exposing implementation details on user objects (eg. expando properties)//	6. Provide a clear path for implementation upgrade to WeakMap in 2014    var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,        rmultiDash = /([A-Z])/g;    function dataAttr(elem, key, data) {        var name;        // If nothing was found internally, try to fetch any        // data from the HTML5 data-* attribute        if (data === undefined && elem.nodeType === 1) {            name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();            data = elem.getAttribute(name);            if (typeof data === "string") {                try {                    data = data === "true" ? true :                        data === "false" ? false :                            data === "null" ? null :                                // Only convert to a number if it doesn't change the string                                +data + "" === data ? +data :                                    rbrace.test(data) ? jQuery.parseJSON(data) :                                        data;                } catch (e) {                }                // Make sure we set the data so it isn't changed later                data_user.set(elem, key, data);            } else {                data = undefined;            }        }        return data;    }    jQuery.extend({        hasData: function (elem) {            return data_user.hasData(elem) || data_priv.hasData(elem);        },        data: function (elem, name, data) {            return data_user.access(elem, name, data);        },        removeData: function (elem, name) {            data_user.remove(elem, name);        },        // TODO: Now that all calls to _data and _removeData have been replaced        // with direct calls to data_priv methods, these can be deprecated.        _data: function (elem, name, data) {            return data_priv.access(elem, name, data);        },        _removeData: function (elem, name) {            data_priv.remove(elem, name);        }    });    jQuery.fn.extend({        data: function (key, value) {            var i, name, data,                elem = this[0],                attrs = elem && elem.attributes;            // Gets all values            if (key === undefined) {                if (this.length) {                    data = data_user.get(elem);                    if (elem.nodeType === 1 && !data_priv.get(elem, "hasDataAttrs")) {                        i = attrs.length;                        while (i--) {                            // Support: IE11+                            // The attrs elements can be null (#14894)                            if (attrs[i]) {                                name = attrs[i].name;                                if (name.indexOf("data-") === 0) {                                    name = jQuery.camelCase(name.slice(5));                                    dataAttr(elem, name, data[name]);                                }                            }                        }                        data_priv.set(elem, "hasDataAttrs", true);                    }                }                return data;            }            // Sets multiple values            if (typeof key === "object") {                return this.each(function () {                    data_user.set(this, key);                });            }            return access(this, function (value) {                var data,                    camelKey = jQuery.camelCase(key);                // The calling jQuery object (element matches) is not empty                // (and therefore has an element appears at this[ 0 ]) and the                // `value` parameter was not undefined. An empty jQuery object                // will result in `undefined` for elem = this[ 0 ] which will                // throw an exception if an attempt to read a data cache is made.                if (elem && value === undefined) {                    // Attempt to get data from the cache                    // with the key as-is                    data = data_user.get(elem, key);                    if (data !== undefined) {                        return data;                    }                    // Attempt to get data from the cache                    // with the key camelized                    data = data_user.get(elem, camelKey);                    if (data !== undefined) {                        return data;                    }                    // Attempt to "discover" the data in                    // HTML5 custom data-* attrs                    data = dataAttr(elem, camelKey, undefined);                    if (data !== undefined) {                        return data;                    }                    // We tried really hard, but the data doesn't exist.                    return;                }                // Set the data...                this.each(function () {                    // First, attempt to store a copy or reference of any                    // data that might've been store with a camelCased key.                    var data = data_user.get(this, camelKey);                    // For HTML5 data-* attribute interop, we have to                    // store property names with dashes in a camelCase form.                    // This might not apply to all properties...*                    data_user.set(this, camelKey, value);                    // *... In the case of properties that might _actually_                    // have dashes, we need to also store a copy of that                    // unchanged property.                    if (key.indexOf("-") !== -1 && data !== undefined) {                        data_user.set(this, key, value);                    }                });            }, null, value, arguments.length > 1, null, true);        },        removeData: function (key) {            return this.each(function () {                data_user.remove(this, key);            });        }    });    jQuery.extend({        queue: function (elem, type, data) {            var queue;            if (elem) {                type = ( type || "fx" ) + "queue";                queue = data_priv.get(elem, type);                // Speed up dequeue by getting out quickly if this is just a lookup                if (data) {                    if (!queue || jQuery.isArray(data)) {                        queue = data_priv.access(elem, type, jQuery.makeArray(data));                    } else {                        queue.push(data);                    }                }                return queue || [];            }        },        dequeue: function (elem, type) {            type = type || "fx";            var queue = jQuery.queue(elem, type),                startLength = queue.length,                fn = queue.shift(),                hooks = jQuery._queueHooks(elem, type),                next = function () {                    jQuery.dequeue(elem, type);                };            // If the fx queue is dequeued, always remove the progress sentinel            if (fn === "inprogress") {                fn = queue.shift();                startLength--;            }            if (fn) {                // Add a progress sentinel to prevent the fx queue from being                // automatically dequeued                if (type === "fx") {                    queue.unshift("inprogress");                }                // Clear up the last queue stop function                delete hooks.stop;                fn.call(elem, next, hooks);            }            if (!startLength && hooks) {                hooks.empty.fire();            }        },        // Not public - generate a queueHooks object, or return the current one        _queueHooks: function (elem, type) {            var key = type + "queueHooks";            return data_priv.get(elem, key) || data_priv.access(elem, key, {                    empty: jQuery.Callbacks("once memory").add(function () {                        data_priv.remove(elem, [type + "queue", key]);                    })                });        }    });    jQuery.fn.extend({        queue: function (type, data) {            var setter = 2;            if (typeof type !== "string") {                data = type;                type = "fx";                setter--;            }            if (arguments.length < setter) {                return jQuery.queue(this[0], type);            }            return data === undefined ?                this :                this.each(function () {                    var queue = jQuery.queue(this, type, data);                    // Ensure a hooks for this queue                    jQuery._queueHooks(this, type);                    if (type === "fx" && queue[0] !== "inprogress") {                        jQuery.dequeue(this, type);                    }                });        },        dequeue: function (type) {            return this.each(function () {                jQuery.dequeue(this, type);            });        },        clearQueue: function (type) {            return this.queue(type || "fx", []);        },        // Get a promise resolved when queues of a certain type        // are emptied (fx is the type by default)        promise: function (type, obj) {            var tmp,                count = 1,                defer = jQuery.Deferred(),                elements = this,                i = this.length,                resolve = function () {                    if (!( --count )) {                        defer.resolveWith(elements, [elements]);                    }                };            if (typeof type !== "string") {                obj = type;                type = undefined;            }            type = type || "fx";            while (i--) {                tmp = data_priv.get(elements[i], type + "queueHooks");                if (tmp && tmp.empty) {                    count++;                    tmp.empty.add(resolve);                }            }            resolve();            return defer.promise(obj);        }    });    var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;    var cssExpand = ["Top", "Right", "Bottom", "Left"];    var isHidden = function (elem, el) {        // isHidden might be called from jQuery#filter function;        // in that case, element will be second argument        elem = el || elem;        return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);    };    var rcheckableType = (/^(?:checkbox|radio)$/i);    (function () {        var fragment = document.createDocumentFragment(),            div = fragment.appendChild(document.createElement("div")),            input = document.createElement("input");        // Support: Safari<=5.1        // Check state lost if the name is set (#11217)        // Support: Windows Web Apps (WWA)        // `name` and `type` must use .setAttribute for WWA (#14901)        input.setAttribute("type", "radio");        input.setAttribute("checked", "checked");        input.setAttribute("name", "t");        div.appendChild(input);        // Support: Safari<=5.1, Android<4.2        // Older WebKit doesn't clone checked state correctly in fragments        support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;        // Support: IE<=11+        // Make sure textarea (and checkbox) defaultValue is properly cloned        div.innerHTML = "<textarea>x</textarea>";        support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;    })();    var strundefined = typeof undefined;    support.focusinBubbles = "onfocusin" in window;    var        rkeyEvent = /^key/,        rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,        rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,        rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;    function returnTrue() {        return true;    }    function returnFalse() {        return false;    }    function safeActiveElement() {        try {            return document.activeElement;        } catch (err) {        }    }    /*     * Helper functions for managing events -- not part of the public interface.     * Props to Dean Edwards' addEvent library for many of the ideas.     */    jQuery.event = {        global: {},        add: function (elem, types, handler, data, selector) {            var handleObjIn, eventHandle, tmp,                events, t, handleObj,                special, handlers, type, namespaces, origType,                elemData = data_priv.get(elem);            // Don't attach events to noData or text/comment nodes (but allow plain objects)            if (!elemData) {                return;            }            // Caller can pass in an object of custom data in lieu of the handler            if (handler.handler) {                handleObjIn = handler;                handler = handleObjIn.handler;                selector = handleObjIn.selector;            }            // Make sure that the handler has a unique ID, used to find/remove it later            if (!handler.guid) {                handler.guid = jQuery.guid++;            }            // Init the element's event structure and main handler, if this is the first            if (!(events = elemData.events)) {                events = elemData.events = {};            }            if (!(eventHandle = elemData.handle)) {                eventHandle = elemData.handle = function (e) {                    // Discard the second event of a jQuery.event.trigger() and                    // when an event is called after a page has unloaded                    return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?                        jQuery.event.dispatch.apply(elem, arguments) : undefined;                };            }            // Handle multiple events separated by a space            types = ( types || "" ).match(rnotwhite) || [""];            t = types.length;            while (t--) {                tmp = rtypenamespace.exec(types[t]) || [];                type = origType = tmp[1];                namespaces = ( tmp[2] || "" ).split(".").sort();                // There *must* be a type, no attaching namespace-only handlers                if (!type) {                    continue;                }                // If event changes its type, use the special event handlers for the changed type                special = jQuery.event.special[type] || {};                // If selector defined, determine special event api type, otherwise given type                type = ( selector ? special.delegateType : special.bindType ) || type;                // Update special based on newly reset type                special = jQuery.event.special[type] || {};                // handleObj is passed to all event handlers                handleObj = jQuery.extend({                    type: type,                    origType: origType,                    data: data,                    handler: handler,                    guid: handler.guid,                    selector: selector,                    needsContext: selector && jQuery.expr.match.needsContext.test(selector),                    namespace: namespaces.join(".")                }, handleObjIn);                // Init the event handler queue if we're the first                if (!(handlers = events[type])) {                    handlers = events[type] = [];                    handlers.delegateCount = 0;                    // Only use addEventListener if the special events handler returns false                    if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {                        if (elem.addEventListener) {                            elem.addEventListener(type, eventHandle, false);                        }                    }                }                if (special.add) {                    special.add.call(elem, handleObj);                    if (!handleObj.handler.guid) {                        handleObj.handler.guid = handler.guid;                    }                }                // Add to the element's handler list, delegates in front                if (selector) {                    handlers.splice(handlers.delegateCount++, 0, handleObj);                } else {                    handlers.push(handleObj);                }                // Keep track of which events have ever been used, for event optimization                jQuery.event.global[type] = true;            }        },        // Detach an event or set of events from an element        remove: function (elem, types, handler, selector, mappedTypes) {            var j, origCount, tmp,                events, t, handleObj,                special, handlers, type, namespaces, origType,                elemData = data_priv.hasData(elem) && data_priv.get(elem);            if (!elemData || !(events = elemData.events)) {                return;            }            // Once for each type.namespace in types; type may be omitted            types = ( types || "" ).match(rnotwhite) || [""];            t = types.length;            while (t--) {                tmp = rtypenamespace.exec(types[t]) || [];                type = origType = tmp[1];                namespaces = ( tmp[2] || "" ).split(".").sort();                // Unbind all events (on this namespace, if provided) for the element                if (!type) {                    for (type in events) {                        jQuery.event.remove(elem, type + types[t], handler, selector, true);                    }                    continue;                }                special = jQuery.event.special[type] || {};                type = ( selector ? special.delegateType : special.bindType ) || type;                handlers = events[type] || [];                tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");                // Remove matching events                origCount = j = handlers.length;                while (j--) {                    handleObj = handlers[j];                    if (( mappedTypes || origType === handleObj.origType ) &&                        ( !handler || handler.guid === handleObj.guid ) &&                        ( !tmp || tmp.test(handleObj.namespace) ) &&                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector )) {                        handlers.splice(j, 1);                        if (handleObj.selector) {                            handlers.delegateCount--;                        }                        if (special.remove) {                            special.remove.call(elem, handleObj);                        }                    }                }                // Remove generic event handler if we removed something and no more handlers exist                // (avoids potential for endless recursion during removal of special event handlers)                if (origCount && !handlers.length) {                    if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {                        jQuery.removeEvent(elem, type, elemData.handle);                    }                    delete events[type];                }            }            // Remove the expando if it's no longer used            if (jQuery.isEmptyObject(events)) {                delete elemData.handle;                data_priv.remove(elem, "events");            }        },        trigger: function (event, data, elem, onlyHandlers) {            var i, cur, tmp, bubbleType, ontype, handle, special,                eventPath = [elem || document],                type = hasOwn.call(event, "type") ? event.type : event,                namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];            cur = tmp = elem = elem || document;            // Don't do events on text and comment nodes            if (elem.nodeType === 3 || elem.nodeType === 8) {                return;            }            // focus/blur morphs to focusin/out; ensure we're not firing them right now            if (rfocusMorph.test(type + jQuery.event.triggered)) {                return;            }            if (type.indexOf(".") >= 0) {                // Namespaced trigger; create a regexp to match event type in handle()                namespaces = type.split(".");                type = namespaces.shift();                namespaces.sort();            }            ontype = type.indexOf(":") < 0 && "on" + type;            // Caller can pass in a jQuery.Event object, Object, or just an event type string            event = event[jQuery.expando] ?                event :                new jQuery.Event(type, typeof event === "object" && event);            // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)            event.isTrigger = onlyHandlers ? 2 : 3;            event.namespace = namespaces.join(".");            event.namespace_re = event.namespace ?                new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") :                null;            // Clean up the event in case it is being reused            event.result = undefined;            if (!event.target) {                event.target = elem;            }            // Clone any incoming data and prepend the event, creating the handler arg list            data = data == null ?                [event] :                jQuery.makeArray(data, [event]);            // Allow special events to draw outside the lines            special = jQuery.event.special[type] || {};            if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {                return;            }            // Determine event propagation path in advance, per W3C events spec (#9951)            // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)            if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {                bubbleType = special.delegateType || type;                if (!rfocusMorph.test(bubbleType + type)) {                    cur = cur.parentNode;                }                for (; cur; cur = cur.parentNode) {                    eventPath.push(cur);                    tmp = cur;                }                // Only add window if we got to document (e.g., not plain obj or detached DOM)                if (tmp === (elem.ownerDocument || document)) {                    eventPath.push(tmp.defaultView || tmp.parentWindow || window);                }            }            // Fire handlers on the event path            i = 0;            while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {                event.type = i > 1 ?                    bubbleType :                special.bindType || type;                // jQuery handler                handle = ( data_priv.get(cur, "events") || {} )[event.type] && data_priv.get(cur, "handle");                if (handle) {                    handle.apply(cur, data);                }                // Native handler                handle = ontype && cur[ontype];                if (handle && handle.apply && jQuery.acceptData(cur)) {                    event.result = handle.apply(cur, data);                    if (event.result === false) {                        event.preventDefault();                    }                }            }            event.type = type;            // If nobody prevented the default action, do it now            if (!onlyHandlers && !event.isDefaultPrevented()) {                if ((!special._default || special._default.apply(eventPath.pop(), data) === false) &&                    jQuery.acceptData(elem)) {                    // Call a native DOM method on the target with the same name name as the event.                    // Don't do default actions on window, that's where global variables be (#6170)                    if (ontype && jQuery.isFunction(elem[type]) && !jQuery.isWindow(elem)) {                        // Don't re-trigger an onFOO event when we call its FOO() method                        tmp = elem[ontype];                        if (tmp) {                            elem[ontype] = null;                        }                        // Prevent re-triggering of the same event, since we already bubbled it above                        jQuery.event.triggered = type;                        elem[type]();                        jQuery.event.triggered = undefined;                        if (tmp) {                            elem[ontype] = tmp;                        }                    }                }            }            return event.result;        },        dispatch: function (event) {            // Make a writable jQuery.Event from the native event object            event = jQuery.event.fix(event);            var i, j, ret, matched, handleObj,                handlerQueue = [],                args = slice.call(arguments),                handlers = ( data_priv.get(this, "events") || {} )[event.type] || [],                special = jQuery.event.special[event.type] || {};            // Use the fix-ed jQuery.Event rather than the (read-only) native event            args[0] = event;            event.delegateTarget = this;            // Call the preDispatch hook for the mapped type, and let it bail if desired            if (special.preDispatch && special.preDispatch.call(this, event) === false) {                return;            }            // Determine handlers            handlerQueue = jQuery.event.handlers.call(this, event, handlers);            // Run delegates first; they may want to stop propagation beneath us            i = 0;            while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {                event.currentTarget = matched.elem;                j = 0;                while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {                    // Triggered event must either 1) have no namespace, or 2) have namespace(s)                    // a subset or equal to those in the bound event (both can have no namespace).                    if (!event.namespace_re || event.namespace_re.test(handleObj.namespace)) {                        event.handleObj = handleObj;                        event.data = handleObj.data;                        ret = ( (jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler )                            .apply(matched.elem, args);                        if (ret !== undefined) {                            if ((event.result = ret) === false) {                                event.preventDefault();                                event.stopPropagation();                            }                        }                    }                }            }            // Call the postDispatch hook for the mapped type            if (special.postDispatch) {                special.postDispatch.call(this, event);            }            return event.result;        },        handlers: function (event, handlers) {            var i, matches, sel, handleObj,                handlerQueue = [],                delegateCount = handlers.delegateCount,                cur = event.target;            // Find delegate handlers            // Black-hole SVG <use> instance trees (#13180)            // Avoid non-left-click bubbling in Firefox (#3861)            if (delegateCount && cur.nodeType && (!event.button || event.type !== "click")) {                for (; cur !== this; cur = cur.parentNode || this) {                    // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)                    if (cur.disabled !== true || event.type !== "click") {                        matches = [];                        for (i = 0; i < delegateCount; i++) {                            handleObj = handlers[i];                            // Don't conflict with Object.prototype properties (#13203)                            sel = handleObj.selector + " ";                            if (matches[sel] === undefined) {                                matches[sel] = handleObj.needsContext ?                                jQuery(sel, this).index(cur) >= 0 :                                    jQuery.find(sel, this, null, [cur]).length;                            }                            if (matches[sel]) {                                matches.push(handleObj);                            }                        }                        if (matches.length) {                            handlerQueue.push({elem: cur, handlers: matches});                        }                    }                }            }            // Add the remaining (directly-bound) handlers            if (delegateCount < handlers.length) {                handlerQueue.push({elem: this, handlers: handlers.slice(delegateCount)});            }            return handlerQueue;        },        // Includes some event props shared by KeyEvent and MouseEvent        props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),        fixHooks: {},        keyHooks: {            props: "char charCode key keyCode".split(" "),            filter: function (event, original) {                // Add which for key events                if (event.which == null) {                    event.which = original.charCode != null ? original.charCode : original.keyCode;                }                return event;            }        },        mouseHooks: {            props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),            filter: function (event, original) {                var eventDoc, doc, body,                    button = original.button;                // Calculate pageX/Y if missing and clientX/Y available                if (event.pageX == null && original.clientX != null) {                    eventDoc = event.target.ownerDocument || document;                    doc = eventDoc.documentElement;                    body = eventDoc.body;                    event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );                    event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );                }                // Add which for click: 1 === left; 2 === middle; 3 === right                // Note: button is not normalized, so don't use it                if (!event.which && button !== undefined) {                    event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );                }                return event;            }        },        fix: function (event) {            if (event[jQuery.expando]) {                return event;            }            // Create a writable copy of the event object and normalize some properties            var i, prop, copy,                type = event.type,                originalEvent = event,                fixHook = this.fixHooks[type];            if (!fixHook) {                this.fixHooks[type] = fixHook =                    rmouseEvent.test(type) ? this.mouseHooks :                        rkeyEvent.test(type) ? this.keyHooks :                        {};            }            copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;            event = new jQuery.Event(originalEvent);            i = copy.length;            while (i--) {                prop = copy[i];                event[prop] = originalEvent[prop];            }            // Support: Cordova 2.5 (WebKit) (#13255)            // All events should have a target; Cordova deviceready doesn't            if (!event.target) {                event.target = document;            }            // Support: Safari 6.0+, Chrome<28            // Target should not be a text node (#504, #13143)            if (event.target.nodeType === 3) {                event.target = event.target.parentNode;            }            return fixHook.filter ? fixHook.filter(event, originalEvent) : event;        },        special: {            load: {                // Prevent triggered image.load events from bubbling to window.load                noBubble: true            },            focus: {                // Fire native event if possible so blur/focus sequence is correct                trigger: function () {                    if (this !== safeActiveElement() && this.focus) {                        this.focus();                        return false;                    }                },                delegateType: "focusin"            },            blur: {                trigger: function () {                    if (this === safeActiveElement() && this.blur) {                        this.blur();                        return false;                    }                },                delegateType: "focusout"            },            click: {                // For checkbox, fire native event so checked state will be right                trigger: function () {                    if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input")) {                        this.click();                        return false;                    }                },                // For cross-browser consistency, don't fire native .click() on links                _default: function (event) {                    return jQuery.nodeName(event.target, "a");                }            },            beforeunload: {                postDispatch: function (event) {                    // Support: Firefox 20+                    // Firefox doesn't alert if the returnValue field is not set.                    if (event.result !== undefined && event.originalEvent) {                        event.originalEvent.returnValue = event.result;                    }                }            }        },        simulate: function (type, elem, event, bubble) {            // Piggyback on a donor event to simulate a different one.            // Fake originalEvent to avoid donor's stopPropagation, but if the            // simulated event prevents default then we do the same on the donor.            var e = jQuery.extend(                new jQuery.Event(),                event,                {                    type: type,                    isSimulated: true,                    originalEvent: {}                }            );            if (bubble) {                jQuery.event.trigger(e, null, elem);            } else {                jQuery.event.dispatch.call(elem, e);            }            if (e.isDefaultPrevented()) {                event.preventDefault();            }        }    };    jQuery.removeEvent = function (elem, type, handle) {        if (elem.removeEventListener) {            elem.removeEventListener(type, handle, false);        }    };    jQuery.Event = function (src, props) {        // Allow instantiation without the 'new' keyword        if (!(this instanceof jQuery.Event)) {            return new jQuery.Event(src, props);        }        // Event object        if (src && src.type) {            this.originalEvent = src;            this.type = src.type;            // Events bubbling up the document may have been marked as prevented            // by a handler lower down the tree; reflect the correct value.            this.isDefaultPrevented = src.defaultPrevented ||            src.defaultPrevented === undefined &&                // Support: Android<4.0            src.returnValue === false ?                returnTrue :                returnFalse;            // Event type        } else {            this.type = src;        }        // Put explicitly provided properties onto the event object        if (props) {            jQuery.extend(this, props);        }        // Create a timestamp if incoming event doesn't have one        this.timeStamp = src && src.timeStamp || jQuery.now();        // Mark it as fixed        this[jQuery.expando] = true;    };// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html    jQuery.Event.prototype = {        isDefaultPrevented: returnFalse,        isPropagationStopped: returnFalse,        isImmediatePropagationStopped: returnFalse,        preventDefault: function () {            var e = this.originalEvent;            this.isDefaultPrevented = returnTrue;            if (e && e.preventDefault) {                e.preventDefault();            }        },        stopPropagation: function () {            var e = this.originalEvent;            this.isPropagationStopped = returnTrue;            if (e && e.stopPropagation) {                e.stopPropagation();            }        },        stopImmediatePropagation: function () {            var e = this.originalEvent;            this.isImmediatePropagationStopped = returnTrue;            if (e && e.stopImmediatePropagation) {                e.stopImmediatePropagation();            }            this.stopPropagation();        }    };// Create mouseenter/leave events using mouseover/out and event-time checks// Support: Chrome 15+    jQuery.each({        mouseenter: "mouseover",        mouseleave: "mouseout",        pointerenter: "pointerover",        pointerleave: "pointerout"    }, function (orig, fix) {        jQuery.event.special[orig] = {            delegateType: fix,            bindType: fix,            handle: function (event) {                var ret,                    target = this,                    related = event.relatedTarget,                    handleObj = event.handleObj;                // For mousenter/leave call the handler if related is outside the target.                // NB: No relatedTarget if the mouse left/entered the browser window                if (!related || (related !== target && !jQuery.contains(target, related))) {                    event.type = handleObj.origType;                    ret = handleObj.handler.apply(this, arguments);                    event.type = fix;                }                return ret;            }        };    });// Support: Firefox, Chrome, Safari// Create "bubbling" focus and blur events    if (!support.focusinBubbles) {        jQuery.each({focus: "focusin", blur: "focusout"}, function (orig, fix) {            // Attach a single capturing handler on the document while someone wants focusin/focusout            var handler = function (event) {                jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true);            };            jQuery.event.special[fix] = {                setup: function () {                    var doc = this.ownerDocument || this,                        attaches = data_priv.access(doc, fix);                    if (!attaches) {                        doc.addEventListener(orig, handler, true);                    }                    data_priv.access(doc, fix, ( attaches || 0 ) + 1);                },                teardown: function () {                    var doc = this.ownerDocument || this,                        attaches = data_priv.access(doc, fix) - 1;                    if (!attaches) {                        doc.removeEventListener(orig, handler, true);                        data_priv.remove(doc, fix);                    } else {                        data_priv.access(doc, fix, attaches);                    }                }            };        });    }    jQuery.fn.extend({        on: function (types, selector, data, fn, /*INTERNAL*/ one) {            var origFn, type;            // Types can be a map of types/handlers            if (typeof types === "object") {                // ( types-Object, selector, data )                if (typeof selector !== "string") {                    // ( types-Object, data )                    data = data || selector;                    selector = undefined;                }                for (type in types) {                    this.on(type, selector, data, types[type], one);                }                return this;            }            if (data == null && fn == null) {                // ( types, fn )                fn = selector;                data = selector = undefined;            } else if (fn == null) {                if (typeof selector === "string") {                    // ( types, selector, fn )                    fn = data;                    data = undefined;                } else {                    // ( types, data, fn )                    fn = data;                    data = selector;                    selector = undefined;                }            }            if (fn === false) {                fn = returnFalse;            } else if (!fn) {                return this;            }            if (one === 1) {                origFn = fn;                fn = function (event) {                    // Can use an empty set, since event contains the info                    jQuery().off(event);                    return origFn.apply(this, arguments);                };                // Use same guid so caller can remove using origFn                fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );            }            return this.each(function () {                jQuery.event.add(this, types, fn, data, selector);            });        },        one: function (types, selector, data, fn) {            return this.on(types, selector, data, fn, 1);        },        off: function (types, selector, fn) {            var handleObj, type;            if (types && types.preventDefault && types.handleObj) {                // ( event )  dispatched jQuery.Event                handleObj = types.handleObj;                jQuery(types.delegateTarget).off(                    handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,                    handleObj.selector,                    handleObj.handler                );                return this;            }            if (typeof types === "object") {                // ( types-object [, selector] )                for (type in types) {                    this.off(type, selector, types[type]);                }                return this;            }            if (selector === false || typeof selector === "function") {                // ( types [, fn] )                fn = selector;                selector = undefined;            }            if (fn === false) {                fn = returnFalse;            }            return this.each(function () {                jQuery.event.remove(this, types, fn, selector);            });        },        trigger: function (type, data) {            return this.each(function () {                jQuery.event.trigger(type, data, this);            });        },        triggerHandler: function (type, data) {            var elem = this[0];            if (elem) {                return jQuery.event.trigger(type, data, elem, true);            }        }    });    var        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,        rtagName = /<([\w:]+)/,        rhtml = /<|&#?\w+;/,        rnoInnerhtml = /<(?:script|style|link)/i,    // checked="checked" or checked        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,        rscriptType = /^$|\/(?:java|ecma)script/i,        rscriptTypeMasked = /^true\/(.*)/,        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,    // We have to close these tags to support XHTML (#13200)        wrapMap = {            // Support: IE9            option: [1, "<select multiple='multiple'>", "</select>"],            thead: [1, "<table>", "</table>"],            col: [2, "<table><colgroup>", "</colgroup></table>"],            tr: [2, "<table><tbody>", "</tbody></table>"],            td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],            _default: [0, "", ""]        };// Support: IE9    wrapMap.optgroup = wrapMap.option;    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;    wrapMap.th = wrapMap.td;// Support: 1.x compatibility// Manipulating tables requires a tbody    function manipulationTarget(elem, content) {        return jQuery.nodeName(elem, "table") &&        jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ?        elem.getElementsByTagName("tbody")[0] ||        elem.appendChild(elem.ownerDocument.createElement("tbody")) :            elem;    }// Replace/restore the type attribute of script elements for safe DOM manipulation    function disableScript(elem) {        elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;        return elem;    }    function restoreScript(elem) {        var match = rscriptTypeMasked.exec(elem.type);        if (match) {            elem.type = match[1];        } else {            elem.removeAttribute("type");        }        return elem;    }// Mark scripts as having already been evaluated    function setGlobalEval(elems, refElements) {        var i = 0,            l = elems.length;        for (; i < l; i++) {            data_priv.set(                elems[i], "globalEval", !refElements || data_priv.get(refElements[i], "globalEval")            );        }    }    function cloneCopyEvent(src, dest) {        var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;        if (dest.nodeType !== 1) {            return;        }        // 1. Copy private data: events, handlers, etc.        if (data_priv.hasData(src)) {            pdataOld = data_priv.access(src);            pdataCur = data_priv.set(dest, pdataOld);            events = pdataOld.events;            if (events) {                delete pdataCur.handle;                pdataCur.events = {};                for (type in events) {                    for (i = 0, l = events[type].length; i < l; i++) {                        jQuery.event.add(dest, type, events[type][i]);                    }                }            }        }        // 2. Copy user data        if (data_user.hasData(src)) {            udataOld = data_user.access(src);            udataCur = jQuery.extend({}, udataOld);            data_user.set(dest, udataCur);        }    }    function getAll(context, tag) {        var ret = context.getElementsByTagName ? context.getElementsByTagName(tag || "*") :            context.querySelectorAll ? context.querySelectorAll(tag || "*") :                [];        return tag === undefined || tag && jQuery.nodeName(context, tag) ?            jQuery.merge([context], ret) :            ret;    }// Fix IE bugs, see support tests    function fixInput(src, dest) {        var nodeName = dest.nodeName.toLowerCase();        // Fails to persist the checked state of a cloned checkbox or radio button.        if (nodeName === "input" && rcheckableType.test(src.type)) {            dest.checked = src.checked;            // Fails to return the selected option to the default selected state when cloning options        } else if (nodeName === "input" || nodeName === "textarea") {            dest.defaultValue = src.defaultValue;        }    }    jQuery.extend({        clone: function (elem, dataAndEvents, deepDataAndEvents) {            var i, l, srcElements, destElements,                clone = elem.cloneNode(true),                inPage = jQuery.contains(elem.ownerDocument, elem);            // Fix IE cloning issues            if (!support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc(elem)) {                // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2                destElements = getAll(clone);                srcElements = getAll(elem);                for (i = 0, l = srcElements.length; i < l; i++) {                    fixInput(srcElements[i], destElements[i]);                }            }            // Copy the events from the original to the clone            if (dataAndEvents) {                if (deepDataAndEvents) {                    srcElements = srcElements || getAll(elem);                    destElements = destElements || getAll(clone);                    for (i = 0, l = srcElements.length; i < l; i++) {                        cloneCopyEvent(srcElements[i], destElements[i]);                    }                } else {                    cloneCopyEvent(elem, clone);                }            }            // Preserve script evaluation history            destElements = getAll(clone, "script");            if (destElements.length > 0) {                setGlobalEval(destElements, !inPage && getAll(elem, "script"));            }            // Return the cloned set            return clone;        },        buildFragment: function (elems, context, scripts, selection) {            var elem, tmp, tag, wrap, contains, j,                fragment = context.createDocumentFragment(),                nodes = [],                i = 0,                l = elems.length;            for (; i < l; i++) {                elem = elems[i];                if (elem || elem === 0) {                    // Add nodes directly                    if (jQuery.type(elem) === "object") {                        // Support: QtWebKit, PhantomJS                        // push.apply(_, arraylike) throws on ancient WebKit                        jQuery.merge(nodes, elem.nodeType ? [elem] : elem);                        // Convert non-html into a text node                    } else if (!rhtml.test(elem)) {                        nodes.push(context.createTextNode(elem));                        // Convert html into DOM nodes                    } else {                        tmp = tmp || fragment.appendChild(context.createElement("div"));                        // Deserialize a standard representation                        tag = ( rtagName.exec(elem) || ["", ""] )[1].toLowerCase();                        wrap = wrapMap[tag] || wrapMap._default;                        tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1></$2>") + wrap[2];                        // Descend through wrappers to the right content                        j = wrap[0];                        while (j--) {                            tmp = tmp.lastChild;                        }                        // Support: QtWebKit, PhantomJS                        // push.apply(_, arraylike) throws on ancient WebKit                        jQuery.merge(nodes, tmp.childNodes);                        // Remember the top-level container                        tmp = fragment.firstChild;                        // Ensure the created nodes are orphaned (#12392)                        tmp.textContent = "";                    }                }            }            // Remove wrapper from fragment            fragment.textContent = "";            i = 0;            while ((elem = nodes[i++])) {                // #4087 - If origin and destination elements are the same, and this is                // that element, do not do anything                if (selection && jQuery.inArray(elem, selection) !== -1) {                    continue;                }                contains = jQuery.contains(elem.ownerDocument, elem);                // Append to fragment                tmp = getAll(fragment.appendChild(elem), "script");                // Preserve script evaluation history                if (contains) {                    setGlobalEval(tmp);                }                // Capture executables                if (scripts) {                    j = 0;                    while ((elem = tmp[j++])) {                        if (rscriptType.test(elem.type || "")) {                            scripts.push(elem);                        }                    }                }            }            return fragment;        },        cleanData: function (elems) {            var data, elem, type, key,                special = jQuery.event.special,                i = 0;            for (; (elem = elems[i]) !== undefined; i++) {                if (jQuery.acceptData(elem)) {                    key = elem[data_priv.expando];                    if (key && (data = data_priv.cache[key])) {                        if (data.events) {                            for (type in data.events) {                                if (special[type]) {                                    jQuery.event.remove(elem, type);                                    // This is a shortcut to avoid jQuery.event.remove's overhead                                } else {                                    jQuery.removeEvent(elem, type, data.handle);                                }                            }                        }                        if (data_priv.cache[key]) {                            // Discard any remaining `private` data                            delete data_priv.cache[key];                        }                    }                }                // Discard any remaining `user` data                delete data_user.cache[elem[data_user.expando]];            }        }    });    jQuery.fn.extend({        text: function (value) {            return access(this, function (value) {                return value === undefined ?                    jQuery.text(this) :                    this.empty().each(function () {                        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {                            this.textContent = value;                        }                    });            }, null, value, arguments.length);        },        append: function () {            return this.domManip(arguments, function (elem) {                if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {                    var target = manipulationTarget(this, elem);                    target.appendChild(elem);                }            });        },        prepend: function () {            return this.domManip(arguments, function (elem) {                if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {                    var target = manipulationTarget(this, elem);                    target.insertBefore(elem, target.firstChild);                }            });        },        before: function () {            return this.domManip(arguments, function (elem) {                if (this.parentNode) {                    this.parentNode.insertBefore(elem, this);                }            });        },        after: function () {            return this.domManip(arguments, function (elem) {                if (this.parentNode) {                    this.parentNode.insertBefore(elem, this.nextSibling);                }            });        },        remove: function (selector, keepData /* Internal Use Only */) {            var elem,                elems = selector ? jQuery.filter(selector, this) : this,                i = 0;            for (; (elem = elems[i]) != null; i++) {                if (!keepData && elem.nodeType === 1) {                    jQuery.cleanData(getAll(elem));                }                if (elem.parentNode) {                    if (keepData && jQuery.contains(elem.ownerDocument, elem)) {                        setGlobalEval(getAll(elem, "script"));                    }                    elem.parentNode.removeChild(elem);                }            }            return this;        },        empty: function () {            var elem,                i = 0;            for (; (elem = this[i]) != null; i++) {                if (elem.nodeType === 1) {                    // Prevent memory leaks                    jQuery.cleanData(getAll(elem, false));                    // Remove any remaining nodes                    elem.textContent = "";                }            }            return this;        },        clone: function (dataAndEvents, deepDataAndEvents) {            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;            return this.map(function () {                return jQuery.clone(this, dataAndEvents, deepDataAndEvents);            });        },        html: function (value) {            return access(this, function (value) {                var elem = this[0] || {},                    i = 0,                    l = this.length;                if (value === undefined && elem.nodeType === 1) {                    return elem.innerHTML;                }                // See if we can take a shortcut and just use innerHTML                if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[( rtagName.exec(value) || ["", ""] )[1].toLowerCase()]) {                    value = value.replace(rxhtmlTag, "<$1></$2>");                    try {                        for (; i < l; i++) {                            elem = this[i] || {};                            // Remove element nodes and prevent memory leaks                            if (elem.nodeType === 1) {                                jQuery.cleanData(getAll(elem, false));                                elem.innerHTML = value;                            }                        }                        elem = 0;                        // If using innerHTML throws an exception, use the fallback method                    } catch (e) {                    }                }                if (elem) {                    this.empty().append(value);                }            }, null, value, arguments.length);        },        replaceWith: function () {            var arg = arguments[0];            // Make the changes, replacing each context element with the new content            this.domManip(arguments, function (elem) {                arg = this.parentNode;                jQuery.cleanData(getAll(this));                if (arg) {                    arg.replaceChild(elem, this);                }            });            // Force removal if there was no new content (e.g., from empty arguments)            return arg && (arg.length || arg.nodeType) ? this : this.remove();        },        detach: function (selector) {            return this.remove(selector, true);        },        domManip: function (args, callback) {            // Flatten any nested arrays            args = concat.apply([], args);            var fragment, first, scripts, hasScripts, node, doc,                i = 0,                l = this.length,                set = this,                iNoClone = l - 1,                value = args[0],                isFunction = jQuery.isFunction(value);            // We can't cloneNode fragments that contain checked, in WebKit            if (isFunction ||                ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value) )) {                return this.each(function (index) {                    var self = set.eq(index);                    if (isFunction) {                        args[0] = value.call(this, index, self.html());                    }                    self.domManip(args, callback);                });            }            if (l) {                fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, this);                first = fragment.firstChild;                if (fragment.childNodes.length === 1) {                    fragment = first;                }                if (first) {                    scripts = jQuery.map(getAll(fragment, "script"), disableScript);                    hasScripts = scripts.length;                    // Use the original fragment for the last item instead of the first because it can end up                    // being emptied incorrectly in certain situations (#8070).                    for (; i < l; i++) {                        node = fragment;                        if (i !== iNoClone) {                            node = jQuery.clone(node, true, true);                            // Keep references to cloned scripts for later restoration                            if (hasScripts) {                                // Support: QtWebKit                                // jQuery.merge because push.apply(_, arraylike) throws                                jQuery.merge(scripts, getAll(node, "script"));                            }                        }                        callback.call(this[i], node, i);                    }                    if (hasScripts) {                        doc = scripts[scripts.length - 1].ownerDocument;                        // Reenable scripts                        jQuery.map(scripts, restoreScript);                        // Evaluate executable scripts on first document insertion                        for (i = 0; i < hasScripts; i++) {                            node = scripts[i];                            if (rscriptType.test(node.type || "") && !data_priv.access(node, "globalEval") && jQuery.contains(doc, node)) {                                if (node.src) {                                    // Optional AJAX dependency, but won't run scripts if not present                                    if (jQuery._evalUrl) {                                        jQuery._evalUrl(node.src);                                    }                                } else {                                    jQuery.globalEval(node.textContent.replace(rcleanScript, ""));                                }                            }                        }                    }                }            }            return this;        }    });    jQuery.each({        appendTo: "append",        prependTo: "prepend",        insertBefore: "before",        insertAfter: "after",        replaceAll: "replaceWith"    }, function (name, original) {        jQuery.fn[name] = function (selector) {            var elems,                ret = [],                insert = jQuery(selector),                last = insert.length - 1,                i = 0;            for (; i <= last; i++) {                elems = i === last ? this : this.clone(true);                jQuery(insert[i])[original](elems);                // Support: QtWebKit                // .get() because push.apply(_, arraylike) throws                push.apply(ret, elems.get());            }            return this.pushStack(ret);        };    });    var iframe,        elemdisplay = {};    /**     * Retrieve the actual display of a element     * @param {String} name nodeName of the element     * @param {Object} doc Document object     */// Called only from within defaultDisplay    function actualDisplay(name, doc) {        var style,            elem = jQuery(doc.createElement(name)).appendTo(doc.body),        // getDefaultComputedStyle might be reliably used only on attached element            display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle(elem[0]) ) ?                // Use of this method is a temporary fix (more like optimization) until something better comes along,                // since it was removed from specification and supported only in FF                style.display : jQuery.css(elem[0], "display");        // We don't have any data stored on the element,        // so use "detach" method as fast way to get rid of the element        elem.detach();        return display;    }    /**     * Try to determine the default display value of an element     * @param {String} nodeName     */    function defaultDisplay(nodeName) {        var doc = document,            display = elemdisplay[nodeName];        if (!display) {            display = actualDisplay(nodeName, doc);            // If the simple way fails, read from inside an iframe            if (display === "none" || !display) {                // Use the already-created iframe if possible                iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);                // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse                doc = iframe[0].contentDocument;                // Support: IE                doc.write();                doc.close();                display = actualDisplay(nodeName, doc);                iframe.detach();            }            // Store the correct default display            elemdisplay[nodeName] = display;        }        return display;    }    var rmargin = (/^margin/);    var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");    var getStyles = function (elem) {        // Support: IE<=11+, Firefox<=30+ (#15098, #14150)        // IE throws on elements created in popups        // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"        if (elem.ownerDocument.defaultView.opener) {            return elem.ownerDocument.defaultView.getComputedStyle(elem, null);        }        return window.getComputedStyle(elem, null);    };    function curCSS(elem, name, computed) {        var width, minWidth, maxWidth, ret,            style = elem.style;        computed = computed || getStyles(elem);        // Support: IE9        // getPropertyValue is only needed for .css('filter') (#12537)        if (computed) {            ret = computed.getPropertyValue(name) || computed[name];        }        if (computed) {            if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) {                ret = jQuery.style(elem, name);            }            // Support: iOS < 6            // A tribute to the "awesome hack by Dean Edwards"            // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels            // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values            if (rnumnonpx.test(ret) && rmargin.test(name)) {                // Remember the original values                width = style.width;                minWidth = style.minWidth;                maxWidth = style.maxWidth;                // Put in the new values to get a computed value out                style.minWidth = style.maxWidth = style.width = ret;                ret = computed.width;                // Revert the changed values                style.width = width;                style.minWidth = minWidth;                style.maxWidth = maxWidth;            }        }        return ret !== undefined ?            // Support: IE            // IE returns zIndex value as an integer.        ret + "" :            ret;    }    function addGetHookIf(conditionFn, hookFn) {        // Define the hook, we'll check on the first run if it's really needed.        return {            get: function () {                if (conditionFn()) {                    // Hook not needed (or it's not possible to use it due                    // to missing dependency), remove it.                    delete this.get;                    return;                }                // Hook needed; redefine it so that the support test is not executed again.                return (this.get = hookFn).apply(this, arguments);            }        };    }    (function () {        var pixelPositionVal, boxSizingReliableVal,            docElem = document.documentElement,            container = document.createElement("div"),            div = document.createElement("div");        if (!div.style) {            return;        }        // Support: IE9-11+        // Style of cloned element affects source element cloned (#8908)        div.style.backgroundClip = "content-box";        div.cloneNode(true).style.backgroundClip = "";        support.clearCloneStyle = div.style.backgroundClip === "content-box";        container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +            "position:absolute";        container.appendChild(div);        // Executing both pixelPosition & boxSizingReliable tests require only one layout        // so they're executed at the same time to save the second computation.        function computePixelPositionAndBoxSizingReliable() {            div.style.cssText =                // Support: Firefox<29, Android 2.3                // Vendor-prefix box-sizing                "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +                "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +                "border:1px;padding:1px;width:4px;position:absolute";            div.innerHTML = "";            docElem.appendChild(container);            var divStyle = window.getComputedStyle(div, null);            pixelPositionVal = divStyle.top !== "1%";            boxSizingReliableVal = divStyle.width === "4px";            docElem.removeChild(container);        }        // Support: node.js jsdom        // Don't assume that getComputedStyle is a property of the global object        if (window.getComputedStyle) {            jQuery.extend(support, {                pixelPosition: function () {                    // This test is executed only once but we still do memoizing                    // since we can use the boxSizingReliable pre-computing.                    // No need to check if the test was already performed, though.                    computePixelPositionAndBoxSizingReliable();                    return pixelPositionVal;                },                boxSizingReliable: function () {                    if (boxSizingReliableVal == null) {                        computePixelPositionAndBoxSizingReliable();                    }                    return boxSizingReliableVal;                },                reliableMarginRight: function () {                    // Support: Android 2.3                    // Check if div with explicit width and no margin-right incorrectly                    // gets computed margin-right based on width of container. (#3333)                    // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right                    // This support function is only executed once so no memoizing is needed.                    var ret,                        marginDiv = div.appendChild(document.createElement("div"));                    // Reset CSS: box-sizing; display; margin; border; padding                    marginDiv.style.cssText = div.style.cssText =                        // Support: Firefox<29, Android 2.3                        // Vendor-prefix box-sizing                        "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +                        "box-sizing:content-box;display:block;margin:0;border:0;padding:0";                    marginDiv.style.marginRight = marginDiv.style.width = "0";                    div.style.width = "1px";                    docElem.appendChild(container);                    ret = !parseFloat(window.getComputedStyle(marginDiv, null).marginRight);                    docElem.removeChild(container);                    div.removeChild(marginDiv);                    return ret;                }            });        }    })();// A method for quickly swapping in/out CSS properties to get correct calculations.    jQuery.swap = function (elem, options, callback, args) {        var ret, name,            old = {};        // Remember the old values, and insert the new ones        for (name in options) {            old[name] = elem.style[name];            elem.style[name] = options[name];        }        ret = callback.apply(elem, args || []);        // Revert the old values        for (name in options) {            elem.style[name] = old[name];        }        return ret;    };    var    // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"    // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display        rdisplayswap = /^(none|table(?!-c[ea]).+)/,        rnumsplit = new RegExp("^(" + pnum + ")(.*)$", "i"),        rrelNum = new RegExp("^([+-])=(" + pnum + ")", "i"),        cssShow = {position: "absolute", visibility: "hidden", display: "block"},        cssNormalTransform = {            letterSpacing: "0",            fontWeight: "400"        },        cssPrefixes = ["Webkit", "O", "Moz", "ms"];// Return a css property mapped to a potentially vendor prefixed property    function vendorPropName(style, name) {        // Shortcut for names that are not vendor prefixed        if (name in style) {            return name;        }        // Check for vendor prefixed names        var capName = name[0].toUpperCase() + name.slice(1),            origName = name,            i = cssPrefixes.length;        while (i--) {            name = cssPrefixes[i] + capName;            if (name in style) {                return name;            }        }        return origName;    }    function setPositiveNumber(elem, value, subtract) {        var matches = rnumsplit.exec(value);        return matches ?            // Guard against undefined "subtract", e.g., when used as in cssHooks        Math.max(0, matches[1] - ( subtract || 0 )) + ( matches[2] || "px" ) :            value;    }    function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {        var i = extra === ( isBorderBox ? "border" : "content" ) ?                // If we already have the right measurement, avoid augmentation                4 :                // Otherwise initialize for horizontal or vertical properties                name === "width" ? 1 : 0,            val = 0;        for (; i < 4; i += 2) {            // Both box models exclude margin, so add it if we want it            if (extra === "margin") {                val += jQuery.css(elem, extra + cssExpand[i], true, styles);            }            if (isBorderBox) {                // border-box includes padding, so remove it if we want content                if (extra === "content") {                    val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);                }                // At this point, extra isn't border nor margin, so remove border                if (extra !== "margin") {                    val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);                }            } else {                // At this point, extra isn't content, so add padding                val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);                // At this point, extra isn't content nor padding, so add border                if (extra !== "padding") {                    val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);                }            }        }        return val;    }    function getWidthOrHeight(elem, name, extra) {        // Start with offset property, which is equivalent to the border-box value        var valueIsBorderBox = true,            val = name === "width" ? elem.offsetWidth : elem.offsetHeight,            styles = getStyles(elem),            isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";        // Some non-html elements return undefined for offsetWidth, so check for null/undefined        // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285        // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668        if (val <= 0 || val == null) {            // Fall back to computed then uncomputed css if necessary            val = curCSS(elem, name, styles);            if (val < 0 || val == null) {                val = elem.style[name];            }            // Computed unit is not pixels. Stop here and return.            if (rnumnonpx.test(val)) {                return val;            }            // Check for style in case a browser which returns unreliable values            // for getComputedStyle silently falls back to the reliable elem.style            valueIsBorderBox = isBorderBox &&                ( support.boxSizingReliable() || val === elem.style[name] );            // Normalize "", auto, and prepare for extra            val = parseFloat(val) || 0;        }        // Use the active box-sizing model to add/subtract irrelevant styles        return ( val +                augmentWidthOrHeight(                    elem,                    name,                    extra || ( isBorderBox ? "border" : "content" ),                    valueIsBorderBox,                    styles                )            ) + "px";    }    function showHide(elements, show) {        var display, elem, hidden,            values = [],            index = 0,            length = elements.length;        for (; index < length; index++) {            elem = elements[index];            if (!elem.style) {                continue;            }            values[index] = data_priv.get(elem, "olddisplay");            display = elem.style.display;            if (show) {                // Reset the inline display of this element to learn if it is                // being hidden by cascaded rules or not                if (!values[index] && display === "none") {                    elem.style.display = "";                }                // Set elements which have been overridden with display: none                // in a stylesheet to whatever the default browser style is                // for such an element                if (elem.style.display === "" && isHidden(elem)) {                    values[index] = data_priv.access(elem, "olddisplay", defaultDisplay(elem.nodeName));                }            } else {                hidden = isHidden(elem);                if (display !== "none" || !hidden) {                    data_priv.set(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display"));                }            }        }        // Set the display of most of the elements in a second loop        // to avoid the constant reflow        for (index = 0; index < length; index++) {            elem = elements[index];            if (!elem.style) {                continue;            }            if (!show || elem.style.display === "none" || elem.style.display === "") {                elem.style.display = show ? values[index] || "" : "none";            }        }        return elements;    }    jQuery.extend({        // Add in style property hooks for overriding the default        // behavior of getting and setting a style property        cssHooks: {            opacity: {                get: function (elem, computed) {                    if (computed) {                        // We should always get a number back from opacity                        var ret = curCSS(elem, "opacity");                        return ret === "" ? "1" : ret;                    }                }            }        },        // Don't automatically add "px" to these possibly-unitless properties        cssNumber: {            "columnCount": true,            "fillOpacity": true,            "flexGrow": true,            "flexShrink": true,            "fontWeight": true,            "lineHeight": true,            "opacity": true,            "order": true,            "orphans": true,            "widows": true,            "zIndex": true,            "zoom": true        },        // Add in properties whose names you wish to fix before        // setting or getting the value        cssProps: {            "float": "cssFloat"        },        // Get and set the style property on a DOM Node        style: function (elem, name, value, extra) {            // Don't set styles on text and comment nodes            if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {                return;            }            // Make sure that we're working with the right name            var ret, type, hooks,                origName = jQuery.camelCase(name),                style = elem.style;            name = jQuery.cssProps[origName] || ( jQuery.cssProps[origName] = vendorPropName(style, origName) );            // Gets hook for the prefixed version, then unprefixed version            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];            // Check if we're setting a value            if (value !== undefined) {                type = typeof value;                // Convert "+=" or "-=" to relative numbers (#7345)                if (type === "string" && (ret = rrelNum.exec(value))) {                    value = ( ret[1] + 1 ) * ret[2] + parseFloat(jQuery.css(elem, name));                    // Fixes bug #9237                    type = "number";                }                // Make sure that null and NaN values aren't set (#7116)                if (value == null || value !== value) {                    return;                }                // If a number, add 'px' to the (except for certain CSS properties)                if (type === "number" && !jQuery.cssNumber[origName]) {                    value += "px";                }                // Support: IE9-11+                // background-* props affect original clone's values                if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {                    style[name] = "inherit";                }                // If a hook was provided, use that value, otherwise just set the specified value                if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {                    style[name] = value;                }            } else {                // If a hook was provided get the non-computed value from there                if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {                    return ret;                }                // Otherwise just get the value from the style object                return style[name];            }        },        css: function (elem, name, extra, styles) {            var val, num, hooks,                origName = jQuery.camelCase(name);            // Make sure that we're working with the right name            name = jQuery.cssProps[origName] || ( jQuery.cssProps[origName] = vendorPropName(elem.style, origName) );            // Try prefixed name followed by the unprefixed name            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];            // If a hook was provided get the computed value from there            if (hooks && "get" in hooks) {                val = hooks.get(elem, true, extra);            }            // Otherwise, if a way to get the computed value exists, use that            if (val === undefined) {                val = curCSS(elem, name, styles);            }            // Convert "normal" to computed value            if (val === "normal" && name in cssNormalTransform) {                val = cssNormalTransform[name];            }            // Make numeric if forced or a qualifier was provided and val looks numeric            if (extra === "" || extra) {                num = parseFloat(val);                return extra === true || jQuery.isNumeric(num) ? num || 0 : val;            }            return val;        }    });    jQuery.each(["height", "width"], function (i, name) {        jQuery.cssHooks[name] = {            get: function (elem, computed, extra) {                if (computed) {                    // Certain elements can have dimension info if we invisibly show them                    // but it must have a current display style that would benefit                    return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ?                        jQuery.swap(elem, cssShow, function () {                            return getWidthOrHeight(elem, name, extra);                        }) :                        getWidthOrHeight(elem, name, extra);                }            },            set: function (elem, value, extra) {                var styles = extra && getStyles(elem);                return setPositiveNumber(elem, value, extra ?                    augmentWidthOrHeight(                        elem,                        name,                        extra,                        jQuery.css(elem, "boxSizing", false, styles) === "border-box",                        styles                    ) : 0                );            }        };    });// Support: Android 2.3    jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight,        function (elem, computed) {            if (computed) {                return jQuery.swap(elem, {"display": "inline-block"},                    curCSS, [elem, "marginRight"]);            }        }    );// These hooks are used by animate to expand properties    jQuery.each({        margin: "",        padding: "",        border: "Width"    }, function (prefix, suffix) {        jQuery.cssHooks[prefix + suffix] = {            expand: function (value) {                var i = 0,                    expanded = {},                // Assumes a single number if not a string                    parts = typeof value === "string" ? value.split(" ") : [value];                for (; i < 4; i++) {                    expanded[prefix + cssExpand[i] + suffix] =                        parts[i] || parts[i - 2] || parts[0];                }                return expanded;            }        };        if (!rmargin.test(prefix)) {            jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;        }    });    jQuery.fn.extend({        css: function (name, value) {            return access(this, function (elem, name, value) {                var styles, len,                    map = {},                    i = 0;                if (jQuery.isArray(name)) {                    styles = getStyles(elem);                    len = name.length;                    for (; i < len; i++) {                        map[name[i]] = jQuery.css(elem, name[i], false, styles);                    }                    return map;                }                return value !== undefined ?                    jQuery.style(elem, name, value) :                    jQuery.css(elem, name);            }, name, value, arguments.length > 1);        },        show: function () {            return showHide(this, true);        },        hide: function () {            return showHide(this);        },        toggle: function (state) {            if (typeof state === "boolean") {                return state ? this.show() : this.hide();            }            return this.each(function () {                if (isHidden(this)) {                    jQuery(this).show();                } else {                    jQuery(this).hide();                }            });        }    });    function Tween(elem, options, prop, end, easing) {        return new Tween.prototype.init(elem, options, prop, end, easing);    }    jQuery.Tween = Tween;    Tween.prototype = {        constructor: Tween,        init: function (elem, options, prop, end, easing, unit) {            this.elem = elem;            this.prop = prop;            this.easing = easing || "swing";            this.options = options;            this.start = this.now = this.cur();            this.end = end;            this.unit = unit || ( jQuery.cssNumber[prop] ? "" : "px" );        },        cur: function () {            var hooks = Tween.propHooks[this.prop];            return hooks && hooks.get ?                hooks.get(this) :                Tween.propHooks._default.get(this);        },        run: function (percent) {            var eased,                hooks = Tween.propHooks[this.prop];            if (this.options.duration) {                this.pos = eased = jQuery.easing[this.easing](                    percent, this.options.duration * percent, 0, 1, this.options.duration                );            } else {                this.pos = eased = percent;            }            this.now = ( this.end - this.start ) * eased + this.start;            if (this.options.step) {                this.options.step.call(this.elem, this.now, this);            }            if (hooks && hooks.set) {                hooks.set(this);            } else {                Tween.propHooks._default.set(this);            }            return this;        }    };    Tween.prototype.init.prototype = Tween.prototype;    Tween.propHooks = {        _default: {            get: function (tween) {                var result;                if (tween.elem[tween.prop] != null &&                    (!tween.elem.style || tween.elem.style[tween.prop] == null)) {                    return tween.elem[tween.prop];                }                // Passing an empty string as a 3rd parameter to .css will automatically                // attempt a parseFloat and fallback to a string if the parse fails.                // Simple values such as "10px" are parsed to Float;                // complex values such as "rotate(1rad)" are returned as-is.                result = jQuery.css(tween.elem, tween.prop, "");                // Empty strings, null, undefined and "auto" are converted to 0.                return !result || result === "auto" ? 0 : result;            },            set: function (tween) {                // Use step hook for back compat.                // Use cssHook if its there.                // Use .style if available and use plain properties where available.                if (jQuery.fx.step[tween.prop]) {                    jQuery.fx.step[tween.prop](tween);                } else if (tween.elem.style && ( tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop] )) {                    jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);                } else {                    tween.elem[tween.prop] = tween.now;                }            }        }    };// Support: IE9// Panic based approach to setting things on disconnected nodes    Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {        set: function (tween) {            if (tween.elem.nodeType && tween.elem.parentNode) {                tween.elem[tween.prop] = tween.now;            }        }    };    jQuery.easing = {        linear: function (p) {            return p;        },        swing: function (p) {            return 0.5 - Math.cos(p * Math.PI) / 2;        }    };    jQuery.fx = Tween.prototype.init;// Back Compat <1.8 extension point    jQuery.fx.step = {};    var        fxNow, timerId,        rfxtypes = /^(?:toggle|show|hide)$/,        rfxnum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"),        rrun = /queueHooks$/,        animationPrefilters = [defaultPrefilter],        tweeners = {            "*": [function (prop, value) {                var tween = this.createTween(prop, value),                    target = tween.cur(),                    parts = rfxnum.exec(value),                    unit = parts && parts[3] || ( jQuery.cssNumber[prop] ? "" : "px" ),                // Starting value computation is required for potential unit mismatches                    start = ( jQuery.cssNumber[prop] || unit !== "px" && +target ) &&                        rfxnum.exec(jQuery.css(tween.elem, prop)),                    scale = 1,                    maxIterations = 20;                if (start && start[3] !== unit) {                    // Trust units reported by jQuery.css                    unit = unit || start[3];                    // Make sure we update the tween properties later on                    parts = parts || [];                    // Iteratively approximate from a nonzero starting point                    start = +target || 1;                    do {                        // If previous iteration zeroed out, double until we get *something*.                        // Use string for doubling so we don't accidentally see scale as unchanged below                        scale = scale || ".5";                        // Adjust and apply                        start = start / scale;                        jQuery.style(tween.elem, prop, start + unit);                        // Update scale, tolerating zero or NaN from tween.cur(),                        // break the loop if scale is unchanged or perfect, or if we've just had enough                    } while (scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations);                }                // Update tween properties                if (parts) {                    start = tween.start = +start || +target || 0;                    tween.unit = unit;                    // If a +=/-= token was provided, we're doing a relative animation                    tween.end = parts[1] ?                    start + ( parts[1] + 1 ) * parts[2] :                        +parts[2];                }                return tween;            }]        };// Animations created synchronously will run synchronously    function createFxNow() {        setTimeout(function () {            fxNow = undefined;        });        return ( fxNow = jQuery.now() );    }// Generate parameters to create a standard animation    function genFx(type, includeWidth) {        var which,            i = 0,            attrs = {height: type};        // If we include width, step value is 1 to do all cssExpand values,        // otherwise step value is 2 to skip over Left and Right        includeWidth = includeWidth ? 1 : 0;        for (; i < 4; i += 2 - includeWidth) {            which = cssExpand[i];            attrs["margin" + which] = attrs["padding" + which] = type;        }        if (includeWidth) {            attrs.opacity = attrs.width = type;        }        return attrs;    }    function createTween(value, prop, animation) {        var tween,            collection = ( tweeners[prop] || [] ).concat(tweeners["*"]),            index = 0,            length = collection.length;        for (; index < length; index++) {            if ((tween = collection[index].call(animation, prop, value))) {                // We're done with this property                return tween;            }        }    }    function defaultPrefilter(elem, props, opts) {        /* jshint validthis: true */        var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,            anim = this,            orig = {},            style = elem.style,            hidden = elem.nodeType && isHidden(elem),            dataShow = data_priv.get(elem, "fxshow");        // Handle queue: false promises        if (!opts.queue) {            hooks = jQuery._queueHooks(elem, "fx");            if (hooks.unqueued == null) {                hooks.unqueued = 0;                oldfire = hooks.empty.fire;                hooks.empty.fire = function () {                    if (!hooks.unqueued) {                        oldfire();                    }                };            }            hooks.unqueued++;            anim.always(function () {                // Ensure the complete handler is called before this completes                anim.always(function () {                    hooks.unqueued--;                    if (!jQuery.queue(elem, "fx").length) {                        hooks.empty.fire();                    }                });            });        }        // Height/width overflow pass        if (elem.nodeType === 1 && ( "height" in props || "width" in props )) {            // Make sure that nothing sneaks out            // Record all 3 overflow attributes because IE9-10 do not            // change the overflow attribute when overflowX and            // overflowY are set to the same value            opts.overflow = [style.overflow, style.overflowX, style.overflowY];            // Set display property to inline-block for height/width            // animations on inline elements that are having width/height animated            display = jQuery.css(elem, "display");            // Test default display if display is currently "none"            checkDisplay = display === "none" ?            data_priv.get(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;            if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {                style.display = "inline-block";            }        }        if (opts.overflow) {            style.overflow = "hidden";            anim.always(function () {                style.overflow = opts.overflow[0];                style.overflowX = opts.overflow[1];                style.overflowY = opts.overflow[2];            });        }        // show/hide pass        for (prop in props) {            value = props[prop];            if (rfxtypes.exec(value)) {                delete props[prop];                toggle = toggle || value === "toggle";                if (value === ( hidden ? "hide" : "show" )) {                    // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden                    if (value === "show" && dataShow && dataShow[prop] !== undefined) {                        hidden = true;                    } else {                        continue;                    }                }                orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);                // Any non-fx value stops us from restoring the original display value            } else {                display = undefined;            }        }        if (!jQuery.isEmptyObject(orig)) {            if (dataShow) {                if ("hidden" in dataShow) {                    hidden = dataShow.hidden;                }            } else {                dataShow = data_priv.access(elem, "fxshow", {});            }            // Store state if its toggle - enables .stop().toggle() to "reverse"            if (toggle) {                dataShow.hidden = !hidden;            }            if (hidden) {                jQuery(elem).show();            } else {                anim.done(function () {                    jQuery(elem).hide();                });            }            anim.done(function () {                var prop;                data_priv.remove(elem, "fxshow");                for (prop in orig) {                    jQuery.style(elem, prop, orig[prop]);                }            });            for (prop in orig) {                tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);                if (!( prop in dataShow )) {                    dataShow[prop] = tween.start;                    if (hidden) {                        tween.end = tween.start;                        tween.start = prop === "width" || prop === "height" ? 1 : 0;                    }                }            }            // If this is a noop like .hide().hide(), restore an overwritten display value        } else if ((display === "none" ? defaultDisplay(elem.nodeName) : display) === "inline") {            style.display = display;        }    }    function propFilter(props, specialEasing) {        var index, name, easing, value, hooks;        // camelCase, specialEasing and expand cssHook pass        for (index in props) {            name = jQuery.camelCase(index);            easing = specialEasing[name];            value = props[index];            if (jQuery.isArray(value)) {                easing = value[1];                value = props[index] = value[0];            }            if (index !== name) {                props[name] = value;                delete props[index];            }            hooks = jQuery.cssHooks[name];            if (hooks && "expand" in hooks) {                value = hooks.expand(value);                delete props[name];                // Not quite $.extend, this won't overwrite existing keys.                // Reusing 'index' because we have the correct "name"                for (index in value) {                    if (!( index in props )) {                        props[index] = value[index];                        specialEasing[index] = easing;                    }                }            } else {                specialEasing[name] = easing;            }        }    }    function Animation(elem, properties, options) {        var result,            stopped,            index = 0,            length = animationPrefilters.length,            deferred = jQuery.Deferred().always(function () {                // Don't match elem in the :animated selector                delete tick.elem;            }),            tick = function () {                if (stopped) {                    return false;                }                var currentTime = fxNow || createFxNow(),                    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),                // Support: Android 2.3                // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)                    temp = remaining / animation.duration || 0,                    percent = 1 - temp,                    index = 0,                    length = animation.tweens.length;                for (; index < length; index++) {                    animation.tweens[index].run(percent);                }                deferred.notifyWith(elem, [animation, percent, remaining]);                if (percent < 1 && length) {                    return remaining;                } else {                    deferred.resolveWith(elem, [animation]);                    return false;                }            },            animation = deferred.promise({                elem: elem,                props: jQuery.extend({}, properties),                opts: jQuery.extend(true, {specialEasing: {}}, options),                originalProperties: properties,                originalOptions: options,                startTime: fxNow || createFxNow(),                duration: options.duration,                tweens: [],                createTween: function (prop, end) {                    var tween = jQuery.Tween(elem, animation.opts, prop, end,                        animation.opts.specialEasing[prop] || animation.opts.easing);                    animation.tweens.push(tween);                    return tween;                },                stop: function (gotoEnd) {                    var index = 0,                    // If we are going to the end, we want to run all the tweens                    // otherwise we skip this part                        length = gotoEnd ? animation.tweens.length : 0;                    if (stopped) {                        return this;                    }                    stopped = true;                    for (; index < length; index++) {                        animation.tweens[index].run(1);                    }                    // Resolve when we played the last frame; otherwise, reject                    if (gotoEnd) {                        deferred.resolveWith(elem, [animation, gotoEnd]);                    } else {                        deferred.rejectWith(elem, [animation, gotoEnd]);                    }                    return this;                }            }),            props = animation.props;        propFilter(props, animation.opts.specialEasing);        for (; index < length; index++) {            result = animationPrefilters[index].call(animation, elem, props, animation.opts);            if (result) {                return result;            }        }        jQuery.map(props, createTween, animation);        if (jQuery.isFunction(animation.opts.start)) {            animation.opts.start.call(elem, animation);        }        jQuery.fx.timer(            jQuery.extend(tick, {                elem: elem,                anim: animation,                queue: animation.opts.queue            })        );        // attach callbacks from options        return animation.progress(animation.opts.progress)            .done(animation.opts.done, animation.opts.complete)            .fail(animation.opts.fail)            .always(animation.opts.always);    }    jQuery.Animation = jQuery.extend(Animation, {        tweener: function (props, callback) {            if (jQuery.isFunction(props)) {                callback = props;                props = ["*"];            } else {                props = props.split(" ");            }            var prop,                index = 0,                length = props.length;            for (; index < length; index++) {                prop = props[index];                tweeners[prop] = tweeners[prop] || [];                tweeners[prop].unshift(callback);            }        },        prefilter: function (callback, prepend) {            if (prepend) {                animationPrefilters.unshift(callback);            } else {                animationPrefilters.push(callback);            }        }    });    jQuery.speed = function (speed, easing, fn) {        var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {            complete: fn || !fn && easing ||            jQuery.isFunction(speed) && speed,            duration: speed,            easing: fn && easing || easing && !jQuery.isFunction(easing) && easing        };        opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :            opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;        // Normalize opt.queue - true/undefined/null -> "fx"        if (opt.queue == null || opt.queue === true) {            opt.queue = "fx";        }        // Queueing        opt.old = opt.complete;        opt.complete = function () {            if (jQuery.isFunction(opt.old)) {                opt.old.call(this);            }            if (opt.queue) {                jQuery.dequeue(this, opt.queue);            }        };        return opt;    };    jQuery.fn.extend({        fadeTo: function (speed, to, easing, callback) {            // Show any hidden elements after setting opacity to 0            return this.filter(isHidden).css("opacity", 0).show()                // Animate to the value specified                .end().animate({opacity: to}, speed, easing, callback);        },        animate: function (prop, speed, easing, callback) {            var empty = jQuery.isEmptyObject(prop),                optall = jQuery.speed(speed, easing, callback),                doAnimation = function () {                    // Operate on a copy of prop so per-property easing won't be lost                    var anim = Animation(this, jQuery.extend({}, prop), optall);                    // Empty animations, or finishing resolves immediately                    if (empty || data_priv.get(this, "finish")) {                        anim.stop(true);                    }                };            doAnimation.finish = doAnimation;            return empty || optall.queue === false ?                this.each(doAnimation) :                this.queue(optall.queue, doAnimation);        },        stop: function (type, clearQueue, gotoEnd) {            var stopQueue = function (hooks) {                var stop = hooks.stop;                delete hooks.stop;                stop(gotoEnd);            };            if (typeof type !== "string") {                gotoEnd = clearQueue;                clearQueue = type;                type = undefined;            }            if (clearQueue && type !== false) {                this.queue(type || "fx", []);            }            return this.each(function () {                var dequeue = true,                    index = type != null && type + "queueHooks",                    timers = jQuery.timers,                    data = data_priv.get(this);                if (index) {                    if (data[index] && data[index].stop) {                        stopQueue(data[index]);                    }                } else {                    for (index in data) {                        if (data[index] && data[index].stop && rrun.test(index)) {                            stopQueue(data[index]);                        }                    }                }                for (index = timers.length; index--;) {                    if (timers[index].elem === this && (type == null || timers[index].queue === type)) {                        timers[index].anim.stop(gotoEnd);                        dequeue = false;                        timers.splice(index, 1);                    }                }                // Start the next in the queue if the last step wasn't forced.                // Timers currently will call their complete callbacks, which                // will dequeue but only if they were gotoEnd.                if (dequeue || !gotoEnd) {                    jQuery.dequeue(this, type);                }            });        },        finish: function (type) {            if (type !== false) {                type = type || "fx";            }            return this.each(function () {                var index,                    data = data_priv.get(this),                    queue = data[type + "queue"],                    hooks = data[type + "queueHooks"],                    timers = jQuery.timers,                    length = queue ? queue.length : 0;                // Enable finishing flag on private data                data.finish = true;                // Empty the queue first                jQuery.queue(this, type, []);                if (hooks && hooks.stop) {                    hooks.stop.call(this, true);                }                // Look for any active animations, and finish them                for (index = timers.length; index--;) {                    if (timers[index].elem === this && timers[index].queue === type) {                        timers[index].anim.stop(true);                        timers.splice(index, 1);                    }                }                // Look for any animations in the old queue and finish them                for (index = 0; index < length; index++) {                    if (queue[index] && queue[index].finish) {                        queue[index].finish.call(this);                    }                }                // Turn off finishing flag                delete data.finish;            });        }    });    jQuery.each(["toggle", "show", "hide"], function (i, name) {        var cssFn = jQuery.fn[name];        jQuery.fn[name] = function (speed, easing, callback) {            return speed == null || typeof speed === "boolean" ?                cssFn.apply(this, arguments) :                this.animate(genFx(name, true), speed, easing, callback);        };    });// Generate shortcuts for custom animations    jQuery.each({        slideDown: genFx("show"),        slideUp: genFx("hide"),        slideToggle: genFx("toggle"),        fadeIn: {opacity: "show"},        fadeOut: {opacity: "hide"},        fadeToggle: {opacity: "toggle"}    }, function (name, props) {        jQuery.fn[name] = function (speed, easing, callback) {            return this.animate(props, speed, easing, callback);        };    });    jQuery.timers = [];    jQuery.fx.tick = function () {        var timer,            i = 0,            timers = jQuery.timers;        fxNow = jQuery.now();        for (; i < timers.length; i++) {            timer = timers[i];            // Checks the timer has not already been removed            if (!timer() && timers[i] === timer) {                timers.splice(i--, 1);            }        }        if (!timers.length) {            jQuery.fx.stop();        }        fxNow = undefined;    };    jQuery.fx.timer = function (timer) {        jQuery.timers.push(timer);        if (timer()) {            jQuery.fx.start();        } else {            jQuery.timers.pop();        }    };    jQuery.fx.interval = 13;    jQuery.fx.start = function () {        if (!timerId) {            timerId = setInterval(jQuery.fx.tick, jQuery.fx.interval);        }    };    jQuery.fx.stop = function () {        clearInterval(timerId);        timerId = null;    };    jQuery.fx.speeds = {        slow: 600,        fast: 200,        // Default speed        _default: 400    };// Based off of the plugin by Clint Helfers, with permission.// http://blindsignals.com/index.php/2009/07/jquery-delay/    jQuery.fn.delay = function (time, type) {        time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;        type = type || "fx";        return this.queue(type, function (next, hooks) {            var timeout = setTimeout(next, time);            hooks.stop = function () {                clearTimeout(timeout);            };        });    };    (function () {        var input = document.createElement("input"),            select = document.createElement("select"),            opt = select.appendChild(document.createElement("option"));        input.type = "checkbox";        // Support: iOS<=5.1, Android<=4.2+        // Default value for a checkbox should be "on"        support.checkOn = input.value !== "";        // Support: IE<=11+        // Must access selectedIndex to make default options select        support.optSelected = opt.selected;        // Support: Android<=2.3        // Options inside disabled selects are incorrectly marked as disabled        select.disabled = true;        support.optDisabled = !opt.disabled;        // Support: IE<=11+        // An input loses its value after becoming a radio        input = document.createElement("input");        input.value = "t";        input.type = "radio";        support.radioValue = input.value === "t";    })();    var nodeHook, boolHook,        attrHandle = jQuery.expr.attrHandle;    jQuery.fn.extend({        attr: function (name, value) {            return access(this, jQuery.attr, name, value, arguments.length > 1);        },        removeAttr: function (name) {            return this.each(function () {                jQuery.removeAttr(this, name);            });        }    });    jQuery.extend({        attr: function (elem, name, value) {            var hooks, ret,                nType = elem.nodeType;            // don't get/set attributes on text, comment and attribute nodes            if (!elem || nType === 3 || nType === 8 || nType === 2) {                return;            }            // Fallback to prop when attributes are not supported            if (typeof elem.getAttribute === strundefined) {                return jQuery.prop(elem, name, value);            }            // All attributes are lowercase            // Grab necessary hook if one is defined            if (nType !== 1 || !jQuery.isXMLDoc(elem)) {                name = name.toLowerCase();                hooks = jQuery.attrHooks[name] ||                    ( jQuery.expr.match.bool.test(name) ? boolHook : nodeHook );            }            if (value !== undefined) {                if (value === null) {                    jQuery.removeAttr(elem, name);                } else if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {                    return ret;                } else {                    elem.setAttribute(name, value + "");                    return value;                }            } else if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {                return ret;            } else {                ret = jQuery.find.attr(elem, name);                // Non-existent attributes return null, we normalize to undefined                return ret == null ?                    undefined :                    ret;            }        },        removeAttr: function (elem, value) {            var name, propName,                i = 0,                attrNames = value && value.match(rnotwhite);            if (attrNames && elem.nodeType === 1) {                while ((name = attrNames[i++])) {                    propName = jQuery.propFix[name] || name;                    // Boolean attributes get special treatment (#10870)                    if (jQuery.expr.match.bool.test(name)) {                        // Set corresponding property to false                        elem[propName] = false;                    }                    elem.removeAttribute(name);                }            }        },        attrHooks: {            type: {                set: function (elem, value) {                    if (!support.radioValue && value === "radio" &&                        jQuery.nodeName(elem, "input")) {                        var val = elem.value;                        elem.setAttribute("type", value);                        if (val) {                            elem.value = val;                        }                        return value;                    }                }            }        }    });// Hooks for boolean attributes    boolHook = {        set: function (elem, value, name) {            if (value === false) {                // Remove boolean attributes when set to false                jQuery.removeAttr(elem, name);            } else {                elem.setAttribute(name, name);            }            return name;        }    };    jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {        var getter = attrHandle[name] || jQuery.find.attr;        attrHandle[name] = function (elem, name, isXML) {            var ret, handle;            if (!isXML) {                // Avoid an infinite loop by temporarily removing this function from the getter                handle = attrHandle[name];                attrHandle[name] = ret;                ret = getter(elem, name, isXML) != null ?                    name.toLowerCase() :                    null;                attrHandle[name] = handle;            }            return ret;        };    });    var rfocusable = /^(?:input|select|textarea|button)$/i;    jQuery.fn.extend({        prop: function (name, value) {            return access(this, jQuery.prop, name, value, arguments.length > 1);        },        removeProp: function (name) {            return this.each(function () {                delete this[jQuery.propFix[name] || name];            });        }    });    jQuery.extend({        propFix: {            "for": "htmlFor",            "class": "className"        },        prop: function (elem, name, value) {            var ret, hooks, notxml,                nType = elem.nodeType;            // Don't get/set properties on text, comment and attribute nodes            if (!elem || nType === 3 || nType === 8 || nType === 2) {                return;            }            notxml = nType !== 1 || !jQuery.isXMLDoc(elem);            if (notxml) {                // Fix name and attach hooks                name = jQuery.propFix[name] || name;                hooks = jQuery.propHooks[name];            }            if (value !== undefined) {                return hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined ?                    ret :                    ( elem[name] = value );            } else {                return hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null ?                    ret :                    elem[name];            }        },        propHooks: {            tabIndex: {                get: function (elem) {                    return elem.hasAttribute("tabindex") || rfocusable.test(elem.nodeName) || elem.href ?                        elem.tabIndex :                        -1;                }            }        }    });    if (!support.optSelected) {        jQuery.propHooks.selected = {            get: function (elem) {                var parent = elem.parentNode;                if (parent && parent.parentNode) {                    parent.parentNode.selectedIndex;                }                return null;            }        };    }    jQuery.each([        "tabIndex",        "readOnly",        "maxLength",        "cellSpacing",        "cellPadding",        "rowSpan",        "colSpan",        "useMap",        "frameBorder",        "contentEditable"    ], function () {        jQuery.propFix[this.toLowerCase()] = this;    });    var rclass = /[\t\r\n\f]/g;    jQuery.fn.extend({        addClass: function (value) {            var classes, elem, cur, clazz, j, finalValue,                proceed = typeof value === "string" && value,                i = 0,                len = this.length;            if (jQuery.isFunction(value)) {                return this.each(function (j) {                    jQuery(this).addClass(value.call(this, j, this.className));                });            }            if (proceed) {                // The disjunction here is for better compressibility (see removeClass)                classes = ( value || "" ).match(rnotwhite) || [];                for (; i < len; i++) {                    elem = this[i];                    cur = elem.nodeType === 1 && ( elem.className ?                                ( " " + elem.className + " " ).replace(rclass, " ") :                                " "                        );                    if (cur) {                        j = 0;                        while ((clazz = classes[j++])) {                            if (cur.indexOf(" " + clazz + " ") < 0) {                                cur += clazz + " ";                            }                        }                        // only assign if different to avoid unneeded rendering.                        finalValue = jQuery.trim(cur);                        if (elem.className !== finalValue) {                            elem.className = finalValue;                        }                    }                }            }            return this;        },        removeClass: function (value) {            var classes, elem, cur, clazz, j, finalValue,                proceed = arguments.length === 0 || typeof value === "string" && value,                i = 0,                len = this.length;            if (jQuery.isFunction(value)) {                return this.each(function (j) {                    jQuery(this).removeClass(value.call(this, j, this.className));                });            }            if (proceed) {                classes = ( value || "" ).match(rnotwhite) || [];                for (; i < len; i++) {                    elem = this[i];                    // This expression is here for better compressibility (see addClass)                    cur = elem.nodeType === 1 && ( elem.className ?                                ( " " + elem.className + " " ).replace(rclass, " ") :                                ""                        );                    if (cur) {                        j = 0;                        while ((clazz = classes[j++])) {                            // Remove *all* instances                            while (cur.indexOf(" " + clazz + " ") >= 0) {                                cur = cur.replace(" " + clazz + " ", " ");                            }                        }                        // Only assign if different to avoid unneeded rendering.                        finalValue = value ? jQuery.trim(cur) : "";                        if (elem.className !== finalValue) {                            elem.className = finalValue;                        }                    }                }            }            return this;        },        toggleClass: function (value, stateVal) {            var type = typeof value;            if (typeof stateVal === "boolean" && type === "string") {                return stateVal ? this.addClass(value) : this.removeClass(value);            }            if (jQuery.isFunction(value)) {                return this.each(function (i) {                    jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal);                });            }            return this.each(function () {                if (type === "string") {                    // Toggle individual class names                    var className,                        i = 0,                        self = jQuery(this),                        classNames = value.match(rnotwhite) || [];                    while ((className = classNames[i++])) {                        // Check each className given, space separated list                        if (self.hasClass(className)) {                            self.removeClass(className);                        } else {                            self.addClass(className);                        }                    }                    // Toggle whole class name                } else if (type === strundefined || type === "boolean") {                    if (this.className) {                        // store className if set                        data_priv.set(this, "__className__", this.className);                    }                    // If the element has a class name or if we're passed `false`,                    // then remove the whole classname (if there was one, the above saved it).                    // Otherwise bring back whatever was previously saved (if anything),                    // falling back to the empty string if nothing was stored.                    this.className = this.className || value === false ? "" : data_priv.get(this, "__className__") || "";                }            });        },        hasClass: function (selector) {            var className = " " + selector + " ",                i = 0,                l = this.length;            for (; i < l; i++) {                if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) >= 0) {                    return true;                }            }            return false;        }    });    var rreturn = /\r/g;    jQuery.fn.extend({        val: function (value) {            var hooks, ret, isFunction,                elem = this[0];            if (!arguments.length) {                if (elem) {                    hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];                    if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {                        return ret;                    }                    ret = elem.value;                    return typeof ret === "string" ?                        // Handle most common string cases                        ret.replace(rreturn, "") :                        // Handle cases where value is null/undef or number                        ret == null ? "" : ret;                }                return;            }            isFunction = jQuery.isFunction(value);            return this.each(function (i) {                var val;                if (this.nodeType !== 1) {                    return;                }                if (isFunction) {                    val = value.call(this, i, jQuery(this).val());                } else {                    val = value;                }                // Treat null/undefined as ""; convert numbers to string                if (val == null) {                    val = "";                } else if (typeof val === "number") {                    val += "";                } else if (jQuery.isArray(val)) {                    val = jQuery.map(val, function (value) {                        return value == null ? "" : value + "";                    });                }                hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];                // If set returns undefined, fall back to normal setting                if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {                    this.value = val;                }            });        }    });    jQuery.extend({        valHooks: {            option: {                get: function (elem) {                    var val = jQuery.find.attr(elem, "value");                    return val != null ?                        val :                        // Support: IE10-11+                        // option.text throws exceptions (#14686, #14858)                        jQuery.trim(jQuery.text(elem));                }            },            select: {                get: function (elem) {                    var value, option,                        options = elem.options,                        index = elem.selectedIndex,                        one = elem.type === "select-one" || index < 0,                        values = one ? null : [],                        max = one ? index + 1 : options.length,                        i = index < 0 ?                            max :                            one ? index : 0;                    // Loop through all the selected options                    for (; i < max; i++) {                        option = options[i];                        // IE6-9 doesn't update selected after form reset (#2551)                        if (( option.selected || i === index ) &&                                // Don't return options that are disabled or in a disabled optgroup                            ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&                            ( !option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup") )) {                            // Get the specific value for the option                            value = jQuery(option).val();                            // We don't need an array for one selects                            if (one) {                                return value;                            }                            // Multi-Selects return an array                            values.push(value);                        }                    }                    return values;                },                set: function (elem, value) {                    var optionSet, option,                        options = elem.options,                        values = jQuery.makeArray(value),                        i = options.length;                    while (i--) {                        option = options[i];                        if ((option.selected = jQuery.inArray(option.value, values) >= 0)) {                            optionSet = true;                        }                    }                    // Force browsers to behave consistently when non-matching value is set                    if (!optionSet) {                        elem.selectedIndex = -1;                    }                    return values;                }            }        }    });// Radios and checkboxes getter/setter    jQuery.each(["radio", "checkbox"], function () {        jQuery.valHooks[this] = {            set: function (elem, value) {                if (jQuery.isArray(value)) {                    return ( elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0 );                }            }        };        if (!support.checkOn) {            jQuery.valHooks[this].get = function (elem) {                return elem.getAttribute("value") === null ? "on" : elem.value;            };        }    });// Return jQuery for attributes-only inclusion    jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " +    "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +    "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {        // Handle event binding        jQuery.fn[name] = function (data, fn) {            return arguments.length > 0 ?                this.on(name, null, data, fn) :                this.trigger(name);        };    });    jQuery.fn.extend({        hover: function (fnOver, fnOut) {            return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);        },        bind: function (types, data, fn) {            return this.on(types, null, data, fn);        },        unbind: function (types, fn) {            return this.off(types, null, fn);        },        delegate: function (selector, types, data, fn) {            return this.on(types, selector, data, fn);        },        undelegate: function (selector, types, fn) {            // ( namespace ) or ( selector, types [, fn] )            return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);        }    });    var nonce = jQuery.now();    var rquery = (/\?/);// Support: Android 2.3// Workaround failure to string-cast null input    jQuery.parseJSON = function (data) {        return JSON.parse(data + "");    };// Cross-browser xml parsing    jQuery.parseXML = function (data) {        var xml, tmp;        if (!data || typeof data !== "string") {            return null;        }        // Support: IE9        try {            tmp = new DOMParser();            xml = tmp.parseFromString(data, "text/xml");        } catch (e) {            xml = undefined;        }        if (!xml || xml.getElementsByTagName("parsererror").length) {            jQuery.error("Invalid XML: " + data);        }        return xml;    };    var        rhash = /#.*$/,        rts = /([?&])_=[^&]*/,        rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,    // #7653, #8125, #8152: local protocol detection        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,        rnoContent = /^(?:GET|HEAD)$/,        rprotocol = /^\/\//,        rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,    /* Prefilters     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)     * 2) These are called:     *    - BEFORE asking for a transport     *    - AFTER param serialization (s.data is a string if s.processData is true)     * 3) key is the dataType     * 4) the catchall symbol "*" can be used     * 5) execution will start with transport dataType and THEN continue down to "*" if needed     */        prefilters = {},    /* Transports bindings     * 1) key is the dataType     * 2) the catchall symbol "*" can be used     * 3) selection will start with transport dataType and THEN go to "*" if needed     */        transports = {},    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression        allTypes = "*/".concat("*"),    // Document location        ajaxLocation = window.location.href,    // Segment location into parts        ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [];// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport    function addToPrefiltersOrTransports(structure) {        // dataTypeExpression is optional and defaults to "*"        return function (dataTypeExpression, func) {            if (typeof dataTypeExpression !== "string") {                func = dataTypeExpression;                dataTypeExpression = "*";            }            var dataType,                i = 0,                dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];            if (jQuery.isFunction(func)) {                // For each dataType in the dataTypeExpression                while ((dataType = dataTypes[i++])) {                    // Prepend if requested                    if (dataType[0] === "+") {                        dataType = dataType.slice(1) || "*";                        (structure[dataType] = structure[dataType] || []).unshift(func);                        // Otherwise append                    } else {                        (structure[dataType] = structure[dataType] || []).push(func);                    }                }            }        };    }// Base inspection function for prefilters and transports    function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {        var inspected = {},            seekingTransport = ( structure === transports );        function inspect(dataType) {            var selected;            inspected[dataType] = true;            jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {                var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);                if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {                    options.dataTypes.unshift(dataTypeOrTransport);                    inspect(dataTypeOrTransport);                    return false;                } else if (seekingTransport) {                    return !( selected = dataTypeOrTransport );                }            });            return selected;        }        return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");    }// A special extend for ajax options// that takes "flat" options (not to be deep extended)// Fixes #9887    function ajaxExtend(target, src) {        var key, deep,            flatOptions = jQuery.ajaxSettings.flatOptions || {};        for (key in src) {            if (src[key] !== undefined) {                ( flatOptions[key] ? target : ( deep || (deep = {}) ) )[key] = src[key];            }        }        if (deep) {            jQuery.extend(true, target, deep);        }        return target;    }    /* Handles responses to an ajax request:     * - finds the right dataType (mediates between content-type and expected dataType)     * - returns the corresponding response     */    function ajaxHandleResponses(s, jqXHR, responses) {        var ct, type, finalDataType, firstDataType,            contents = s.contents,            dataTypes = s.dataTypes;        // Remove auto dataType and get content-type in the process        while (dataTypes[0] === "*") {            dataTypes.shift();            if (ct === undefined) {                ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");            }        }        // Check if we're dealing with a known content-type        if (ct) {            for (type in contents) {                if (contents[type] && contents[type].test(ct)) {                    dataTypes.unshift(type);                    break;                }            }        }        // Check to see if we have a response for the expected dataType        if (dataTypes[0] in responses) {            finalDataType = dataTypes[0];        } else {            // Try convertible dataTypes            for (type in responses) {                if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {                    finalDataType = type;                    break;                }                if (!firstDataType) {                    firstDataType = type;                }            }            // Or just use first one            finalDataType = finalDataType || firstDataType;        }        // If we found a dataType        // We add the dataType to the list if needed        // and return the corresponding response        if (finalDataType) {            if (finalDataType !== dataTypes[0]) {                dataTypes.unshift(finalDataType);            }            return responses[finalDataType];        }    }    /* Chain conversions given the request and the original response     * Also sets the responseXXX fields on the jqXHR instance     */    function ajaxConvert(s, response, jqXHR, isSuccess) {        var conv2, current, conv, tmp, prev,            converters = {},        // Work with a copy of dataTypes in case we need to modify it for conversion            dataTypes = s.dataTypes.slice();        // Create converters map with lowercased keys        if (dataTypes[1]) {            for (conv in s.converters) {                converters[conv.toLowerCase()] = s.converters[conv];            }        }        current = dataTypes.shift();        // Convert to each sequential dataType        while (current) {            if (s.responseFields[current]) {                jqXHR[s.responseFields[current]] = response;            }            // Apply the dataFilter if provided            if (!prev && isSuccess && s.dataFilter) {                response = s.dataFilter(response, s.dataType);            }            prev = current;            current = dataTypes.shift();            if (current) {                // There's only work to do if current dataType is non-auto                if (current === "*") {                    current = prev;                    // Convert response if prev dataType is non-auto and differs from current                } else if (prev !== "*" && prev !== current) {                    // Seek a direct converter                    conv = converters[prev + " " + current] || converters["* " + current];                    // If none found, seek a pair                    if (!conv) {                        for (conv2 in converters) {                            // If conv2 outputs current                            tmp = conv2.split(" ");                            if (tmp[1] === current) {                                // If prev can be converted to accepted input                                conv = converters[prev + " " + tmp[0]] ||                                    converters["* " + tmp[0]];                                if (conv) {                                    // Condense equivalence converters                                    if (conv === true) {                                        conv = converters[conv2];                                        // Otherwise, insert the intermediate dataType                                    } else if (converters[conv2] !== true) {                                        current = tmp[0];                                        dataTypes.unshift(tmp[1]);                                    }                                    break;                                }                            }                        }                    }                    // Apply converter (if not an equivalence)                    if (conv !== true) {                        // Unless errors are allowed to bubble, catch and return them                        if (conv && s["throws"]) {                            response = conv(response);                        } else {                            try {                                response = conv(response);                            } catch (e) {                                return {                                    state: "parsererror",                                    error: conv ? e : "No conversion from " + prev + " to " + current                                };                            }                        }                    }                }            }        }        return {state: "success", data: response};    }    jQuery.extend({        // Counter for holding the number of active queries        active: 0,        // Last-Modified header cache for next request        lastModified: {},        etag: {},        ajaxSettings: {            url: ajaxLocation,            type: "GET",            isLocal: rlocalProtocol.test(ajaxLocParts[1]),            global: true,            processData: true,            async: true,            contentType: "application/x-www-form-urlencoded; charset=UTF-8",            /*             timeout: 0,             data: null,             dataType: null,             username: null,             password: null,             cache: null,             throws: false,             traditional: false,             headers: {},             */            accepts: {                "*": allTypes,                text: "text/plain",                html: "text/html",                xml: "application/xml, text/xml",                json: "application/json, text/javascript"            },            contents: {                xml: /xml/,                html: /html/,                json: /json/            },            responseFields: {                xml: "responseXML",                text: "responseText",                json: "responseJSON"            },            // Data converters            // Keys separate source (or catchall "*") and destination types with a single space            converters: {                // Convert anything to text                "* text": String,                // Text to html (true = no transformation)                "text html": true,                // Evaluate text as a json expression                "text json": jQuery.parseJSON,                // Parse text as xml                "text xml": jQuery.parseXML            },            // For options that shouldn't be deep extended:            // you can add your own custom options here if            // and when you create one that shouldn't be            // deep extended (see ajaxExtend)            flatOptions: {                url: true,                context: true            }        },        // Creates a full fledged settings object into target        // with both ajaxSettings and settings fields.        // If target is omitted, writes into ajaxSettings.        ajaxSetup: function (target, settings) {            return settings ?                // Building a settings object                ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :                // Extending ajaxSettings                ajaxExtend(jQuery.ajaxSettings, target);        },        ajaxPrefilter: addToPrefiltersOrTransports(prefilters),        ajaxTransport: addToPrefiltersOrTransports(transports),        // Main method        ajax: function (url, options) {            // If url is an object, simulate pre-1.5 signature            if (typeof url === "object") {                options = url;                url = undefined;            }            // Force options to be an object            options = options || {};            var transport,            // URL without anti-cache param                cacheURL,            // Response headers                responseHeadersString,                responseHeaders,            // timeout handle                timeoutTimer,            // Cross-domain detection vars                parts,            // To know if global events are to be dispatched                fireGlobals,            // Loop variable                i,            // Create the final options object                s = jQuery.ajaxSetup({}, options),            // Callbacks context                callbackContext = s.context || s,            // Context for global events is callbackContext if it is a DOM node or jQuery collection                globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?                    jQuery(callbackContext) :                    jQuery.event,            // Deferreds                deferred = jQuery.Deferred(),                completeDeferred = jQuery.Callbacks("once memory"),            // Status-dependent callbacks                statusCode = s.statusCode || {},            // Headers (they are sent all at once)                requestHeaders = {},                requestHeadersNames = {},            // The jqXHR state                state = 0,            // Default abort message                strAbort = "canceled",            // Fake xhr                jqXHR = {                    readyState: 0,                    // Builds headers hashtable if needed                    getResponseHeader: function (key) {                        var match;                        if (state === 2) {                            if (!responseHeaders) {                                responseHeaders = {};                                while ((match = rheaders.exec(responseHeadersString))) {                                    responseHeaders[match[1].toLowerCase()] = match[2];                                }                            }                            match = responseHeaders[key.toLowerCase()];                        }                        return match == null ? null : match;                    },                    // Raw string                    getAllResponseHeaders: function () {                        return state === 2 ? responseHeadersString : null;                    },                    // Caches the header                    setRequestHeader: function (name, value) {                        var lname = name.toLowerCase();                        if (!state) {                            name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;                            requestHeaders[name] = value;                        }                        return this;                    },                    // Overrides response content-type header                    overrideMimeType: function (type) {                        if (!state) {                            s.mimeType = type;                        }                        return this;                    },                    // Status-dependent callbacks                    statusCode: function (map) {                        var code;                        if (map) {                            if (state < 2) {                                for (code in map) {                                    // Lazy-add the new callback in a way that preserves old ones                                    statusCode[code] = [statusCode[code], map[code]];                                }                            } else {                                // Execute the appropriate callbacks                                jqXHR.always(map[jqXHR.status]);                            }                        }                        return this;                    },                    // Cancel the request                    abort: function (statusText) {                        var finalText = statusText || strAbort;                        if (transport) {                            transport.abort(finalText);                        }                        done(0, finalText);                        return this;                    }                };            // Attach deferreds            deferred.promise(jqXHR).complete = completeDeferred.add;            jqXHR.success = jqXHR.done;            jqXHR.error = jqXHR.fail;            // Remove hash character (#7531: and string promotion)            // Add protocol if not provided (prefilters might expect it)            // Handle falsy url in the settings object (#10093: consistency with old signature)            // We also use the url parameter if available            s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace(rhash, "")                .replace(rprotocol, ajaxLocParts[1] + "//");            // Alias method option to type as per ticket #12004            s.type = options.method || options.type || s.method || s.type;            // Extract dataTypes list            s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];            // A cross-domain request is in order when we have a protocol:host:port mismatch            if (s.crossDomain == null) {                parts = rurl.exec(s.url.toLowerCase());                s.crossDomain = !!( parts &&                    ( parts[1] !== ajaxLocParts[1] || parts[2] !== ajaxLocParts[2] ||                    ( parts[3] || ( parts[1] === "http:" ? "80" : "443" ) ) !==                    ( ajaxLocParts[3] || ( ajaxLocParts[1] === "http:" ? "80" : "443" ) ) )                );            }            // Convert data if not already a string            if (s.data && s.processData && typeof s.data !== "string") {                s.data = jQuery.param(s.data, s.traditional);            }            // Apply prefilters            inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);            // If request was aborted inside a prefilter, stop there            if (state === 2) {                return jqXHR;            }            // We can fire global events as of now if asked to            // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)            fireGlobals = jQuery.event && s.global;            // Watch for a new set of requests            if (fireGlobals && jQuery.active++ === 0) {                jQuery.event.trigger("ajaxStart");            }            // Uppercase the type            s.type = s.type.toUpperCase();            // Determine if request has content            s.hasContent = !rnoContent.test(s.type);            // Save the URL in case we're toying with the If-Modified-Since            // and/or If-None-Match header later on            cacheURL = s.url;            // More options handling for requests with no content            if (!s.hasContent) {                // If data is available, append data to url                if (s.data) {                    cacheURL = ( s.url += ( rquery.test(cacheURL) ? "&" : "?" ) + s.data );                    // #9682: remove data so that it's not used in an eventual retry                    delete s.data;                }                // Add anti-cache in url if needed                if (s.cache === false) {                    s.url = rts.test(cacheURL) ?                        // If there is already a '_' parameter, set its value                        cacheURL.replace(rts, "$1_=" + nonce++) :                        // Otherwise add one to the end                    cacheURL + ( rquery.test(cacheURL) ? "&" : "?" ) + "_=" + nonce++;                }            }            // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.            if (s.ifModified) {                if (jQuery.lastModified[cacheURL]) {                    jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);                }                if (jQuery.etag[cacheURL]) {                    jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);                }            }            // Set the correct header, if data is being sent            if (s.data && s.hasContent && s.contentType !== false || options.contentType) {                jqXHR.setRequestHeader("Content-Type", s.contentType);            }            // Set the Accepts header for the server, depending on the dataType            jqXHR.setRequestHeader(                "Accept",                s.dataTypes[0] && s.accepts[s.dataTypes[0]] ?                s.accepts[s.dataTypes[0]] + ( s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :                    s.accepts["*"]            );            // Check for headers option            for (i in s.headers) {                jqXHR.setRequestHeader(i, s.headers[i]);            }            // Allow custom headers/mimetypes and early abort            if (s.beforeSend && ( s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2 )) {                // Abort if not done already and return                return jqXHR.abort();            }            // Aborting is no longer a cancellation            strAbort = "abort";            // Install callbacks on deferreds            for (i in {success: 1, error: 1, complete: 1}) {                jqXHR[i](s[i]);            }            // Get transport            transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);            // If no transport, we auto-abort            if (!transport) {                done(-1, "No Transport");            } else {                jqXHR.readyState = 1;                // Send global event                if (fireGlobals) {                    globalEventContext.trigger("ajaxSend", [jqXHR, s]);                }                // Timeout                if (s.async && s.timeout > 0) {                    timeoutTimer = setTimeout(function () {                        jqXHR.abort("timeout");                    }, s.timeout);                }                try {                    state = 1;                    transport.send(requestHeaders, done);                } catch (e) {                    // Propagate exception as error if not done                    if (state < 2) {                        done(-1, e);                        // Simply rethrow otherwise                    } else {                        throw e;                    }                }            }            // Callback for when everything is done            function done(status, nativeStatusText, responses, headers) {                var isSuccess, success, error, response, modified,                    statusText = nativeStatusText;                // Called once                if (state === 2) {                    return;                }                // State is "done" now                state = 2;                // Clear timeout if it exists                if (timeoutTimer) {                    clearTimeout(timeoutTimer);                }                // Dereference transport for early garbage collection                // (no matter how long the jqXHR object will be used)                transport = undefined;                // Cache response headers                responseHeadersString = headers || "";                // Set readyState                jqXHR.readyState = status > 0 ? 4 : 0;                // Determine if successful                isSuccess = status >= 200 && status < 300 || status === 304;                // Get response data                if (responses) {                    response = ajaxHandleResponses(s, jqXHR, responses);                }                // Convert no matter what (that way responseXXX fields are always set)                response = ajaxConvert(s, response, jqXHR, isSuccess);                // If successful, handle type chaining                if (isSuccess) {                    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.                    if (s.ifModified) {                        modified = jqXHR.getResponseHeader("Last-Modified");                        if (modified) {                            jQuery.lastModified[cacheURL] = modified;                        }                        modified = jqXHR.getResponseHeader("etag");                        if (modified) {                            jQuery.etag[cacheURL] = modified;                        }                    }                    // if no content                    if (status === 204 || s.type === "HEAD") {                        statusText = "nocontent";                        // if not modified                    } else if (status === 304) {                        statusText = "notmodified";                        // If we have data, let's convert it                    } else {                        statusText = response.state;                        success = response.data;                        error = response.error;                        isSuccess = !error;                    }                } else {                    // Extract error from statusText and normalize for non-aborts                    error = statusText;                    if (status || !statusText) {                        statusText = "error";                        if (status < 0) {                            status = 0;                        }                    }                }                // Set data for the fake xhr object                jqXHR.status = status;                jqXHR.statusText = ( nativeStatusText || statusText ) + "";                // Success/Error                if (isSuccess) {                    deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);                } else {                    deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);                }                // Status-dependent callbacks                jqXHR.statusCode(statusCode);                statusCode = undefined;                if (fireGlobals) {                    globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError",                        [jqXHR, s, isSuccess ? success : error]);                }                // Complete                completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);                if (fireGlobals) {                    globalEventContext.trigger("ajaxComplete", [jqXHR, s]);                    // Handle the global AJAX counter                    if (!( --jQuery.active )) {                        jQuery.event.trigger("ajaxStop");                    }                }            }            return jqXHR;        },        getJSON: function (url, data, callback) {            return jQuery.get(url, data, callback, "json");        },        getScript: function (url, callback) {            return jQuery.get(url, undefined, callback, "script");        }    });    jQuery.each(["get", "post"], function (i, method) {        jQuery[method] = function (url, data, callback, type) {            // Shift arguments if data argument was omitted            if (jQuery.isFunction(data)) {                type = type || callback;                callback = data;                data = undefined;            }            return jQuery.ajax({                url: url,                type: method,                dataType: type,                data: data,                success: callback            });        };    });    jQuery._evalUrl = function (url) {        return jQuery.ajax({            url: url,            type: "GET",            dataType: "script",            async: false,            global: false,            "throws": true        });    };    jQuery.fn.extend({        wrapAll: function (html) {            var wrap;            if (jQuery.isFunction(html)) {                return this.each(function (i) {                    jQuery(this).wrapAll(html.call(this, i));                });            }            if (this[0]) {                // The elements to wrap the target around                wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);                if (this[0].parentNode) {                    wrap.insertBefore(this[0]);                }                wrap.map(function () {                    var elem = this;                    while (elem.firstElementChild) {                        elem = elem.firstElementChild;                    }                    return elem;                }).append(this);            }            return this;        },        wrapInner: function (html) {            if (jQuery.isFunction(html)) {                return this.each(function (i) {                    jQuery(this).wrapInner(html.call(this, i));                });            }            return this.each(function () {                var self = jQuery(this),                    contents = self.contents();                if (contents.length) {                    contents.wrapAll(html);                } else {                    self.append(html);                }            });        },        wrap: function (html) {            var isFunction = jQuery.isFunction(html);            return this.each(function (i) {                jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);            });        },        unwrap: function () {            return this.parent().each(function () {                if (!jQuery.nodeName(this, "body")) {                    jQuery(this).replaceWith(this.childNodes);                }            }).end();        }    });    jQuery.expr.filters.hidden = function (elem) {        // Support: Opera <= 12.12        // Opera reports offsetWidths and offsetHeights less than zero on some elements        return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;    };    jQuery.expr.filters.visible = function (elem) {        return !jQuery.expr.filters.hidden(elem);    };    var r20 = /%20/g,        rbracket = /\[\]$/,        rCRLF = /\r?\n/g,        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,        rsubmittable = /^(?:input|select|textarea|keygen)/i;    function buildParams(prefix, obj, traditional, add) {        var name;        if (jQuery.isArray(obj)) {            // Serialize array item.            jQuery.each(obj, function (i, v) {                if (traditional || rbracket.test(prefix)) {                    // Treat each array item as a scalar.                    add(prefix, v);                } else {                    // Item is non-scalar (array or object), encode its numeric index.                    buildParams(prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add);                }            });        } else if (!traditional && jQuery.type(obj) === "object") {            // Serialize object item.            for (name in obj) {                buildParams(prefix + "[" + name + "]", obj[name], traditional, add);            }        } else {            // Serialize scalar item.            add(prefix, obj);        }    }// Serialize an array of form elements or a set of// key/values into a query string    jQuery.param = function (a, traditional) {        var prefix,            s = [],            add = function (key, value) {                // If value is a function, invoke it and return its value                value = jQuery.isFunction(value) ? value() : ( value == null ? "" : value );                s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);            };        // Set traditional to true for jQuery <= 1.3.2 behavior.        if (traditional === undefined) {            traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;        }        // If an array was passed in, assume that it is an array of form elements.        if (jQuery.isArray(a) || ( a.jquery && !jQuery.isPlainObject(a) )) {            // Serialize the form elements            jQuery.each(a, function () {                add(this.name, this.value);            });        } else {            // If traditional, encode the "old" way (the way 1.3.2 or older            // did it), otherwise encode params recursively.            for (prefix in a) {                buildParams(prefix, a[prefix], traditional, add);            }        }        // Return the resulting serialization        return s.join("&").replace(r20, "+");    };    jQuery.fn.extend({        serialize: function () {            return jQuery.param(this.serializeArray());        },        serializeArray: function () {            return this.map(function () {                    // Can add propHook for "elements" to filter or add form elements                    var elements = jQuery.prop(this, "elements");                    return elements ? jQuery.makeArray(elements) : this;                })                .filter(function () {                    var type = this.type;                    // Use .is( ":disabled" ) so that fieldset[disabled] works                    return this.name && !jQuery(this).is(":disabled") &&                        rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&                        ( this.checked || !rcheckableType.test(type) );                })                .map(function (i, elem) {                    var val = jQuery(this).val();                    return val == null ?                        null :                        jQuery.isArray(val) ?                            jQuery.map(val, function (val) {                                return {name: elem.name, value: val.replace(rCRLF, "\r\n")};                            }) :                        {name: elem.name, value: val.replace(rCRLF, "\r\n")};                }).get();        }    });    jQuery.ajaxSettings.xhr = function () {        try {            return new XMLHttpRequest();        } catch (e) {        }    };    var xhrId = 0,        xhrCallbacks = {},        xhrSuccessStatus = {            // file protocol always yields status code 0, assume 200            0: 200,            // Support: IE9            // #1450: sometimes IE returns 1223 when it should be 204            1223: 204        },        xhrSupported = jQuery.ajaxSettings.xhr();// Support: IE9// Open requests must be manually aborted on unload (#5280)// See https://support.microsoft.com/kb/2856746 for more info    if (window.attachEvent) {        window.attachEvent("onunload", function () {            for (var key in xhrCallbacks) {                xhrCallbacks[key]();            }        });    }    support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );    support.ajax = xhrSupported = !!xhrSupported;    jQuery.ajaxTransport(function (options) {        var callback;        // Cross domain only allowed if supported through XMLHttpRequest        if (support.cors || xhrSupported && !options.crossDomain) {            return {                send: function (headers, complete) {                    var i,                        xhr = options.xhr(),                        id = ++xhrId;                    xhr.open(options.type, options.url, options.async, options.username, options.password);                    // Apply custom fields if provided                    if (options.xhrFields) {                        for (i in options.xhrFields) {                            xhr[i] = options.xhrFields[i];                        }                    }                    // Override mime type if needed                    if (options.mimeType && xhr.overrideMimeType) {                        xhr.overrideMimeType(options.mimeType);                    }                    // X-Requested-With header                    // For cross-domain requests, seeing as conditions for a preflight are                    // akin to a jigsaw puzzle, we simply never set it to be sure.                    // (it can always be set on a per-request basis or even using ajaxSetup)                    // For same-domain requests, won't change header if already provided.                    if (!options.crossDomain && !headers["X-Requested-With"]) {                        headers["X-Requested-With"] = "XMLHttpRequest";                    }                    // Set headers                    for (i in headers) {                        xhr.setRequestHeader(i, headers[i]);                    }                    // Callback                    callback = function (type) {                        return function () {                            if (callback) {                                delete xhrCallbacks[id];                                callback = xhr.onload = xhr.onerror = null;                                if (type === "abort") {                                    xhr.abort();                                } else if (type === "error") {                                    complete(                                        // file: protocol always yields status 0; see #8605, #14207                                        xhr.status,                                        xhr.statusText                                    );                                } else {                                    complete(                                        xhrSuccessStatus[xhr.status] || xhr.status,                                        xhr.statusText,                                        // Support: IE9                                        // Accessing binary-data responseText throws an exception                                        // (#11426)                                        typeof xhr.responseText === "string" ? {                                            text: xhr.responseText                                        } : undefined,                                        xhr.getAllResponseHeaders()                                    );                                }                            }                        };                    };                    // Listen to events                    xhr.onload = callback();                    xhr.onerror = callback("error");                    // Create the abort callback                    callback = xhrCallbacks[id] = callback("abort");                    try {                        // Do send the request (this may raise an exception)                        xhr.send(options.hasContent && options.data || null);                    } catch (e) {                        // #14683: Only rethrow if this hasn't been notified as an error yet                        if (callback) {                            throw e;                        }                    }                },                abort: function () {                    if (callback) {                        callback();                    }                }            };        }    });// Install script dataType    jQuery.ajaxSetup({        accepts: {            script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"        },        contents: {            script: /(?:java|ecma)script/        },        converters: {            "text script": function (text) {                jQuery.globalEval(text);                return text;            }        }    });// Handle cache's special case and crossDomain    jQuery.ajaxPrefilter("script", function (s) {        if (s.cache === undefined) {            s.cache = false;        }        if (s.crossDomain) {            s.type = "GET";        }    });// Bind script tag hack transport    jQuery.ajaxTransport("script", function (s) {        // This transport only deals with cross domain requests        if (s.crossDomain) {            var script, callback;            return {                send: function (_, complete) {                    script = jQuery("<script>").prop({                        async: true,                        charset: s.scriptCharset,                        src: s.url                    }).on(                        "load error",                        callback = function (evt) {                            script.remove();                            callback = null;                            if (evt) {                                complete(evt.type === "error" ? 404 : 200, evt.type);                            }                        }                    );                    document.head.appendChild(script[0]);                },                abort: function () {                    if (callback) {                        callback();                    }                }            };        }    });    var oldCallbacks = [],        rjsonp = /(=)\?(?=&|$)|\?\?/;// Default jsonp settings    jQuery.ajaxSetup({        jsonp: "callback",        jsonpCallback: function () {            var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );            this[callback] = true;            return callback;        }    });// Detect, normalize options and install callbacks for jsonp requests    jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {        var callbackName, overwritten, responseContainer,            jsonProp = s.jsonp !== false && ( rjsonp.test(s.url) ?                        "url" :                    typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test(s.data) && "data"                );        // Handle iff the expected data type is "jsonp" or we have a parameter to set        if (jsonProp || s.dataTypes[0] === "jsonp") {            // Get callback name, remembering preexisting value associated with it            callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ?                s.jsonpCallback() :                s.jsonpCallback;            // Insert callback into url or form data            if (jsonProp) {                s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);            } else if (s.jsonp !== false) {                s.url += ( rquery.test(s.url) ? "&" : "?" ) + s.jsonp + "=" + callbackName;            }            // Use data converter to retrieve json after script execution            s.converters["script json"] = function () {                if (!responseContainer) {                    jQuery.error(callbackName + " was not called");                }                return responseContainer[0];            };            // force json dataType            s.dataTypes[0] = "json";            // Install callback            overwritten = window[callbackName];            window[callbackName] = function () {                responseContainer = arguments;            };            // Clean-up function (fires after converters)            jqXHR.always(function () {                // Restore preexisting value                window[callbackName] = overwritten;                // Save back as free                if (s[callbackName]) {                    // make sure that re-using the options doesn't screw things around                    s.jsonpCallback = originalSettings.jsonpCallback;                    // save the callback name for future use                    oldCallbacks.push(callbackName);                }                // Call if it was a function and we have a response                if (responseContainer && jQuery.isFunction(overwritten)) {                    overwritten(responseContainer[0]);                }                responseContainer = overwritten = undefined;            });            // Delegate to script            return "script";        }    });// data: string of html// context (optional): If specified, the fragment will be created in this context, defaults to document// keepScripts (optional): If true, will include scripts passed in the html string    jQuery.parseHTML = function (data, context, keepScripts) {        if (!data || typeof data !== "string") {            return null;        }        if (typeof context === "boolean") {            keepScripts = context;            context = false;        }        context = context || document;        var parsed = rsingleTag.exec(data),            scripts = !keepScripts && [];        // Single tag        if (parsed) {            return [context.createElement(parsed[1])];        }        parsed = jQuery.buildFragment([data], context, scripts);        if (scripts && scripts.length) {            jQuery(scripts).remove();        }        return jQuery.merge([], parsed.childNodes);    };// Keep a copy of the old load method    var _load = jQuery.fn.load;    /**     * Load a url into a page     */    jQuery.fn.load = function (url, params, callback) {        if (typeof url !== "string" && _load) {            return _load.apply(this, arguments);        }        var selector, type, response,            self = this,            off = url.indexOf(" ");        if (off >= 0) {            selector = jQuery.trim(url.slice(off));            url = url.slice(0, off);        }        // If it's a function        if (jQuery.isFunction(params)) {            // We assume that it's the callback            callback = params;            params = undefined;            // Otherwise, build a param string        } else if (params && typeof params === "object") {            type = "POST";        }        // If we have elements to modify, make the request        if (self.length > 0) {            jQuery.ajax({                url: url,                // if "type" variable is undefined, then "GET" method will be used                type: type,                dataType: "html",                data: params            }).done(function (responseText) {                // Save response for use in complete callback                response = arguments;                self.html(selector ?                    // If a selector was specified, locate the right elements in a dummy div                    // Exclude scripts to avoid IE 'Permission Denied' errors                    jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :                    // Otherwise use the full result                    responseText);            }).complete(callback && function (jqXHR, status) {                    self.each(callback, response || [jqXHR.responseText, status, jqXHR]);                });        }        return this;    };// Attach a bunch of functions for handling common AJAX events    jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {        jQuery.fn[type] = function (fn) {            return this.on(type, fn);        };    });    jQuery.expr.filters.animated = function (elem) {        return jQuery.grep(jQuery.timers, function (fn) {            return elem === fn.elem;        }).length;    };    var docElem = window.document.documentElement;    /**     * Gets a window from an element     */    function getWindow(elem) {        return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;    }    jQuery.offset = {        setOffset: function (elem, options, i) {            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,                position = jQuery.css(elem, "position"),                curElem = jQuery(elem),                props = {};            // Set position first, in-case top/left are set even on static elem            if (position === "static") {                elem.style.position = "relative";            }            curOffset = curElem.offset();            curCSSTop = jQuery.css(elem, "top");            curCSSLeft = jQuery.css(elem, "left");            calculatePosition = ( position === "absolute" || position === "fixed" ) &&                ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;            // Need to be able to calculate position if either            // top or left is auto and position is either absolute or fixed            if (calculatePosition) {                curPosition = curElem.position();                curTop = curPosition.top;                curLeft = curPosition.left;            } else {                curTop = parseFloat(curCSSTop) || 0;                curLeft = parseFloat(curCSSLeft) || 0;            }            if (jQuery.isFunction(options)) {                options = options.call(elem, i, curOffset);            }            if (options.top != null) {                props.top = ( options.top - curOffset.top ) + curTop;            }            if (options.left != null) {                props.left = ( options.left - curOffset.left ) + curLeft;            }            if ("using" in options) {                options.using.call(elem, props);            } else {                curElem.css(props);            }        }    };    jQuery.fn.extend({        offset: function (options) {            if (arguments.length) {                return options === undefined ?                    this :                    this.each(function (i) {                        jQuery.offset.setOffset(this, options, i);                    });            }            var docElem, win,                elem = this[0],                box = {top: 0, left: 0},                doc = elem && elem.ownerDocument;            if (!doc) {                return;            }            docElem = doc.documentElement;            // Make sure it's not a disconnected DOM node            if (!jQuery.contains(docElem, elem)) {                return box;            }            // Support: BlackBerry 5, iOS 3 (original iPhone)            // If we don't have gBCR, just use 0,0 rather than error            if (typeof elem.getBoundingClientRect !== strundefined) {                box = elem.getBoundingClientRect();            }            win = getWindow(doc);            return {                top: box.top + win.pageYOffset - docElem.clientTop,                left: box.left + win.pageXOffset - docElem.clientLeft            };        },        position: function () {            if (!this[0]) {                return;            }            var offsetParent, offset,                elem = this[0],                parentOffset = {top: 0, left: 0};            // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent            if (jQuery.css(elem, "position") === "fixed") {                // Assume getBoundingClientRect is there when computed position is fixed                offset = elem.getBoundingClientRect();            } else {                // Get *real* offsetParent                offsetParent = this.offsetParent();                // Get correct offsets                offset = this.offset();                if (!jQuery.nodeName(offsetParent[0], "html")) {                    parentOffset = offsetParent.offset();                }                // Add offsetParent borders                parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);                parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);            }            // Subtract parent offsets and element margins            return {                top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),                left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)            };        },        offsetParent: function () {            return this.map(function () {                var offsetParent = this.offsetParent || docElem;                while (offsetParent && ( !jQuery.nodeName(offsetParent, "html") && jQuery.css(offsetParent, "position") === "static" )) {                    offsetParent = offsetParent.offsetParent;                }                return offsetParent || docElem;            });        }    });// Create scrollLeft and scrollTop methods    jQuery.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function (method, prop) {        var top = "pageYOffset" === prop;        jQuery.fn[method] = function (val) {            return access(this, function (elem, method, val) {                var win = getWindow(elem);                if (val === undefined) {                    return win ? win[prop] : elem[method];                }                if (win) {                    win.scrollTo(                        !top ? val : window.pageXOffset,                        top ? val : window.pageYOffset                    );                } else {                    elem[method] = val;                }            }, method, val, arguments.length, null);        };    });// Support: Safari<7+, Chrome<37+// Add the top/left cssHooks using jQuery.fn.position// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280// getComputedStyle returns percent when specified for top/left/bottom/right;// rather than make the css module depend on the offset module, just check for it here    jQuery.each(["top", "left"], function (i, prop) {        jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition,            function (elem, computed) {                if (computed) {                    computed = curCSS(elem, prop);                    // If curCSS returns percentage, fallback to offset                    return rnumnonpx.test(computed) ?                    jQuery(elem).position()[prop] + "px" :                        computed;                }            }        );    });// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods    jQuery.each({Height: "height", Width: "width"}, function (name, type) {        jQuery.each({padding: "inner" + name, content: type, "": "outer" + name}, function (defaultExtra, funcName) {            // Margin is only for outerHeight, outerWidth            jQuery.fn[funcName] = function (margin, value) {                var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),                    extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );                return access(this, function (elem, type, value) {                    var doc;                    if (jQuery.isWindow(elem)) {                        // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there                        // isn't a whole lot we can do. See pull request at this URL for discussion:                        // https://github.com/jquery/jquery/pull/764                        return elem.document.documentElement["client" + name];                    }                    // Get document width or height                    if (elem.nodeType === 9) {                        doc = elem.documentElement;                        // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],                        // whichever is greatest                        return Math.max(                            elem.body["scroll" + name], doc["scroll" + name],                            elem.body["offset" + name], doc["offset" + name],                            doc["client" + name]                        );                    }                    return value === undefined ?                        // Get width or height on the element, requesting but not forcing parseFloat                        jQuery.css(elem, type, extra) :                        // Set width or height on the element                        jQuery.style(elem, type, value, extra);                }, type, chainable ? margin : undefined, chainable, null);            };        });    });// The number of elements contained in the matched element set    jQuery.fn.size = function () {        return this.length;    };    jQuery.fn.andSelf = jQuery.fn.addBack;// Register as a named AMD module, since jQuery can be concatenated with other// files that may use define, but not via a proper concatenation script that// understands anonymous AMD modules. A named AMD is safest and most robust// way to register. Lowercase jquery is used because AMD module names are// derived from file names, and jQuery is normally delivered in a lowercase// file name. Do this after creating the global so that if an AMD module wants// to call noConflict to hide this version of jQuery, it will work.// Note that for maximum portability, libraries that are not jQuery should// declare themselves as anonymous modules, and avoid setting a global if an// AMD loader is present. jQuery is a special case. For more information, see// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon    if (typeof define === "function" && define.amd) {        define("jquery", [], function () {            return jQuery;        });    }    var    // Map over jQuery in case of overwrite        _jQuery = window.jQuery,    // Map over the $ in case of overwrite        _$ = window.$;    jQuery.noConflict = function (deep) {        if (window.$ === jQuery) {            window.$ = _$;        }        if (deep && window.jQuery === jQuery) {            window.jQuery = _jQuery;        }        return jQuery;    };// Expose jQuery and $ identifiers, even in AMD// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)// and CommonJS for browser emulators (#13566)    if (typeof noGlobal === strundefined) {        window.jQuery = window.$ = jQuery;    }    return jQuery;}));/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under the MIT license */if (typeof jQuery === 'undefined') {    throw new Error('Bootstrap\'s JavaScript requires jQuery')}+function ($) {    'use strict';    var version = $.fn.jquery.split(' ')[0].split('.')    if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {        throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')    }}(jQuery);/* ======================================================================== * Bootstrap: transition.js v3.3.5 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)    // ============================================================    function transitionEnd() {        var el = document.createElement('bootstrap')        var transEndEventNames = {            WebkitTransition: 'webkitTransitionEnd',            MozTransition: 'transitionend',            OTransition: 'oTransitionEnd otransitionend',            transition: 'transitionend'        }        for (var name in transEndEventNames) {            if (el.style[name] !== undefined) {                return {end: transEndEventNames[name]}            }        }        return false // explicit for ie8 (  ._.)    }    // http://blog.alexmaccaw.com/css-transitions    $.fn.emulateTransitionEnd = function (duration) {        var called = false        var $el = this        $(this).one('bsTransitionEnd', function () {            called = true        })        var callback = function () {            if (!called) $($el).trigger($.support.transition.end)        }        setTimeout(callback, duration)        return this    }    $(function () {        $.support.transition = transitionEnd()        if (!$.support.transition) return        $.event.special.bsTransitionEnd = {            bindType: $.support.transition.end,            delegateType: $.support.transition.end,            handle: function (e) {                if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)            }        }    })}(jQuery);/* ======================================================================== * Bootstrap: alert.js v3.3.5 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // ALERT CLASS DEFINITION    // ======================    var dismiss = '[data-dismiss="alert"]'    var Alert = function (el) {        $(el).on('click', dismiss, this.close)    }    Alert.VERSION = '3.3.5'    Alert.TRANSITION_DURATION = 150    Alert.prototype.close = function (e) {        var $this = $(this)        var selector = $this.attr('data-target')        if (!selector) {            selector = $this.attr('href')            selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7        }        var $parent = $(selector)        if (e) e.preventDefault()        if (!$parent.length) {            $parent = $this.closest('.alert')        }        $parent.trigger(e = $.Event('close.bs.alert'))        if (e.isDefaultPrevented()) return        $parent.removeClass('in')        function removeElement() {            // detach from parent, fire event then clean up data            $parent.detach().trigger('closed.bs.alert').remove()        }        $.support.transition && $parent.hasClass('fade') ?            $parent                .one('bsTransitionEnd', removeElement)                .emulateTransitionEnd(Alert.TRANSITION_DURATION) :            removeElement()    }    // ALERT PLUGIN DEFINITION    // =======================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.alert')            if (!data) $this.data('bs.alert', (data = new Alert(this)))            if (typeof option == 'string') data[option].call($this)        })    }    var old = $.fn.alert    $.fn.alert = Plugin    $.fn.alert.Constructor = Alert    // ALERT NO CONFLICT    // =================    $.fn.alert.noConflict = function () {        $.fn.alert = old        return this    }    // ALERT DATA-API    // ==============    $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)}(jQuery);/* ======================================================================== * Bootstrap: button.js v3.3.5 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // BUTTON PUBLIC CLASS DEFINITION    // ==============================    var Button = function (element, options) {        this.$element = $(element)        this.options = $.extend({}, Button.DEFAULTS, options)        this.isLoading = false    }    Button.VERSION = '3.3.5'    Button.DEFAULTS = {        loadingText: 'loading...'    }    Button.prototype.setState = function (state) {        var d = 'disabled'        var $el = this.$element        var val = $el.is('input') ? 'val' : 'html'        var data = $el.data()        state += 'Text'        if (data.resetText == null) $el.data('resetText', $el[val]())        // push to event loop to allow forms to submit        setTimeout($.proxy(function () {            $el[val](data[state] == null ? this.options[state] : data[state])            if (state == 'loadingText') {                this.isLoading = true                $el.addClass(d).attr(d, d)            } else if (this.isLoading) {                this.isLoading = false                $el.removeClass(d).removeAttr(d)            }        }, this), 0)    }    Button.prototype.toggle = function () {        var changed = true        var $parent = this.$element.closest('[data-toggle="buttons"]')        if ($parent.length) {            var $input = this.$element.find('input')            if ($input.prop('type') == 'radio') {                if ($input.prop('checked')) changed = false                $parent.find('.active').removeClass('active')                this.$element.addClass('active')            } else if ($input.prop('type') == 'checkbox') {                if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false                this.$element.toggleClass('active')            }            $input.prop('checked', this.$element.hasClass('active'))            if (changed) $input.trigger('change')        } else {            this.$element.attr('aria-pressed', !this.$element.hasClass('active'))            this.$element.toggleClass('active')        }    }    // BUTTON PLUGIN DEFINITION    // ========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.button')            var options = typeof option == 'object' && option            if (!data) $this.data('bs.button', (data = new Button(this, options)))            if (option == 'toggle') data.toggle()            else if (option) data.setState(option)        })    }    var old = $.fn.button    $.fn.button = Plugin    $.fn.button.Constructor = Button    // BUTTON NO CONFLICT    // ==================    $.fn.button.noConflict = function () {        $.fn.button = old        return this    }    // BUTTON DATA-API    // ===============    $(document)        .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {            var $btn = $(e.target)            if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')            Plugin.call($btn, 'toggle')            if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()        })        .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {            $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))        })}(jQuery);/* ======================================================================== * Bootstrap: carousel.js v3.3.5 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // CAROUSEL CLASS DEFINITION    // =========================    var Carousel = function (element, options) {        this.$element = $(element)        this.$indicators = this.$element.find('.carousel-indicators')        this.options = options        this.paused = null        this.sliding = null        this.interval = null        this.$active = null        this.$items = null        this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))        this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element            .on('mouseenter.bs.carousel', $.proxy(this.pause, this))            .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))    }    Carousel.VERSION = '3.3.5'    Carousel.TRANSITION_DURATION = 600    Carousel.DEFAULTS = {        interval: 5000,        pause: 'hover',        wrap: true,        keyboard: true    }    Carousel.prototype.keydown = function (e) {        if (/input|textarea/i.test(e.target.tagName)) return        switch (e.which) {            case 37:                this.prev();                break            case 39:                this.next();                break            default:                return        }        e.preventDefault()    }    Carousel.prototype.cycle = function (e) {        e || (this.paused = false)        this.interval && clearInterval(this.interval)        this.options.interval        && !this.paused        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))        return this    }    Carousel.prototype.getItemIndex = function (item) {        this.$items = item.parent().children('.item')        return this.$items.index(item || this.$active)    }    Carousel.prototype.getItemForDirection = function (direction, active) {        var activeIndex = this.getItemIndex(active)        var willWrap = (direction == 'prev' && activeIndex === 0)            || (direction == 'next' && activeIndex == (this.$items.length - 1))        if (willWrap && !this.options.wrap) return active        var delta = direction == 'prev' ? -1 : 1        var itemIndex = (activeIndex + delta) % this.$items.length        return this.$items.eq(itemIndex)    }    Carousel.prototype.to = function (pos) {        var that = this        var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))        if (pos > (this.$items.length - 1) || pos < 0) return        if (this.sliding)       return this.$element.one('slid.bs.carousel', function () {            that.to(pos)        }) // yes, "slid"        if (activeIndex == pos) return this.pause().cycle()        return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))    }    Carousel.prototype.pause = function (e) {        e || (this.paused = true)        if (this.$element.find('.next, .prev').length && $.support.transition) {            this.$element.trigger($.support.transition.end)            this.cycle(true)        }        this.interval = clearInterval(this.interval)        return this    }    Carousel.prototype.next = function () {        if (this.sliding) return        return this.slide('next')    }    Carousel.prototype.prev = function () {        if (this.sliding) return        return this.slide('prev')    }    Carousel.prototype.slide = function (type, next) {        var $active = this.$element.find('.item.active')        var $next = next || this.getItemForDirection(type, $active)        var isCycling = this.interval        var direction = type == 'next' ? 'left' : 'right'        var that = this        if ($next.hasClass('active')) return (this.sliding = false)        var relatedTarget = $next[0]        var slideEvent = $.Event('slide.bs.carousel', {            relatedTarget: relatedTarget,            direction: direction        })        this.$element.trigger(slideEvent)        if (slideEvent.isDefaultPrevented()) return        this.sliding = true        isCycling && this.pause()        if (this.$indicators.length) {            this.$indicators.find('.active').removeClass('active')            var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])            $nextIndicator && $nextIndicator.addClass('active')        }        var slidEvent = $.Event('slid.bs.carousel', {relatedTarget: relatedTarget, direction: direction}) // yes, "slid"        if ($.support.transition && this.$element.hasClass('slide')) {            $next.addClass(type)            $next[0].offsetWidth // force reflow            $active.addClass(direction)            $next.addClass(direction)            $active                .one('bsTransitionEnd', function () {                    $next.removeClass([type, direction].join(' ')).addClass('active')                    $active.removeClass(['active', direction].join(' '))                    that.sliding = false                    setTimeout(function () {                        that.$element.trigger(slidEvent)                    }, 0)                })                .emulateTransitionEnd(Carousel.TRANSITION_DURATION)        } else {            $active.removeClass('active')            $next.addClass('active')            this.sliding = false            this.$element.trigger(slidEvent)        }        isCycling && this.cycle()        return this    }    // CAROUSEL PLUGIN DEFINITION    // ==========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.carousel')            var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)            var action = typeof option == 'string' ? option : options.slide            if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))            if (typeof option == 'number') data.to(option)            else if (action) data[action]()            else if (options.interval) data.pause().cycle()        })    }    var old = $.fn.carousel    $.fn.carousel = Plugin    $.fn.carousel.Constructor = Carousel    // CAROUSEL NO CONFLICT    // ====================    $.fn.carousel.noConflict = function () {        $.fn.carousel = old        return this    }    // CAROUSEL DATA-API    // =================    var clickHandler = function (e) {        var href        var $this = $(this)        var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7        if (!$target.hasClass('carousel')) return        var options = $.extend({}, $target.data(), $this.data())        var slideIndex = $this.attr('data-slide-to')        if (slideIndex) options.interval = false        Plugin.call($target, options)        if (slideIndex) {            $target.data('bs.carousel').to(slideIndex)        }        e.preventDefault()    }    $(document)        .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)        .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)    $(window).on('load', function () {        $('[data-ride="carousel"]').each(function () {            var $carousel = $(this)            Plugin.call($carousel, $carousel.data())        })    })}(jQuery);/* ======================================================================== * Bootstrap: collapse.js v3.3.5 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // COLLAPSE PUBLIC CLASS DEFINITION    // ================================    var Collapse = function (element, options) {        this.$element = $(element)        this.options = $.extend({}, Collapse.DEFAULTS, options)        this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +            '[data-toggle="collapse"][data-target="#' + element.id + '"]')        this.transitioning = null        if (this.options.parent) {            this.$parent = this.getParent()        } else {            this.addAriaAndCollapsedClass(this.$element, this.$trigger)        }        if (this.options.toggle) this.toggle()    }    Collapse.VERSION = '3.3.5'    Collapse.TRANSITION_DURATION = 350    Collapse.DEFAULTS = {        toggle: true    }    Collapse.prototype.dimension = function () {        var hasWidth = this.$element.hasClass('width')        return hasWidth ? 'width' : 'height'    }    Collapse.prototype.show = function () {        if (this.transitioning || this.$element.hasClass('in')) return        var activesData        var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')        if (actives && actives.length) {            activesData = actives.data('bs.collapse')            if (activesData && activesData.transitioning) return        }        var startEvent = $.Event('show.bs.collapse')        this.$element.trigger(startEvent)        if (startEvent.isDefaultPrevented()) return        if (actives && actives.length) {            Plugin.call(actives, 'hide')            activesData || actives.data('bs.collapse', null)        }        var dimension = this.dimension()        this.$element            .removeClass('collapse')            .addClass('collapsing')[dimension](0)            .attr('aria-expanded', true)        this.$trigger            .removeClass('collapsed')            .attr('aria-expanded', true)        this.transitioning = 1        var complete = function () {            this.$element                .removeClass('collapsing')                .addClass('collapse in')[dimension]('')            this.transitioning = 0            this.$element                .trigger('shown.bs.collapse')        }        if (!$.support.transition) return complete.call(this)        var scrollSize = $.camelCase(['scroll', dimension].join('-'))        this.$element            .one('bsTransitionEnd', $.proxy(complete, this))            .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])    }    Collapse.prototype.hide = function () {        if (this.transitioning || !this.$element.hasClass('in')) return        var startEvent = $.Event('hide.bs.collapse')        this.$element.trigger(startEvent)        if (startEvent.isDefaultPrevented()) return        var dimension = this.dimension()        this.$element[dimension](this.$element[dimension]())[0].offsetHeight        this.$element            .addClass('collapsing')            .removeClass('collapse in')            .attr('aria-expanded', false)        this.$trigger            .addClass('collapsed')            .attr('aria-expanded', false)        this.transitioning = 1        var complete = function () {            this.transitioning = 0            this.$element                .removeClass('collapsing')                .addClass('collapse')                .trigger('hidden.bs.collapse')        }        if (!$.support.transition) return complete.call(this)        this.$element            [dimension](0)            .one('bsTransitionEnd', $.proxy(complete, this))            .emulateTransitionEnd(Collapse.TRANSITION_DURATION)    }    Collapse.prototype.toggle = function () {        this[this.$element.hasClass('in') ? 'hide' : 'show']()    }    Collapse.prototype.getParent = function () {        return $(this.options.parent)            .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')            .each($.proxy(function (i, element) {                var $element = $(element)                this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)            }, this))            .end()    }    Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {        var isOpen = $element.hasClass('in')        $element.attr('aria-expanded', isOpen)        $trigger            .toggleClass('collapsed', !isOpen)            .attr('aria-expanded', isOpen)    }    function getTargetFromTrigger($trigger) {        var href        var target = $trigger.attr('data-target')            || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7        return $(target)    }    // COLLAPSE PLUGIN DEFINITION    // ==========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.collapse')            var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)            if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false            if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.collapse    $.fn.collapse = Plugin    $.fn.collapse.Constructor = Collapse    // COLLAPSE NO CONFLICT    // ====================    $.fn.collapse.noConflict = function () {        $.fn.collapse = old        return this    }    // COLLAPSE DATA-API    // =================    $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {        var $this = $(this)        if (!$this.attr('data-target')) e.preventDefault()        var $target = getTargetFromTrigger($this)        var data = $target.data('bs.collapse')        var option = data ? 'toggle' : $this.data()        Plugin.call($target, option)    })}(jQuery);/* ======================================================================== * Bootstrap: dropdown.js v3.3.5 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // DROPDOWN CLASS DEFINITION    // =========================    var backdrop = '.dropdown-backdrop'    var toggle = '[data-toggle="dropdown"]'    var Dropdown = function (element) {        $(element).on('click.bs.dropdown', this.toggle)    }    Dropdown.VERSION = '3.3.5'    function getParent($this) {        var selector = $this.attr('data-target')        if (!selector) {            selector = $this.attr('href')            selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7        }        var $parent = selector && $(selector)        return $parent && $parent.length ? $parent : $this.parent()    }    function clearMenus(e) {        if (e && e.which === 3) return        $(backdrop).remove()        $(toggle).each(function () {            var $this = $(this)            var $parent = getParent($this)            var relatedTarget = {relatedTarget: this}            if (!$parent.hasClass('open')) return            if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return            $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))            if (e.isDefaultPrevented()) return            $this.attr('aria-expanded', 'false')            $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)        })    }    Dropdown.prototype.toggle = function (e) {        var $this = $(this)        if ($this.is('.disabled, :disabled')) return        var $parent = getParent($this)        var isActive = $parent.hasClass('open')        clearMenus()        if (!isActive) {            if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {                // if mobile we use a backdrop because click events don't delegate                $(document.createElement('div'))                    .addClass('dropdown-backdrop')                    .insertAfter($(this))                    .on('click', clearMenus)            }            var relatedTarget = {relatedTarget: this}            $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))            if (e.isDefaultPrevented()) return            $this                .trigger('focus')                .attr('aria-expanded', 'true')            $parent                .toggleClass('open')                .trigger('shown.bs.dropdown', relatedTarget)        }        return false    }    Dropdown.prototype.keydown = function (e) {        if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return        var $this = $(this)        e.preventDefault()        e.stopPropagation()        if ($this.is('.disabled, :disabled')) return        var $parent = getParent($this)        var isActive = $parent.hasClass('open')        if (!isActive && e.which != 27 || isActive && e.which == 27) {            if (e.which == 27) $parent.find(toggle).trigger('focus')            return $this.trigger('click')        }        var desc = ' li:not(.disabled):visible a'        var $items = $parent.find('.dropdown-menu' + desc)        if (!$items.length) return        var index = $items.index(e.target)        if (e.which == 38 && index > 0)                 index--         // up        if (e.which == 40 && index < $items.length - 1) index++         // down        if (!~index)                                    index = 0        $items.eq(index).trigger('focus')    }    // DROPDOWN PLUGIN DEFINITION    // ==========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.dropdown')            if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))            if (typeof option == 'string') data[option].call($this)        })    }    var old = $.fn.dropdown    $.fn.dropdown = Plugin    $.fn.dropdown.Constructor = Dropdown    // DROPDOWN NO CONFLICT    // ====================    $.fn.dropdown.noConflict = function () {        $.fn.dropdown = old        return this    }    // APPLY TO STANDARD DROPDOWN ELEMENTS    // ===================================    $(document)        .on('click.bs.dropdown.data-api', clearMenus)        .on('click.bs.dropdown.data-api', '.dropdown form', function (e) {            e.stopPropagation()        })        .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)        .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)        .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)}(jQuery);/* ======================================================================== * Bootstrap: modal.js v3.3.5 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // MODAL CLASS DEFINITION    // ======================    var Modal = function (element, options) {        this.options = options        this.$body = $(document.body)        this.$element = $(element)        this.$dialog = this.$element.find('.modal-dialog')        this.$backdrop = null        this.isShown = null        this.originalBodyPad = null        this.scrollbarWidth = 0        this.ignoreBackdropClick = false        if (this.options.remote) {            this.$element                .find('.modal-content')                .load(this.options.remote, $.proxy(function () {                    this.$element.trigger('loaded.bs.modal')                }, this))        }    }    Modal.VERSION = '3.3.5'    Modal.TRANSITION_DURATION = 300    Modal.BACKDROP_TRANSITION_DURATION = 150    Modal.DEFAULTS = {        backdrop: true,        keyboard: true,        show: true    }    Modal.prototype.toggle = function (_relatedTarget) {        return this.isShown ? this.hide() : this.show(_relatedTarget)    }    Modal.prototype.show = function (_relatedTarget) {        var that = this        var e = $.Event('show.bs.modal', {relatedTarget: _relatedTarget})        this.$element.trigger(e)        if (this.isShown || e.isDefaultPrevented()) return        this.isShown = true        this.checkScrollbar()        this.setScrollbar()        this.$body.addClass('modal-open')        this.escape()        this.resize()        this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))        this.$dialog.on('mousedown.dismiss.bs.modal', function () {            that.$element.one('mouseup.dismiss.bs.modal', function (e) {                if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true            })        })        this.backdrop(function () {            var transition = $.support.transition && that.$element.hasClass('fade')            if (!that.$element.parent().length) {                that.$element.appendTo(that.$body) // don't move modals dom position            }            that.$element                .show()                .scrollTop(0)            that.adjustDialog()            if (transition) {                that.$element[0].offsetWidth // force reflow            }            that.$element.addClass('in')            that.enforceFocus()            var e = $.Event('shown.bs.modal', {relatedTarget: _relatedTarget})            transition ?                that.$dialog // wait for modal to slide in                    .one('bsTransitionEnd', function () {                        that.$element.trigger('focus').trigger(e)                    })                    .emulateTransitionEnd(Modal.TRANSITION_DURATION) :                that.$element.trigger('focus').trigger(e)        })    }    Modal.prototype.hide = function (e) {        if (e) e.preventDefault()        e = $.Event('hide.bs.modal')        this.$element.trigger(e)        if (!this.isShown || e.isDefaultPrevented()) return        this.isShown = false        this.escape()        this.resize()        $(document).off('focusin.bs.modal')        this.$element            .removeClass('in')            .off('click.dismiss.bs.modal')            .off('mouseup.dismiss.bs.modal')        this.$dialog.off('mousedown.dismiss.bs.modal')        $.support.transition && this.$element.hasClass('fade') ?            this.$element                .one('bsTransitionEnd', $.proxy(this.hideModal, this))                .emulateTransitionEnd(Modal.TRANSITION_DURATION) :            this.hideModal()    }    Modal.prototype.enforceFocus = function () {        $(document)            .off('focusin.bs.modal') // guard against infinite focus loop            .on('focusin.bs.modal', $.proxy(function (e) {                if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {                    this.$element.trigger('focus')                }            }, this))    }    Modal.prototype.escape = function () {        if (this.isShown && this.options.keyboard) {            this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {                e.which == 27 && this.hide()            }, this))        } else if (!this.isShown) {            this.$element.off('keydown.dismiss.bs.modal')        }    }    Modal.prototype.resize = function () {        if (this.isShown) {            $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))        } else {            $(window).off('resize.bs.modal')        }    }    Modal.prototype.hideModal = function () {        var that = this        this.$element.hide()        this.backdrop(function () {            that.$body.removeClass('modal-open')            that.resetAdjustments()            that.resetScrollbar()            that.$element.trigger('hidden.bs.modal')        })    }    Modal.prototype.removeBackdrop = function () {        this.$backdrop && this.$backdrop.remove()        this.$backdrop = null    }    Modal.prototype.backdrop = function (callback) {        var that = this        var animate = this.$element.hasClass('fade') ? 'fade' : ''        if (this.isShown && this.options.backdrop) {            var doAnimate = $.support.transition && animate            this.$backdrop = $(document.createElement('div'))                .addClass('modal-backdrop ' + animate)                .appendTo(this.$body)            this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {                if (this.ignoreBackdropClick) {                    this.ignoreBackdropClick = false                    return                }                if (e.target !== e.currentTarget) return                this.options.backdrop == 'static'                    ? this.$element[0].focus()                    : this.hide()            }, this))            if (doAnimate) this.$backdrop[0].offsetWidth // force reflow            this.$backdrop.addClass('in')            if (!callback) return            doAnimate ?                this.$backdrop                    .one('bsTransitionEnd', callback)                    .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :                callback()        } else if (!this.isShown && this.$backdrop) {            this.$backdrop.removeClass('in')            var callbackRemove = function () {                that.removeBackdrop()                callback && callback()            }            $.support.transition && this.$element.hasClass('fade') ?                this.$backdrop                    .one('bsTransitionEnd', callbackRemove)                    .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :                callbackRemove()        } else if (callback) {            callback()        }    }    // these following methods are used to handle overflowing modals    Modal.prototype.handleUpdate = function () {        this.adjustDialog()    }    Modal.prototype.adjustDialog = function () {        var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight        this.$element.css({            paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',            paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''        })    }    Modal.prototype.resetAdjustments = function () {        this.$element.css({            paddingLeft: '',            paddingRight: ''        })    }    Modal.prototype.checkScrollbar = function () {        var fullWindowWidth = window.innerWidth        if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8            var documentElementRect = document.documentElement.getBoundingClientRect()            fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)        }        this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth        this.scrollbarWidth = this.measureScrollbar()    }    Modal.prototype.setScrollbar = function () {        var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)        this.originalBodyPad = document.body.style.paddingRight || ''        if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)    }    Modal.prototype.resetScrollbar = function () {        this.$body.css('padding-right', this.originalBodyPad)    }    Modal.prototype.measureScrollbar = function () { // thx walsh        var scrollDiv = document.createElement('div')        scrollDiv.className = 'modal-scrollbar-measure'        this.$body.append(scrollDiv)        var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth        this.$body[0].removeChild(scrollDiv)        return scrollbarWidth    }    // MODAL PLUGIN DEFINITION    // =======================    function Plugin(option, _relatedTarget) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.modal')            var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)            if (!data) $this.data('bs.modal', (data = new Modal(this, options)))            if (typeof option == 'string') data[option](_relatedTarget)            else if (options.show) data.show(_relatedTarget)        })    }    var old = $.fn.modal    $.fn.modal = Plugin    $.fn.modal.Constructor = Modal    // MODAL NO CONFLICT    // =================    $.fn.modal.noConflict = function () {        $.fn.modal = old        return this    }    // MODAL DATA-API    // ==============    $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {        var $this = $(this)        var href = $this.attr('href')        var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7        var option = $target.data('bs.modal') ? 'toggle' : $.extend({remote: !/#/.test(href) && href}, $target.data(), $this.data())        if ($this.is('a')) e.preventDefault()        $target.one('show.bs.modal', function (showEvent) {            if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown            $target.one('hidden.bs.modal', function () {                $this.is(':visible') && $this.trigger('focus')            })        })        Plugin.call($target, option, this)    })}(jQuery);/* ======================================================================== * Bootstrap: tooltip.js v3.3.5 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // TOOLTIP PUBLIC CLASS DEFINITION    // ===============================    var Tooltip = function (element, options) {        this.type = null        this.options = null        this.enabled = null        this.timeout = null        this.hoverState = null        this.$element = null        this.inState = null        this.init('tooltip', element, options)    }    Tooltip.VERSION = '3.3.5'    Tooltip.TRANSITION_DURATION = 150    Tooltip.DEFAULTS = {        animation: true,        placement: 'top',        selector: false,        template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',        trigger: 'hover focus',        title: '',        delay: 0,        html: false,        container: false,        viewport: {            selector: 'body',            padding: 0        }    }    Tooltip.prototype.init = function (type, element, options) {        this.enabled = true        this.type = type        this.$element = $(element)        this.options = this.getOptions(options)        this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))        this.inState = {click: false, hover: false, focus: false}        if (this.$element[0] instanceof document.constructor && !this.options.selector) {            throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')        }        var triggers = this.options.trigger.split(' ')        for (var i = triggers.length; i--;) {            var trigger = triggers[i]            if (trigger == 'click') {                this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))            } else if (trigger != 'manual') {                var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'                var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'                this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))                this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))            }        }        this.options.selector ?            (this._options = $.extend({}, this.options, {trigger: 'manual', selector: ''})) :            this.fixTitle()    }    Tooltip.prototype.getDefaults = function () {        return Tooltip.DEFAULTS    }    Tooltip.prototype.getOptions = function (options) {        options = $.extend({}, this.getDefaults(), this.$element.data(), options)        if (options.delay && typeof options.delay == 'number') {            options.delay = {                show: options.delay,                hide: options.delay            }        }        return options    }    Tooltip.prototype.getDelegateOptions = function () {        var options = {}        var defaults = this.getDefaults()        this._options && $.each(this._options, function (key, value) {            if (defaults[key] != value) options[key] = value        })        return options    }    Tooltip.prototype.enter = function (obj) {        var self = obj instanceof this.constructor ?            obj : $(obj.currentTarget).data('bs.' + this.type)        if (!self) {            self = new this.constructor(obj.currentTarget, this.getDelegateOptions())            $(obj.currentTarget).data('bs.' + this.type, self)        }        if (obj instanceof $.Event) {            self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true        }        if (self.tip().hasClass('in') || self.hoverState == 'in') {            self.hoverState = 'in'            return        }        clearTimeout(self.timeout)        self.hoverState = 'in'        if (!self.options.delay || !self.options.delay.show) return self.show()        self.timeout = setTimeout(function () {            if (self.hoverState == 'in') self.show()        }, self.options.delay.show)    }    Tooltip.prototype.isInStateTrue = function () {        for (var key in this.inState) {            if (this.inState[key]) return true        }        return false    }    Tooltip.prototype.leave = function (obj) {        var self = obj instanceof this.constructor ?            obj : $(obj.currentTarget).data('bs.' + this.type)        if (!self) {            self = new this.constructor(obj.currentTarget, this.getDelegateOptions())            $(obj.currentTarget).data('bs.' + this.type, self)        }        if (obj instanceof $.Event) {            self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false        }        if (self.isInStateTrue()) return        clearTimeout(self.timeout)        self.hoverState = 'out'        if (!self.options.delay || !self.options.delay.hide) return self.hide()        self.timeout = setTimeout(function () {            if (self.hoverState == 'out') self.hide()        }, self.options.delay.hide)    }    Tooltip.prototype.show = function () {        var e = $.Event('show.bs.' + this.type)        if (this.hasContent() && this.enabled) {            this.$element.trigger(e)            var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])            if (e.isDefaultPrevented() || !inDom) return            var that = this            var $tip = this.tip()            var tipId = this.getUID(this.type)            this.setContent()            $tip.attr('id', tipId)            this.$element.attr('aria-describedby', tipId)            if (this.options.animation) $tip.addClass('fade')            var placement = typeof this.options.placement == 'function' ?                this.options.placement.call(this, $tip[0], this.$element[0]) :                this.options.placement            var autoToken = /\s?auto?\s?/i            var autoPlace = autoToken.test(placement)            if (autoPlace) placement = placement.replace(autoToken, '') || 'top'            $tip                .detach()                .css({top: 0, left: 0, display: 'block'})                .addClass(placement)                .data('bs.' + this.type, this)            this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)            this.$element.trigger('inserted.bs.' + this.type)            var pos = this.getPosition()            var actualWidth = $tip[0].offsetWidth            var actualHeight = $tip[0].offsetHeight            if (autoPlace) {                var orgPlacement = placement                var viewportDim = this.getPosition(this.$viewport)                placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :                    placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :                        placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :                            placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :                                placement                $tip                    .removeClass(orgPlacement)                    .addClass(placement)            }            var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)            this.applyPlacement(calculatedOffset, placement)            var complete = function () {                var prevHoverState = that.hoverState                that.$element.trigger('shown.bs.' + that.type)                that.hoverState = null                if (prevHoverState == 'out') that.leave(that)            }            $.support.transition && this.$tip.hasClass('fade') ?                $tip                    .one('bsTransitionEnd', complete)                    .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :                complete()        }    }    Tooltip.prototype.applyPlacement = function (offset, placement) {        var $tip = this.tip()        var width = $tip[0].offsetWidth        var height = $tip[0].offsetHeight        // manually read margins because getBoundingClientRect includes difference        var marginTop = parseInt($tip.css('margin-top'), 10)        var marginLeft = parseInt($tip.css('margin-left'), 10)        // we must check for NaN for ie 8/9        if (isNaN(marginTop))  marginTop = 0        if (isNaN(marginLeft)) marginLeft = 0        offset.top += marginTop        offset.left += marginLeft        // $.fn.offset doesn't round pixel values        // so we use setOffset directly with our own function B-0        $.offset.setOffset($tip[0], $.extend({            using: function (props) {                $tip.css({                    top: Math.round(props.top),                    left: Math.round(props.left)                })            }        }, offset), 0)        $tip.addClass('in')        // check to see if placing tip in new offset caused the tip to resize itself        var actualWidth = $tip[0].offsetWidth        var actualHeight = $tip[0].offsetHeight        if (placement == 'top' && actualHeight != height) {            offset.top = offset.top + height - actualHeight        }        var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)        if (delta.left) offset.left += delta.left        else offset.top += delta.top        var isVertical = /top|bottom/.test(placement)        var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight        var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'        $tip.offset(offset)        this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)    }    Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {        this.arrow()            .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')            .css(isVertical ? 'top' : 'left', '')    }    Tooltip.prototype.setContent = function () {        var $tip = this.tip()        var title = this.getTitle()        $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)        $tip.removeClass('fade in top bottom left right')    }    Tooltip.prototype.hide = function (callback) {        var that = this        var $tip = $(this.$tip)        var e = $.Event('hide.bs.' + this.type)        function complete() {            if (that.hoverState != 'in') $tip.detach()            that.$element                .removeAttr('aria-describedby')                .trigger('hidden.bs.' + that.type)            callback && callback()        }        this.$element.trigger(e)        if (e.isDefaultPrevented()) return        $tip.removeClass('in')        $.support.transition && $tip.hasClass('fade') ?            $tip                .one('bsTransitionEnd', complete)                .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :            complete()        this.hoverState = null        return this    }    Tooltip.prototype.fixTitle = function () {        var $e = this.$element        if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {            $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')        }    }    Tooltip.prototype.hasContent = function () {        return this.getTitle()    }    Tooltip.prototype.getPosition = function ($element) {        $element = $element || this.$element        var el = $element[0]        var isBody = el.tagName == 'BODY'        var elRect = el.getBoundingClientRect()        if (elRect.width == null) {            // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093            elRect = $.extend({}, elRect, {width: elRect.right - elRect.left, height: elRect.bottom - elRect.top})        }        var elOffset = isBody ? {top: 0, left: 0} : $element.offset()        var scroll = {scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop()}        var outerDims = isBody ? {width: $(window).width(), height: $(window).height()} : null        return $.extend({}, elRect, scroll, outerDims, elOffset)    }    Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {        return placement == 'bottom' ? {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} :            placement == 'top' ? {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} :                placement == 'left' ? {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} :                    /* placement == 'right' */ {                    top: pos.top + pos.height / 2 - actualHeight / 2,                    left: pos.left + pos.width                }    }    Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {        var delta = {top: 0, left: 0}        if (!this.$viewport) return delta        var viewportPadding = this.options.viewport && this.options.viewport.padding || 0        var viewportDimensions = this.getPosition(this.$viewport)        if (/right|left/.test(placement)) {            var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll            var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight            if (topEdgeOffset < viewportDimensions.top) { // top overflow                delta.top = viewportDimensions.top - topEdgeOffset            } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow                delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset            }        } else {            var leftEdgeOffset = pos.left - viewportPadding            var rightEdgeOffset = pos.left + viewportPadding + actualWidth            if (leftEdgeOffset < viewportDimensions.left) { // left overflow                delta.left = viewportDimensions.left - leftEdgeOffset            } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow                delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset            }        }        return delta    }    Tooltip.prototype.getTitle = function () {        var title        var $e = this.$element        var o = this.options        title = $e.attr('data-original-title')            || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)        return title    }    Tooltip.prototype.getUID = function (prefix) {        do prefix += ~~(Math.random() * 1000000)        while (document.getElementById(prefix))        return prefix    }    Tooltip.prototype.tip = function () {        if (!this.$tip) {            this.$tip = $(this.options.template)            if (this.$tip.length != 1) {                throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')            }        }        return this.$tip    }    Tooltip.prototype.arrow = function () {        return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))    }    Tooltip.prototype.enable = function () {        this.enabled = true    }    Tooltip.prototype.disable = function () {        this.enabled = false    }    Tooltip.prototype.toggleEnabled = function () {        this.enabled = !this.enabled    }    Tooltip.prototype.toggle = function (e) {        var self = this        if (e) {            self = $(e.currentTarget).data('bs.' + this.type)            if (!self) {                self = new this.constructor(e.currentTarget, this.getDelegateOptions())                $(e.currentTarget).data('bs.' + this.type, self)            }        }        if (e) {            self.inState.click = !self.inState.click            if (self.isInStateTrue()) self.enter(self)            else self.leave(self)        } else {            self.tip().hasClass('in') ? self.leave(self) : self.enter(self)        }    }    Tooltip.prototype.destroy = function () {        var that = this        clearTimeout(this.timeout)        this.hide(function () {            that.$element.off('.' + that.type).removeData('bs.' + that.type)            if (that.$tip) {                that.$tip.detach()            }            that.$tip = null            that.$arrow = null            that.$viewport = null        })    }    // TOOLTIP PLUGIN DEFINITION    // =========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.tooltip')            var options = typeof option == 'object' && option            if (!data && /destroy|hide/.test(option)) return            if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.tooltip    $.fn.tooltip = Plugin    $.fn.tooltip.Constructor = Tooltip    // TOOLTIP NO CONFLICT    // ===================    $.fn.tooltip.noConflict = function () {        $.fn.tooltip = old        return this    }}(jQuery);/* ======================================================================== * Bootstrap: popover.js v3.3.5 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // POPOVER PUBLIC CLASS DEFINITION    // ===============================    var Popover = function (element, options) {        this.init('popover', element, options)    }    if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')    Popover.VERSION = '3.3.5'    Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {        placement: 'right',        trigger: 'click',        content: '',        template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'    })    // NOTE: POPOVER EXTENDS tooltip.js    // ================================    Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)    Popover.prototype.constructor = Popover    Popover.prototype.getDefaults = function () {        return Popover.DEFAULTS    }    Popover.prototype.setContent = function () {        var $tip = this.tip()        var title = this.getTitle()        var content = this.getContent()        $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)        $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events            this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'            ](content)        $tip.removeClass('fade top bottom left right in')        // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do        // this manually by checking the contents.        if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()    }    Popover.prototype.hasContent = function () {        return this.getTitle() || this.getContent()    }    Popover.prototype.getContent = function () {        var $e = this.$element        var o = this.options        return $e.attr('data-content')            || (typeof o.content == 'function' ?                o.content.call($e[0]) :                o.content)    }    Popover.prototype.arrow = function () {        return (this.$arrow = this.$arrow || this.tip().find('.arrow'))    }    // POPOVER PLUGIN DEFINITION    // =========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.popover')            var options = typeof option == 'object' && option            if (!data && /destroy|hide/.test(option)) return            if (!data) $this.data('bs.popover', (data = new Popover(this, options)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.popover    $.fn.popover = Plugin    $.fn.popover.Constructor = Popover    // POPOVER NO CONFLICT    // ===================    $.fn.popover.noConflict = function () {        $.fn.popover = old        return this    }}(jQuery);/* ======================================================================== * Bootstrap: scrollspy.js v3.3.5 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // SCROLLSPY CLASS DEFINITION    // ==========================    function ScrollSpy(element, options) {        this.$body = $(document.body)        this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)        this.options = $.extend({}, ScrollSpy.DEFAULTS, options)        this.selector = (this.options.target || '') + ' .nav li > a'        this.offsets = []        this.targets = []        this.activeTarget = null        this.scrollHeight = 0        this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))        this.refresh()        this.process()    }    ScrollSpy.VERSION = '3.3.5'    ScrollSpy.DEFAULTS = {        offset: 10    }    ScrollSpy.prototype.getScrollHeight = function () {        return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)    }    ScrollSpy.prototype.refresh = function () {        var that = this        var offsetMethod = 'offset'        var offsetBase = 0        this.offsets = []        this.targets = []        this.scrollHeight = this.getScrollHeight()        if (!$.isWindow(this.$scrollElement[0])) {            offsetMethod = 'position'            offsetBase = this.$scrollElement.scrollTop()        }        this.$body            .find(this.selector)            .map(function () {                var $el = $(this)                var href = $el.data('target') || $el.attr('href')                var $href = /^#./.test(href) && $(href)                return ($href                    && $href.length                    && $href.is(':visible')                    && [[$href[offsetMethod]().top + offsetBase, href]]) || null            })            .sort(function (a, b) {                return a[0] - b[0]            })            .each(function () {                that.offsets.push(this[0])                that.targets.push(this[1])            })    }    ScrollSpy.prototype.process = function () {        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset        var scrollHeight = this.getScrollHeight()        var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()        var offsets = this.offsets        var targets = this.targets        var activeTarget = this.activeTarget        var i        if (this.scrollHeight != scrollHeight) {            this.refresh()        }        if (scrollTop >= maxScroll) {            return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)        }        if (activeTarget && scrollTop < offsets[0]) {            this.activeTarget = null            return this.clear()        }        for (i = offsets.length; i--;) {            activeTarget != targets[i]            && scrollTop >= offsets[i]            && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])            && this.activate(targets[i])        }    }    ScrollSpy.prototype.activate = function (target) {        this.activeTarget = target        this.clear()        var selector = this.selector +            '[data-target="' + target + '"],' +            this.selector + '[href="' + target + '"]'        var active = $(selector)            .parents('li')            .addClass('active')        if (active.parent('.dropdown-menu').length) {            active = active                .closest('li.dropdown')                .addClass('active')        }        active.trigger('activate.bs.scrollspy')    }    ScrollSpy.prototype.clear = function () {        $(this.selector)            .parentsUntil(this.options.target, '.active')            .removeClass('active')    }    // SCROLLSPY PLUGIN DEFINITION    // ===========================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.scrollspy')            var options = typeof option == 'object' && option            if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.scrollspy    $.fn.scrollspy = Plugin    $.fn.scrollspy.Constructor = ScrollSpy    // SCROLLSPY NO CONFLICT    // =====================    $.fn.scrollspy.noConflict = function () {        $.fn.scrollspy = old        return this    }    // SCROLLSPY DATA-API    // ==================    $(window).on('load.bs.scrollspy.data-api', function () {        $('[data-spy="scroll"]').each(function () {            var $spy = $(this)            Plugin.call($spy, $spy.data())        })    })}(jQuery);/* ======================================================================== * Bootstrap: tab.js v3.3.5 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // TAB CLASS DEFINITION    // ====================    var Tab = function (element) {        // jscs:disable requireDollarBeforejQueryAssignment        this.element = $(element)        // jscs:enable requireDollarBeforejQueryAssignment    }    Tab.VERSION = '3.3.5'    Tab.TRANSITION_DURATION = 150    Tab.prototype.show = function () {        var $this = this.element        var $ul = $this.closest('ul:not(.dropdown-menu)')        var selector = $this.data('target')        if (!selector) {            selector = $this.attr('href')            selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7        }        if ($this.parent('li').hasClass('active')) return        var $previous = $ul.find('.active:last a')        var hideEvent = $.Event('hide.bs.tab', {            relatedTarget: $this[0]        })        var showEvent = $.Event('show.bs.tab', {            relatedTarget: $previous[0]        })        $previous.trigger(hideEvent)        $this.trigger(showEvent)        if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return        var $target = $(selector)        this.activate($this.closest('li'), $ul)        this.activate($target, $target.parent(), function () {            $previous.trigger({                type: 'hidden.bs.tab',                relatedTarget: $this[0]            })            $this.trigger({                type: 'shown.bs.tab',                relatedTarget: $previous[0]            })        })    }    Tab.prototype.activate = function (element, container, callback) {        var $active = container.find('> .active')        var transition = callback            && $.support.transition            && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)        function next() {            $active                .removeClass('active')                .find('> .dropdown-menu > .active')                .removeClass('active')                .end()                .find('[data-toggle="tab"]')                .attr('aria-expanded', false)            element                .addClass('active')                .find('[data-toggle="tab"]')                .attr('aria-expanded', true)            if (transition) {                element[0].offsetWidth // reflow for transition                element.addClass('in')            } else {                element.removeClass('fade')            }            if (element.parent('.dropdown-menu').length) {                element                    .closest('li.dropdown')                    .addClass('active')                    .end()                    .find('[data-toggle="tab"]')                    .attr('aria-expanded', true)            }            callback && callback()        }        $active.length && transition ?            $active                .one('bsTransitionEnd', next)                .emulateTransitionEnd(Tab.TRANSITION_DURATION) :            next()        $active.removeClass('in')    }    // TAB PLUGIN DEFINITION    // =====================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.tab')            if (!data) $this.data('bs.tab', (data = new Tab(this)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.tab    $.fn.tab = Plugin    $.fn.tab.Constructor = Tab    // TAB NO CONFLICT    // ===============    $.fn.tab.noConflict = function () {        $.fn.tab = old        return this    }    // TAB DATA-API    // ============    var clickHandler = function (e) {        e.preventDefault()        Plugin.call($(this), 'show')    }    $(document)        .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)        .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)}(jQuery);/* ======================================================================== * Bootstrap: affix.js v3.3.5 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */+function ($) {    'use strict';    // AFFIX CLASS DEFINITION    // ======================    var Affix = function (element, options) {        this.options = $.extend({}, Affix.DEFAULTS, options)        this.$target = $(this.options.target)            .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))            .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))        this.$element = $(element)        this.affixed = null        this.unpin = null        this.pinnedOffset = null        this.checkPosition()    }    Affix.VERSION = '3.3.5'    Affix.RESET = 'affix affix-top affix-bottom'    Affix.DEFAULTS = {        offset: 0,        target: window    }    Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {        var scrollTop = this.$target.scrollTop()        var position = this.$element.offset()        var targetHeight = this.$target.height()        if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false        if (this.affixed == 'bottom') {            if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'            return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'        }        var initializing = this.affixed == null        var colliderTop = initializing ? scrollTop : position.top        var colliderHeight = initializing ? targetHeight : height        if (offsetTop != null && scrollTop <= offsetTop) return 'top'        if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'        return false    }    Affix.prototype.getPinnedOffset = function () {        if (this.pinnedOffset) return this.pinnedOffset        this.$element.removeClass(Affix.RESET).addClass('affix')        var scrollTop = this.$target.scrollTop()        var position = this.$element.offset()        return (this.pinnedOffset = position.top - scrollTop)    }    Affix.prototype.checkPositionWithEventLoop = function () {        setTimeout($.proxy(this.checkPosition, this), 1)    }    Affix.prototype.checkPosition = function () {        if (!this.$element.is(':visible')) return        var height = this.$element.height()        var offset = this.options.offset        var offsetTop = offset.top        var offsetBottom = offset.bottom        var scrollHeight = Math.max($(document).height(), $(document.body).height())        if (typeof offset != 'object')         offsetBottom = offsetTop = offset        if (typeof offsetTop == 'function')    offsetTop = offset.top(this.$element)        if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)        var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)        if (this.affixed != affix) {            if (this.unpin != null) this.$element.css('top', '')            var affixType = 'affix' + (affix ? '-' + affix : '')            var e = $.Event(affixType + '.bs.affix')            this.$element.trigger(e)            if (e.isDefaultPrevented()) return            this.affixed = affix            this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null            this.$element                .removeClass(Affix.RESET)                .addClass(affixType)                .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')        }        if (affix == 'bottom') {            this.$element.offset({                top: scrollHeight - height - offsetBottom            })        }    }    // AFFIX PLUGIN DEFINITION    // =======================    function Plugin(option) {        return this.each(function () {            var $this = $(this)            var data = $this.data('bs.affix')            var options = typeof option == 'object' && option            if (!data) $this.data('bs.affix', (data = new Affix(this, options)))            if (typeof option == 'string') data[option]()        })    }    var old = $.fn.affix    $.fn.affix = Plugin    $.fn.affix.Constructor = Affix    // AFFIX NO CONFLICT    // =================    $.fn.affix.noConflict = function () {        $.fn.affix = old        return this    }    // AFFIX DATA-API    // ==============    $(window).on('load', function () {        $('[data-spy="affix"]').each(function () {            var $spy = $(this)            var data = $spy.data()            data.offset = data.offset || {}            if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom            if (data.offsetTop != null) data.offset.top = data.offsetTop            Plugin.call($spy, data)        })    })}(jQuery);+function ($) {    $(function () {        // Checks for ie        var isIE = !!navigator.userAgent.match(/MSIE/i) || !!navigator.userAgent.match(/Trident.*rv:11\./);        isIE && $('html').addClass('ie');        // Checks for iOs, Android, Blackberry, Opera Mini, and Windows mobile devices        var ua = window['navigator']['userAgent'] || window['navigator']['vendor'] || window['opera'];        (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/).test(ua) && $('html').addClass('smart');    });}(jQuery);// lazyload configvar jp_config = {    easyPieChart: ['../libs/jquery/jquery.easy-pie-chart/dist/jquery.easypiechart.fill.js'],    sparkline: ['../libs/jquery/jquery.sparkline/dist/jquery.sparkline.retina.js'],    plot: ['../libs/jquery/flot/jquery.flot.js',        '../libs/jquery/flot/jquery.flot.pie.js',        '../libs/jquery/flot/jquery.flot.resize.js',        '../libs/jquery/flot.tooltip/js/jquery.flot.tooltip.min.js',        '../libs/jquery/flot.orderbars/js/jquery.flot.orderBars.js',        '../libs/jquery/flot-spline/js/jquery.flot.spline.min.js'],    moment: ['../libs/jquery/moment/moment.js'],    screenfull: ['../libs/jquery/screenfull/dist/screenfull.min.js'],    slimScroll: ['../libs/jquery/slimscroll/jquery.slimscroll.min.js'],    sortable: ['../libs/jquery/html5sortable/jquery.sortable.js'],    nestable: ['../libs/jquery/nestable/jquery.nestable.js',        '../libs/jquery/nestable/jquery.nestable.css'],    filestyle: ['../libs/jquery/bootstrap-filestyle/src/bootstrap-filestyle.js'],    slider: ['../libs/jquery/bootstrap-slider/bootstrap-slider.js',        '../libs/jquery/bootstrap-slider/bootstrap-slider.css'],    chosen: ['../libs/jquery/chosen/chosen.jquery.min.js',        '../libs/jquery/chosen/bootstrap-chosen.css'],    TouchSpin: ['../libs/jquery/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js',        '../libs/jquery/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css'],    wysiwyg: ['../libs/jquery/bootstrap-wysiwyg/bootstrap-wysiwyg.js',        '../libs/jquery/bootstrap-wysiwyg/external/jquery.hotkeys.js'],    dataTable: ['../libs/jquery/datatables/media/js/jquery.dataTables.min.js',        '../libs/jquery/plugins/integration/bootstrap/3/dataTables.bootstrap.js',        '../libs/jquery/plugins/integration/bootstrap/3/dataTables.bootstrap.css'],    vectorMap: ['../libs/jquery/bower-jvectormap/jquery-jvectormap-1.2.2.min.js',        '../libs/jquery/bower-jvectormap/jquery-jvectormap-world-mill-en.js',        '../libs/jquery/bower-jvectormap/jquery-jvectormap-us-aea-en.js',        '../libs/jquery/bower-jvectormap/jquery-jvectormap.css'],    footable: ['../libs/jquery/footable/dist/footable.all.min.js',        '../libs/jquery/footable/css/footable.core.css'],    fullcalendar: ['../libs/jquery/moment/moment.js',        '../libs/jquery/fullcalendar/dist/fullcalendar.min.js',        '../libs/jquery/fullcalendar/dist/fullcalendar.css',        '../libs/jquery/fullcalendar/dist/fullcalendar.theme.css'],    daterangepicker: ['../libs/jquery/moment/moment.js',        '../libs/jquery/bootstrap-daterangepicker/daterangepicker.js',        '../libs/jquery/bootstrap-daterangepicker/daterangepicker-bs3.css'],    tagsinput: ['../libs/jquery/bootstrap-tagsinput/dist/bootstrap-tagsinput.js',        '../libs/jquery/bootstrap-tagsinput/dist/bootstrap-tagsinput.css'],    datetimepicker: ['/lib/jquery/datetimepicker/jquery.datetimepicker.js',        '/lib/jquery/datetimepicker/jquery.datetimepicker.css'],};+function ($) {    $(function () {        $("[ui-jq]").each(function () {            var self = $(this);            var options = eval('[' + self.attr('ui-options') + ']');            if ($.isPlainObject(options[0])) {                options[0] = $.extend({}, options[0]);            }            uiLoad.load(jp_config[self.attr('ui-jq')]).then(function () {                self[self.attr('ui-jq')].apply(self, options);            });        });    });}(jQuery);/** * 0.1.0 * Deferred load js/css file, used for ui-jq.js and Lazy Loading. * * @ flatfull.com All Rights Reserved. * Author url: http://themeforest.net/user/flatfull */var uiLoad = uiLoad || {};(function ($, $document, uiLoad) {    "use strict";    var loaded = [],        promise = false,        deferred = $.Deferred();    /**     * Chain loads the given sources     * @param srcs array, script or css     * @returns {*} Promise that will be resolved once the sources has been loaded.     */    uiLoad.load = function (srcs) {        srcs = $.isArray(srcs) ? srcs : srcs.split(/\s+/);        if (!promise) {            promise = deferred.promise();        }        $.each(srcs, function (index, src) {            promise = promise.then(function () {                return src.indexOf('.css') >= 0 ? loadCSS(src) : loadScript(src);            });        });        deferred.resolve();        return promise;    };    /**     * Dynamically loads the given script     * @param src The url of the script to load dynamically     * @returns {*} Promise that will be resolved once the script has been loaded.     */    var loadScript = function (src) {        if (loaded[src]) return loaded[src].promise();        var deferred = $.Deferred();        var script = $document.createElement('script');        script.src = src;        script.onload = function (e) {            deferred.resolve(e);        };        script.onerror = function (e) {            deferred.reject(e);        };        $document.body.appendChild(script);        loaded[src] = deferred;        return deferred.promise();    };    /**     * Dynamically loads the given CSS file     * @param href The url of the CSS to load dynamically     * @returns {*} Promise that will be resolved once the CSS file has been loaded.     */    var loadCSS = function (href) {        if (loaded[href]) return loaded[href].promise();        var deferred = $.Deferred();        var style = $document.createElement('link');        style.rel = 'stylesheet';        style.type = 'text/css';        style.href = href;        style.onload = function (e) {            deferred.resolve(e);        };        style.onerror = function (e) {            deferred.reject(e);        };        $document.head.appendChild(style);        loaded[href] = deferred;        return deferred.promise();    }})(jQuery, document, uiLoad);+function ($) {    $(function () {        // nav        $(document).on('click', '[ui-nav] a', function (e) {            var $this = $(e.target), $active;            $this.is('a') || ($this = $this.closest('a'));            $active = $this.parent().siblings(".active");            $active && $active.toggleClass('active').find('> ul:visible').slideUp(200);            ($this.parent().hasClass('active') && $this.next().slideUp(200)) || $this.next().slideDown(200);            $this.parent().toggleClass('active');            $this.next().is('ul') && e.preventDefault();        });    });}(jQuery);+function ($) {    $(function () {        $(document).on('click', '[ui-toggle-class]', function (e) {            e.preventDefault();            var $this = $(e.target);            $this.attr('ui-toggle-class') || ($this = $this.closest('[ui-toggle-class]'));            var classes = $this.attr('ui-toggle-class').split(','),                targets = ($this.attr('target') && $this.attr('target').split(',')) || Array($this),                key = 0;            $.each(classes, function (index, value) {                var target = targets[(targets.length && key)];                $(target).toggleClass(classes[index]);                key++;            });            $this.toggleClass('active');        });    });}(jQuery);
 |