diff --git a/inventory.yml b/inventory.yml index 81076e7..c71b9ba 100644 --- a/inventory.yml +++ b/inventory.yml @@ -1,649 +1,686 @@ $ANSIBLE_VAULT;1.1;AES256 -62386339393366643763383339373037363365316132633835363530353330653839303732353335 -6231343438366132343632383066386163336532373633330a626636643034633261373662313138 -37336632633465646638363763306436333566376133656237373731613539363530656266336339 -3339313039373766360a306631373166663330373233343762613631636432306333383265313639 -65656638306665313862316137383939393336303633646463316536646162323563383263623637 -39323134626333333661666636326636313263396663653864643262373733326535653764313065 -31656135313263313535386364623237376336616430303737306534333839326531383964636264 -36336164656636366431346434643536663361313634386233356132633133666237633037623439 -37356136383063356530336230373231623062306163646235633633623439346634636161623062 -30383438663361373938653630653562366436303235663963363631656630303165386465396632 -30313639633364633439346230666264363762646264396336663934346533353562636437316461 -39636665346565343437303032313761633536633266653866643235316464346533666536316664 -39346662373338356639613238626237353737363533396330653239373033393665663263353165 -36626265323266333337363365356538393933616266613965353662323263353832386264363337 -35656631656365366132303465306432366235363931386238633265656162396632656463316465 -66363734663233663866656263353631323762343665353535356561313237313036393138636163 -36386562333339373832383364373465323862616661343865646662626331646639646164313439 -30333239346136303432323035626135623937353862646562373336636134633034393837656164 -31373932323135353836646236316163343966643731343831333033386338393737303264626134 -63373862383732663462656639643335613232633839386434633832636534376133376432643638 -31353136313538376531613239373965303730323536393039633861393338323861306662313639 -36366636396364386136663865613564633566666262656538373637383133376333623934666262 -35373134633133383535353436613932333466383961313361333730303164353463633531356561 -34626335653335306435333364636235623862616266353961313138663032326338343665343035 -66393562373835656634326164643638623364333239613363333138303938616337623366346663 -37343662663239396666633038386636633963613934616461363664333631663663316531626266 -65636661306635333839393835363839383763343164616631666238373737666366323232346234 -32626630626564353433393463626566383331343365396336646239303462633665643439633538 -36383365356435626237663630353364396166653365653363663362663838376532666236316663 -31393565363962316632663463313063333331316564383031363939646361363837623037626630 -32393761353066316663316165666434313766653666653537326638353165346438663565323836 -62383434616266366336363537376166663261303834353531323835626463326132326432336338 -39316464373362646333663763663334363035393336366266356639393735373563616130343931 -36383862363162613161343836313737363663353763323831306561313931343835316565326661 -34383236626335316266646362333535626338303962363632373663653136383138336263393435 -34326638353762343132393537343166643630666433386538326634613862313831633361303732 -39363862306562313765303066663932636531343935383466363738373039306135646162613164 -39386464623439356635366666323433303235303866653962363932643964383432323064636334 -63356231623139663661353364666432323335613738346130343536343633396333373963636234 -33623734323966626532663030646362323765663661383364613734663066313363653566303965 -64313136336236346430663636656634653039626165613631636532323164323330333263646366 -65393337353136396533393961613738336366313138373432306263393362613735336137393763 -37623365616139613638623664333039346533646638353538346464633465663634373463653963 -31366632306437616435356339633561346237373833356565663139363534373037626566356339 -62363739653934636635386465353163346263353034343861656135336435393930663561396634 -38393335303633326330373066623135336530633032653537366631343961346639656539666231 -62326134333364313237373035363637636265343236383931303438356463366361363936633964 -36393865626137353064613336656637353039353061353532663230396462363431393636663239 -61346565663764363666393034633239613431626133656134393661393435333334633736623730 -37656334656131623038363761343863643966313730316330363061326336353839623833643635 -35653333663239363436326131663537613735616632616165316435666134613862643265383638 -64323637623364313564313730643766376138663436356530663236313133353161643336663163 -34353735386433363362393336366236303132376235303163363231396266306462643261643730 -64333938353166333664383865616262383935666531633466653832383237623566353738376137 -63393937656235336432343163313933303532646432663437383635386164303039386535393334 -32356462626633623036616531383636633533346537316132623438663365373966343831333061 -33613431383038623162656262333031386265613561646530653737363339383631303137306131 -65643961393138373137613637396465346432333266303838653935373061316532636466316439 -62343863626564656232316236373735303734623933353634643337653036353639643139383462 -36616134373065616162336235353564663735393332636166306133373336373139643466653262 -62373735303130376534343930303532316332313737656434666665346133383534343066623634 -39383332626337323061373530666137333133653237353131363261366664623363393864616436 -32356238343137336430386262633962626466623438323437376566663666623236333432316532 -37356138343132393362373266396631353138373639363062623135666631383966313761303635 -33366136303632303965353634626334653533633737313032383036303430656662636230336137 -65653163326631636437363436663163376465373566366665333635326437376438633665336335 -62623666363435396561346436383433633936383261383639326535623861626539653833633738 -35626462383733363162616239343261346239303964376163636433313663353831633838396561 -30333331363336663336333937306437643332643332333061366638313837383532373036653461 -38316233346532633266373438336563613835316634396664663738366138613039616338353666 -62396166643461623136656266663637343862633237643665386530656436393363313134383639 -62386139663035663363653763366139396632656639623065383466633939363433393339323664 -66316138383238313562396462633731323037366461616434333865643363653339656364633265 -33613234613766626461366430343663633864363536646664323230323338383130306633613165 -33336133363466323062363961316632643133303962646230316336623731616230353932316562 -66303565346534363030323763336562353061633230373230303465336562396463376464643637 -63333137666562363135303264316332323031326638343032313934626663373362613133646334 -61653130636266633034383538636236313033373334613336356533633936643933336365346133 -37626263623035646232663433333532623031623462386336383032653735333335633931363733 -37386435343331393133333937626431303330613261396237306262623563633632323936316535 -65353638396430373937393536333565363830303333373863313762343465613861383262393366 -30633261326638383538623662653839393130323539646165646439613039396135656161656532 -65313662613533336161306639663131666132313037393338303261636433646434633761376538 -62626135633733323063316230636534393334336634643330323037393566303838336137313165 -37636632656338383664323264636132653432346164323533323739623730343937633938353735 -62313035323830303964363665313235313066336330336231613833316138326234393331636166 -37383731613537333464303431663236393933656462623165356335623165616661373665326235 -30333162636437346465633031633734623366356466396262613139623262326631666638326635 -32373631633234323365386532396561613366643139613539323266653130333537643465396563 -35346638326265343564343733303535643230663238336535343937626463343537653666663030 -33663563653865376135666633396164373332326336313130336661633136613233356237666137 -65306431636535356531333566303065643065653963313763393066353630363135336365656333 -63636239336264613161656135303633636336646531323534623063333439626331613138363239 -64656262313936616161326564663632653037663430653635356533393134663331353130366235 -38366639623662663230343039353861626432663933633137313238633332353739396436373633 -37353236363164306130326662346230336135663861346532383139663362656365646430373038 -61353932363561656537633534393430363236383566343839646231343730633864613036643530 -36633534343164376466336161333833653136376664353661346436353233616430396230386437 -64393430623864646334623137343537656563313865323336643064643766633035653265316539 -62636434653931613337336337383066373235653335656161656438373165616561323765323931 -31353661373532626231656361623038626361366632663764333764663737363137333732613234 -62376437393637316663353739333935343866373164333364346165313632313639636139356535 -38343639646362636635346634363064386636623635663536366461373431343362653839383138 -34323737313832343963366536666234363439386337353838323233376464646362343737313665 -36643237316238616265313332303162383033323363396330303766313734353563353133316530 -62643032326237626433363932666164336161346532646634363564326432396637346665636637 -36623561633861396439623835376434653738623862613333643162343362613865323363363434 -32633638306438653638343239383137396530356564356338623330303661663630656639666461 -62313232343461633636336538326537323266666466646261633336393464306438653136613637 -34336133623361336563306462373963613336383265646637313139653765656433346238386231 -31646362353736646431303937633033386435316336323062346235323232383466313566636162 -61366430313335313161333163393164353530303938386435623830353962373831393235616531 -31656565633534666164303532633235306133616536646161393365616231383866326635376630 -38666363386232633865366533373630356139393030626230653834613230346664383734616336 -39653736633237303161306632333138646633356463373063663064396561613162663138366339 -33326235313165343866363234353336643934656363383464353036353138626638373362393263 -36326438303366623137383530393434353933326163356634333837653830363037316565626466 -36643339376262386430383530343934646361303831633863653765303530373765336531326535 -36646330366635366339303731376662623366636163353738646535363363326437623439336466 -39373861323738363734613032383136313335306462386436633962666139366165343263616338 -64306536393966613235376264383463313763383161343634336362393865373865383366313839 -65623761626166366437323234373130393237643963376235316535646166326663646335353036 -62366562386364343734313261363636636639633639663830666130613833383766316461613236 -37653030326661623838643861353339353562366537346535363065356235393963376331623064 -36316464626439353464393638373963326333373037333761663239343431626563313735363031 -33613663613038326465623462623565343963333064623464313039376332323935353736616262 -66646161623564316439666431393462633463633432643763636535326538356135663535383734 -30323063323361376165626436633632636234653062623337346562386338663733396532323331 -61316539393566306334616435343665623931323866313636663033663161383964646430663263 -38663833303063356637343130323362313734646564633261653934666665376661653033373934 -64393934616465383964353464336136636436323563366562623839623862366332343339613334 -63373063656663316138653939323165383735623263646438376533316638623734636261663035 -33636465396431356334383063633866623063316163343262623831616137643165366564646532 -65303033313137636562353238663564303034393166313864353330656335663233643763626239 -35346334386130653462343531336431623639376165653263373539316163383038336636613136 -30626137666133623063376333646134643536653138333464623930323931613461366465633437 -32386531323739343363373737326263323836333438356133613065306633326131343838333363 -62356331623163393230373838383866323063633739313339353839336232363430323165666531 -34316231376232396464356436326165616266323430313632393362313966376563613534633339 -61346532386537356262633936366533376239616531373133353633336235316534363436393238 -34373232383665373539346664316463613962383961386530323539313538306165383038333736 -31343463373938636630336364653931343931363461663261373333363336353438613266333232 -66316333613134363630366632623861363135373335613837653937666466623163613231376431 -61623964353534316464373737326134666538393662323663306563633430616363353833373131 -61323563653235646139623139303162616235323664613463336364326638363762653665666433 -30656634393965306436616261303330313037373030353266383833326539626263326462363833 -36656538663733313533653864646232333934333031363433613839323632333166313162646461 -32653935393738646163343263633563333132616436613930613038313462633735636131653265 -64663439323665313130653931623564373737616632386338336465363564373233616466393934 -62373763326533343830366438386430306166323834646362313838313662386637613961643138 -38383362633730353730333335316439663631396430623135313565313431646465336631613666 -64316638646531356563666631626663383939396461313631366462326161643730346436633734 -63626633303336626137333565306664616363386162316264636331386134633461636162333835 -66326139393733373262343537323136633233616331373730653966353736613538633430643264 -33623731366330323161643230393635646366623139326534353561616632636338333232386431 -35353539333831613064626165386536636664373933633833363736613335323434383663336561 -34616130656232326631613835646131353936326631396334663335386236653066326564656238 -33623065303039666461383864323031313737316565366133326136333138393731653731663036 -32663135323464653030626430303439353030393865316266383164616233613039613032353130 -37326430373439363631323061333431386430613361656439303734393730326264643731326638 -37343836393439316330653432303633303439623337613336626662323338633535346563343938 -31333963303866313763666436653265306164633731376432663634623131613166623535656362 -64643232383863633261613061373131313933626666643631666238663931336566343561333439 -66653939353665363065656631323130326664343464303338333161623639383962356538623237 -33656337323733353738353034636138656138373762343336316336346264393434306338336136 -66643966336130346263643232373334626433326334633363616337343466313438343133366637 -35336561353531306164316639643262316235383631626636633133343837663032343032613362 -33356330343833333438663465363364653633306134646537656361383864356461393963313666 -33316236326665346233653331663132313531663263623762393039663365303333663231373262 -63643634363762393863303739626162636131366564623333373534316461383861646332373532 -61343736396465646538363765653864626636376361333935366536343133666432323530376333 -36333664326538336438323138393561616536343932363733316164316133656631333233626562 -33376234663863623365373365303936376164373530653839393631303732356662663536633135 -36326439646465613363633233633836643162333164663266393161626231393138616538643738 -35303532636532656266623434333162323230646636366334663238613733326237636232623763 -37643066613361313436346531373835343131613061326366643638396633626261303630623338 -32313632653336316531333065343830656365306430623565393935333065663537316130633936 -66376231626239383165626536626564306331623935336331666662376264643765396464323135 -38353438613435333864326633326530623036396665313762613865383365366137303166306436 -35646238306262613432333434346639393939333264656530303637393566633934633062666661 -62646537306132663164643663313138646639363131346133616366313137333965396137316433 -31613439613433383663663666313237613336326134343437373637363038643332376532383339 -34663735386235313532633431313630366537326135366132373063333035613939363832336433 -65663230626536666565303031663062356639376538396531346263346139386436633434623363 -65323462393138313932623239373132326463323830616237323665656437336562333666396366 -30313632363138666534383631313366653532336238303036623235303866643632663335653066 -32616363326134343038336431393436326565343732646438333336386366383066346231353833 -61363565303737346561643938666133363565383632346465656335363864386236393432633832 -34663863393063656562623134316235366536663638653563323465666566613464373666376530 -37366364633537666231653065366664646632393638663535643931633264616431626366626563 -66656561376664303838653437306433666131323761323639663665376262386564336363376638 -32343661326138653734316161356130313636616434623434613765386538366131353036643532 -30353237323831373562376332346466366437643165633738623066636563393036623765376639 -38303135306563356533663238386233646636306266353034343433383830383330653032663130 -32313932303338646637363762653232613138373665396436336264353534623633616138383235 -30373433626332653032343937653964373161343462393139336235396439303739346330656166 -31643936333139656232353932326531633566363366306466666137623832313435333161366331 -63333432383034396439323466663235656536663831643035626332373234643837666630626332 -64363531306531393737666230363631336666366536363464353266303633663563316234653634 -62313135346639376366306463383837636531353564306530623134373236613635303132383263 -32326663376138393633383132643964656365633966656231376439316165353630623764326137 -61303234646566343863653130343738373331373433353732663837326334633530666636326434 -31336135613431326131353864613331643137396661333566303632336661626134666565623133 -63383865646464613537383533636462333133386639363837653436366237666164613639396666 -30643034306330393062313132663661636163383336373134663130666132373534383734643731 -30303163353563306465383134626137376630373731323939653531356436323337616662653565 -61313131663262636437666531623466623438326136653332666238336566623963343334623266 -39663134636666326261633634383264393662383733353663343734306534363934356165663638 -62623437633031663364306231663162616630393531346130333764656431616161626466343462 -64333865396463666161363134393932613636333330316136363737336130343663653063623036 -36393038336462373933313934353939336132313135623534393361656639333864613637626137 -66656331376235636661363534393163336439656264396663373665383737633263373934643231 -61316436343539646662316639343662336438383335383838373261643838396439316632653838 -64643135343938366236626463613036386230316263376165336232303434656230366561646164 -62656466396439666363613634366633623935376630313034633230643162333334313436643930 -34333837353937636339363364353333326238343536623131333561376230646237366437333836 -37613363663663656266326439316334383837613633336339396335396539636562636334316338 -61313536316364386262666663396261356538306536333761633763303762363232313332373438 -65316263353165653336343562343164306566353630326333653664356165376361326366333964 -64623261393636626439343738653731663130643839306639663239623834366364613832326233 -31396432343136306365393132613531303632656363303833313139363939356132393230633966 -39383432613135646435396262646461623735313135356230383533613136656639643539366233 -34306231313032303537626532316263663337303362663635323731333561343933663265373639 -39313461353561316539643436343764636665316233303438643736303464363839313135633333 -38653936663234663830313632623566336333633561656631336132323231353432323031663863 -66613363343431656437633631336638383932653336303762613730623534633936306333646135 -61613261613932653361623263656237643534326132613339653861343666393466613439303734 -31303430343132636332343134303936366262333566316638636233656330333734636636376164 -36383536313534306535336438633435353463353630326461336366666535313638363862616136 -36616236353033343566626332646133656235623162633736303762306430336238663835653263 -61326466663161646531383137333439656531383566303164366637656661306638623439323164 -61663163353263373864323734373434303530643764633762303139333336323832643063653734 -32373266373239366633636637613433336532663135626238333936353431343532316536653061 -37393131633066666637623538633530653730323362373432656439333332366638336361666239 -63646631633762333938636338323537343734396133313332393436326630383639333034643961 -65643139303531376163613833666532333734633438623935353635613635336262373432636462 -34323738386631616266313462346265356164316238323239646462643762333166666132633965 -37333535376235613538363938353135616366393964346164633861396331633139613463393035 -31313262356436646261636139383431643637383235623334353861343064666437356465373339 -31323364646635306163646131646339383931613461613330636561313235663934376632373132 -31633235346339373763303138356464646231373266366431633038646533616161613462333231 -65623835353963376532313535306331636639643635323434323362326462376239383630663962 -32393634366233616133323531633030336635623134393730626630636465653065633462666661 -63363637326139333030633333626531353866633839376661646437353939316166366137363865 -35383536666462343135623266363939623335613632613830316432343363313538623364666634 -37646531346433336365653935326437343461323861336133306233613931636231316232643034 -35396539373663633237623862623964383463613936623061376333323439653963633861663631 -64623866396263663038373561656239643664383233336433623036393930636264303662643434 -62366632323864633733626135343339623030636334356331393732363139326662326563663366 -36313262323933313631633562343230363032656636666465373062656664333964323537633362 -30343266393230393665626463316639336665383763343332333339383464333533653135353365 -34306135613839326361623663633033623238306234666564626565313137326431383763646433 -35316339366234353936326466363435323331353165653531373733643232356236383838303930 -61373538363238613635313031653434396265316434353335386332666135323366393062376162 -30353730613433383364636164306336396430633133333839383261366162363930303131303762 -32373461396264643232623337643266616562393865393864363161616337636436383131643932 -61316232313835363634353930636664323539643133333632626631666430363534383866656631 -30656634333836623133623731373861366333643637336566353064393332626461376334333733 -30383164306561383738333238353766666565656137643661623466313535623936353831303863 -64653762656364356664383365343264306336663563373763316532303537336138613238323438 -64376130656466393564613766633036623336393931313132393430313663373334353134363030 -39646665306137613034653830666437333832393464343265336162393231386437303539363861 -62333032393134666331363030336463363639366235656266363830653337333965303934626530 -31616532323334383665663936376130396334656137623537646663346166343262353764653439 -30396332346235653462633034653535396361383934646632386534643530313134343034323636 -32383538636537316532626230363361313330653534353962363932326331323966303833386330 -34623632356136616166636434633437356261313233333165303237346464396436343931376263 -39633963313062623636663533316538356162613734373830363838346133383564353336613437 -31643233343437393765376431613338383331363632613632396265656638646434663631303363 -35386332343033623534666530363831343262343736333366396238643030333337313838396534 -64633937636332313432326266643735383262643334613034643465366666336638393461616361 -31383038656235653239373164666265663865666537663335396137353939343233616435646362 -36393266633863393965363163376332383837626532343034363034346665343663326163653266 -61666236653837316639333832636536353534626365333939343734633863613032666437383864 -64326234303438363434626566306435376237336137316465626432383234383434343666333332 -33363333633132393265313662313731353162656337363730366439653532643438333639393664 -32623561636531376234613565323661613635623337303963653862393435663562333137383531 -37353532666639326334366133376162646262666439616135316432333934656631326566393965 -61643135653965343032316339353433323636353734313834666163633431366331393035393564 -32313966346634646263623130653934323736303364653930633439343339343432346538303831 -62333462343533386166623831383437373732373037356236376530353639346662663930336235 -65303564313939373532303137376565356364353332663961323366323264353738306331353963 -38343333653764323835303432643230663733643132333866303039656136326630303962643963 -39343737353166653862333030356533316165343766646231306532336530343964633136326563 -38646330386438373931323961653832613638303261653333396337623331323837623431656137 -33373631336462623531326438323739653662613139393866383263343134633335383738656363 -30333665663063373661623761356438633262356334373262613934333064326239376633633039 -66613534326662343435383438306133613765326361376537663331323938623436636164366135 -35323730363036643765376537336432333066303137333534353537633234626666336334333530 -39396133626434383132373435343165383563383564323864333639623764633064353131633165 -33333862613538363233633735653730326633346563383732353563643862356561616261393731 -66373662353937646462363262363865343531366463393761316665383230313331626630326236 -32353439323039316335343237623730393966356132656534633933333737653935613932643231 -63366163373062656630316661623131333462366564333462336333663833666363396639373936 -64613530383861643339353965666530663437356431353731623464336461383030306563393262 -39346566306565623331336234646439316461646366636566386236323464303138306663373265 -39346135663264366566623731656532323236316130383865346136353238353534303736363635 -34623532363033656437656235643066316364333164626662333536396631653531323437643564 -66386635653436616461633162316165343638326264303066633437313734383666623636666538 -66636634306532393339346633356431303537636364323832633737353139313138346632356238 -39393634666138383339323335306462623330333931326266366135616666613533633531653539 -39646535383666646662653936386231616230306536396432333536313834646538643936303366 -63666431663965343336343362356465306461313532616462383233316261336439663936313639 -35663261656534613634316235663139323937616261333530393235653836336138353630636335 -65616236366233626336356566326633646664356264313736306665316434613535393535353038 -38356331343436626230376334303138303962316231636631656233396231336437346435376532 -35316232306137333332663236393631636436633736353962663332626233363536633733353436 -62613565616332353461633930333636616164656635663064623463656238383430386135353030 -63626534393930663462323634343936346261653635636430616564643630313836316135646638 -36613363613238626364393434383966376430373838323461653131323563346364656330396562 -66373231643732316138383236636535366339623865393935383364373765636335656139396261 -35326339343266663863636361386431623238633139396264613166343564353236626237616161 -36626233356361666530323632393437623238663835616539373939636434353966643734653835 -30356437353566323266353233646532383335363366636333336335363634303038633965376165 -38306164663837366633306633393163356564643533663134653439663666316366383666623536 -39653666303363346131383064633835323261343361396462343566613237313732323366373864 -61313762353737616633633538616162353761353131636336623265313861616634376434363961 -36366662313737653465353363313537376361613534383563303764356136393563306230613466 -33356437613965633661336164633239346666636137666332303430633766643036346439326134 -30376636306436376564623338636231366536663530353537356461663864323234663530626633 -63656535633336346631386163643138326638663061373331623762376335646661316362363636 -36333732336138663034386139326566616236373061636661373038306135613031633139666635 -36626333646631636437323334653164316335396532396536356261346438383265643535306362 -62303034303161386465393062623963303131363165343066633765656431303035646664306661 -66333531383665646166393130386463323537386237383632333431333265616664323364306564 -64656463313133386330393266633932643863656436396265653161323665373861393031393338 -33373463303032326231313035646564663961363031613362356635623030376465383337373033 -30336263326364613633656532613439333631343665353866616263323137613163363333666664 -61383831616630373836343233373935633262383136663931643539653337643232363132376364 -65353662343539373437633133376638653633393864343866633865306231353264306262313261 -33366332316531616234333766323232343336613564313135656531306535643430636666346234 -38343532653666636235373366356635343339346237386436633234643738633033383664366264 -31396464366363323937333834626230383038653434346361316166343930366536373761353433 -62313638376132373661316436333430653735393737383235386164636535386130313533633830 -63616335643233373165393733613266646138353437356666316139633933346565633561353734 -30656261636265306633396633383638646233623164383236343335626432613866653834616434 -37663861373062653061316631373064336663353061306261303733313632373163326261663262 -32396263613639383534386236623836303635613631393763313130656134656236623238353661 -38643538343135386131393133336237373733613238663763653431636436376232646637386339 -37626131396237396239323031613265306262326466656634363266393064326631383633656338 -31313130343064326135616433343533653563666663393230363735633239363537376463663466 -61353865333361373538616236393235613366333635633664333631653361333962386462373761 -30313066356564363432363739346430346633386436613739363939336665636239323930636130 -61633639363635353333356266383661313638353162373535613165333063343332383231633331 -63313339306235303361393362333635313331623365666166383937313663376261653838376563 -37386237393762356339663434626639363666663931613832653539616630343137383230346163 -39326138383165326131616639623033633164626466663439386333393231373537616439326161 -33366634313739346266663564343330653062393139616464393634313234336165356338303439 -34366537613163653339373062646431643537316635343438343031613937343734356130636230 -35353334323130303439613233333439303234313530343861316261613036326266396134393938 -30393032393864656661346464666262343431386364626662353736343234363861663437326532 -65663835306366313362656135386430666633383165623965663838646433613835363836643365 -62373730343831633033613631396535333232333331636163366162613131356132643835663766 -63643531663237333935393330353733323730643732386362333734316632636265653731663039 -37623365336562623766643833653533343238396139336231326262326330316338343738663031 -37383334333634366464653836353238373061386334333437626537616135363736313364306366 -34396636383934306664363835633965353463333465333966306537353735323564643565623261 -31343932316537346561316662306139343266636463393130653434666666393338366531303734 -66323965346632306535623931326133663161663464643337373761343661633763393666636162 -66346566383937626161633339663732666436343437386233396332633261303533666436396430 -64303566396530616365613935623763323962616564373130383637623334636134623637326465 -64303037333035303930616133396336616432663338396634383037323238623961353136323965 -31326266383838653236616435313936396537323761636436626539323336663037316161393433 -64626233323935396232636337316634623037656231653661303462333961346230666230313834 -66626661643231386135363565336437633738613263636364663336313137376635396162366235 -35316638353430393837386265356465363834666366636432656237646634666533636631663530 -36656434353038626332336263353832376563363035373437316262383733326661353762393934 -31333532656666343136343635343435386337363962363037336331623239373035633631346337 -31316231623761366235303538336339626134653238343132343838346363353266346239353663 -64613566313263626537333830646439396536366135346362333162366539363537616332386262 -32663862313739316330636334346664353666363933623563643365383630373866656537633033 -39373331663663623831383830656237653034333932376263356566613162326566346537373632 -36356161643766343934643636633633363135653537396333613532656464663535653863323066 -63393662666463626635663062386430336233613637363263306564353563616439666436656162 -62363330376430336663393565613736306165336630383336363263643032653062346661343766 -65646537343063663864333933363938613438326163353235306239346236656561346264343039 -32616331373062323066306232383030373130303565666463326434383331343361393331343039 -65653536306538353830333434373433333030353465313866393966666434663238323232323364 -30343535383631313431636462356630323439323965353033383536363866323461373538666332 -63623935343665323033326432356432323730353864646431633035363831313735623063316465 -34623064303864393365373635353263343033653064313163633936366564616661346532343138 -66383130396232353166613531343338636664363164613165613737353762333466616530643937 -65666530363165346331356262363065653861386261623566346135383030656163303332323436 -63306137623430613661333733643161386138623934313863643561313061363061663435353335 -32353362663064613364653236613862383830356431333839636163623432346638303230666438 -38353766646231383436636463346436393561613339316430323463363731303762353330346532 -38646130663862323466326136313332306561613933646637366235646338343161666161383431 -37626230303633303664366161653437643331386435363631313935643764643835383662353536 -65626132313961343564373538396237363934343335633231656362316238633030623365663063 -30623232663930643639303437336563363131333531333238333663333136353964363439363836 -37376233646330323364363764393732326462316235393633626134356138653430346537393764 -32393739363637376534313836346239626639636332326666386334636234353535623035363266 -64633661383438363336656539373033313635626239313232373233613764323665663762343461 -32343938653135313863316233376632396666366636643036623566393739393537333235396239 -34303034396138656531343662613838316363646461643136643432653132306466623837303532 -65316139316432633039373239326539383165313430656364646336333863303464643961346363 -36623830363235316436306563313239636463613537623962393061616632356632356136646531 -66653561323232343231613863356466643030303066396665623638383662666465373833343733 -31356563623761636630626630356362646164373662383562613264663966326631353237366130 -34393439356263383732643665323431653738633236313539366535396664616261333232306535 -63306662346465303835616666333434393361306462653861323430366566353435333231353935 -34383264663930303662663462626535346130613033396435653934633933366464343166306165 -64623461323365623634346463386234386561306339613461613438663034333334643365343531 -32303637616336616463383566386139323639613731303263646162613262343531306665326261 -66393038653234376132646136613263383531656632373631326361313332613739386465343935 -37626331633063336232326333343037646432323265326131653665333863653337663961383737 -36663361663232373338623931393538393461646538646565323730393562353836623263343832 -38303333386363313634643930663832656262616537666531393536656664303539306563653265 -64666538333135656132643637346666353930356635393764333538396662316366353166376433 -33626232383666343030363263626266656538616562663735353534663164376434346631383762 -31376561376430333036393131356564663737633064616361353038633839656164633536613631 -66646665613132623062383465623738363330633039373135343333363039643332363331333365 -36306636373238396430336530633763613332336432363933303733346133653666373132393063 -30633437356363666235326263386566643062343534353238633062393565633838623839316634 -62323239376532383163376237366431313734366665646161626232616566323631383536656632 -36653535643537616230626633306630383934373135363538656339626432666563663638316363 -30316262336461303438643964366434366332336535343437666432663566323761306563623261 -30633965623530346165633936616366623536666230363130386633633061343730373365303833 -66646334646634366433626331626137386531323661386132316235613966663730336432333764 -66306532303566333834613537666639616663633466633633613832363164623536373738613265 -38323038343862323166663533613830666362353630323035336235393565663230623562356166 -64306331363234336433323364316232653934366662323465393961393862373738343063316434 -36343035396536363136323734623132373763366636633939616339323965306564303031663331 -63306463623732373462313035623532646334623532363666633461613066323933393433376463 -62626563666565663438393332646435333939653439306234363930303637373965643366656131 -31383834666565623861356531663164646165313638353237643831343337313362306232393737 -36653062323561346661326133326635643363336465616636316666613335623235346161376136 -36666264633232653638626138643934616366663938336562353333393265373137383833356234 -32303638646436393865656336653664313136653831336636386664333965383461663166356363 -30383139323134303035626438626632613562663164393934663636636338336134626530356134 -33643930643532376532303466396264386166646166316166366661383263666563333764643365 -38633438306538316338623631616337303933373432646664313736613035626365356433323737 -31323364616464633830643133383661366161613137356431663330633032386136326334343264 -61633333356230326236353330316264383738303033323930666562393932343235313932666133 -32623636643563623166383231396433303735303534356334623330323933666636366365626266 -38653038306135326431343832336331623564633364663033653766623832383630643964643032 -35633431663062353339333266633835366430646563356434373537393937313932346432623633 -64373632343264353066633436626531636232653038613263653038323830616164303361393732 -34643233633731373637336137383763303736353237316134393835663032393861353934633038 -30626531356333346336373535313433623035333466343066346265326336643162323133656339 -37323561326137653939303839343837393763653465363462356161363963353865386539623333 -35383637356666633731396638643966303063313430393038393234346433646566326632363637 -65306466613230353261616366323634313837373030623563613562333833653263346230376439 -35643836346335373261326365336531353733636236373466353332383737613639633034323161 -66393432653336636362313962616237316232663038343665343065313030313937343834356436 -34326266343364616366343039303332353161373263313730373839643361326333616464306133 -64643863633336363762306131303431636366613038623562653035626537353466643231356561 -37393035656533666638336637373932346662346436313561313964316139613763616335316435 -33656230356365373365633830653835376639373365623663346635396361333338376139666232 -33626662616662626363636564306530613034663039653636663838326162616263343562393661 -64353134363737623139633734306430353265323835373833373261363031383163343938373862 -30363735633531376230376161643037663762316466396134626462346133626264353064333039 -66333531613735313333376336313565376632346565373134386433663935626363336635356337 -61633264363635303833613462346263636433383634326330393236663835626432326336396133 -36396462323365633338663935343733346365356233653436613962356366383365326262663236 -34316233626130336635333933646463663461653364313338343534633630663733336261363431 -37343664333633383536633464326466653432353733343933616264316364666661396631336135 -64306637623234643735643430323262626539383439373363356139643362663939336665376139 -35613864303837363635353564393532336162393566313339633866316266363261623266633032 -61343365393762386465356164646531313865633633313866313162393431393132613131643462 -38646131363036313964333930663234396139613362326331333538376364323461353839366562 -62313066663830313862326162326166356537653135313036326239353032636634656433316530 -63336532663935616633373261653666333662643561313235353466303632623364336165623334 -63346334303762326363643838336362616466333631376135643466306638313038353765353034 -61613033623132653930623634376537643230323330343534646365356339333938396565336533 -33303730666433646465623231306233353130626237353236373836333438666565626566326531 -30373637353237393934343064616663663762343135313865386331326266386639353430306130 -39353534663362323665616166373733623639333164656633363537613437616635363639316232 -37373365336531323639663935313836313338653030396133356365336437373963313231636332 -65663433646665383836643362383739653663636338346137636263386366386234306130303264 -30393266376138646465613436613736373662643365663330313230346139613465383136333463 -38626661643165356364626164663164366534316462376633653231626233393934303333313963 -39643362633761353731643239663334646266613536383661626462633062653231616236326332 -32393634643030656535633139336132343639313939313436393865336361633430376166313230 -63383435663766646537363136373138316166333031663736616461316134343461356438366361 -37326663343434323563613231633530316364643164646464386361656632633539353135303432 -34386162376235326631653764613866323432366166663966356534346463306231656665346333 -35356633356262303236386633316539363536653438633334623161343136623161313463626633 -61373637303630633233383430346534613336363739653332376461383531653832333264356163 -32346562636662323066643932326436326333323537323932343033653862356163353730353438 -31313531306462636131626136613135646231343633323065623363643661303336313463373130 -30636630623734636536366631653031326162383034623233623463326434366635383836613361 -61356463336335646662353735333662633231396331336336636235663839353163616234363733 -32373438393730656461383537353038653739326335313732636639656263643033346635316465 -63306437613863643932396361346335303331366535393863613663313133393730333039306233 -63376563366636313435623664323632383139653932643461383536313734343430613736393734 -38313061623163313931616564623366353266333237643639366166313564336437376664303938 -30306233633437376233353237393331313734633063666165323637363938353239653539613439 -36346232626466396431386664396535663162336166313438363265353232363365633034383331 -36393164386235613134663566666539323539313735383636303631336337386366643561346331 -65353962366336653139356433366465616637386333636439333365396563363663656231346333 -63366636336131656237396234353837303035323637343265303566333761353431613135356635 -31313664316635636564346531323638633266356634323164393563383935343738346632333237 -35656464356338356538366664636265306165653334316363336435666262636634326636383934 -36313136373038326363366263616438306561653565656435643063613537643732643332363037 -63633962333637326434363936346633313634363961613063303664323761313533646638666139 -64616436366638353166656133323131633461363663616336353730336639653463383033323061 -30646237653463313261643237343933663032346133336339393965626166623066373735623836 -30653331656635373838633062333638333037316439323663323838616530663530623434653964 -37616362373331633030396261333038373162336536373731396363646334333665396630376263 -37656634373138636633386163393234613434376265393065306333353661326266636633323634 -62633031363965346337363031663263313538393064363761366336356462383737313633353236 -35613261653563663663663832373664383262306232373430323934376330376166363738343962 -61323863336664383266313264613563636464363566356637396261353039626166623331626234 -39353762353536646338613066656533303332666664353863343838356464616437623934343263 -31313838326531356432353563326334643665663735366233666534343733323865636562326530 -63333166303936643736623066653832346339343133346632343164373630616538633936633631 -36376663343934666133343535646662623038666633616130323163346533393765653337353832 -36616563393930343065666361376635326464333435303736386661396263346331636131386336 -64326665643536363563343964623536306238376535656330323061663431653532633434386634 -33346133656630636565613065323634616333396363346534303163393337613830366662303731 -61633530393463633635346136656366333030623038616439363631383466303962333238373661 -35386332613264303739343931336366653431393134303833323464383439656661303163636464 -61363462363064393364633061336262353261336662363462636462336462636535366662333534 -63363666626137636633356631653862626639346634373238353636666236623964373231383264 -31666563353034386365636264346464326237663235353136346339393436383035663034313630 -37333963373135643430653761643662353334646439313262393635656662353439616334356338 -65313166643934623065353164633965303166653830306165333837346262393563616335343764 -39313033373339626534613838343239323661613530323666356665353431356439646231613638 -63323862353230373562393039656361376434366237653365373937336332313762333561386432 -61343435356633396465353133333066333563313330396234626165393364653031353939633731 -37623439336262373838393533626162333937623133396365373034613962623161393231303562 -65626133623833383465396632366137396135363434306337353038333633653264616437633635 -66396435663931653534643239613636333862613263613434396261323238333461623661613437 -64633331393461333831633162623333623663376165343530326262613362653730663463313039 -33316638623664663837383837306163663461373636643032303933366338303633613830356665 -34363165663232386237643464646163663136396232626138333165653162303339616362396230 -37383766313039643438346136623864326334653938393039633961373339376665633536336437 -39383033393635613034333634373834386266626534363833313534393134303138363162316533 -33653333373962643965336465326635653732306338656631356564363961366462636230373030 -63393837356631366638663964326530666536643932343861616665633331373230336530356138 -39303738386166336334633433353339613366643436313064653333626130313361656237623163 -35663263633136373765343330343338306636663534383730353235636434656138643466383261 -62373661616137613164363665353535633637613263646361313337336533363665626462383633 -61383731303132393138663639396433343530336266633939653366633438626139666161653638 -62623866393533346136343339363334666333613666613031613135626235633564353463366664 -30393130356664343434633132313537383063663130646464346263636133303034316266303739 -30656661303231303434333562656237633233616539333239303266373363613034626263613531 -35393937333761633232386333353134613362396138353030613934353935356637623630356533 -30626431366234383834383866353436326333386564353537663136623761623736313861366336 -31336331373537313739353933303261336238613630636462353031653133333139306363326566 -32373264306338353638393965343933656162373438373366333338623434313032373538623835 -63316434306262643532616232646430316635306535316635326564316664353063343331653963 -61306530396630323031386534653062636533613931613632306637343364623464386137623330 -39396166306333346665323139356135643662363564633631383362303636616336613732383763 -35353861343565383739336535623962666239663963626162373861343738663364386439353133 -62666232333533376563383536363239366135306134616439643738306331643539383034663363 -37366366643838666338396537373232623232326263616165616639353939323463663638643132 -61353038646233646231393961663863373466306461373832363435613635383836363633393039 -64346134633837333332366135363736323234336235626630653965353039663964383535373931 -63303262346661373535376161393136656436303235386333663033656164363636346632616433 -31353932643266343361626431383835623761653633656131373134633163343137363536336661 -34316633386263306432333338313462393031383832333533656436336230666363316133396162 -65663861616538306333373032626539663535373161383462366164373764343437323562626136 -38653336663263306533376466323132623261386166666435353438663763316665653039623532 -38323730626666353636663830373765383138303330386663663737623531346630363936393966 -37663839623464393136303934306438376362313233643838373939323938666635626630633035 -31333466393833393361393965353636616661353166323937313032663139386431333163663035 -62373265306132643465363765376663623430656264613839336234343766613833323235353333 -66656639366130656534316639306638366465336661643263666337323030666263623036306362 -64316634353139666434396261653161646339663263663131386339346631653932653834626562 -62386665616131386138633839353262353230316264383130656330313333326538636261393863 -37633665613631343130313163376337363963653134626131643531353565666537613636373663 -63333633313561363438653035303563303532613736373634613362313663386563656339656634 -64616666346532376537336130353233623832336237376663663837643134636361616533666530 -63373065663833363734356130613230613739633134643766373935396531373965383862656330 -32306639356365383332643462336331383731643864636264633234616132386538396533613432 -32646638656233333661626335306361646435306234653436323361643866633235313962313637 -61333637663463643066333562373535363439636666643538626133623432643932666662653233 -33306137613735626135373430393033373132356666633337303134323231323235326434323639 -63326362306136333065393734396339336665313035663637303533393834373664623864386234 -31313062316334333130336138326132636366356266653531333435386231653063646531353933 -37326533663431376461383632643266663531626235393131663464373439396666343236313262 -35316165313962383632623262366164386130323065646436343236623230636664306539613031 -37363564343438376637386366376139613332623765663166373731316262303630326234383063 -35303330333364303366363135376262323365633561336264626333323564396132346362626164 -30623637333263366164373465353562356561376238353332353461623939633035643562356266 -64666131376335663832373136646266633363386139363864363939386534636461313237666661 -31383063366362306466633039363730376130373661366331643836356533303062323030396330 -35623431663561653264383531626136653363336339366332363431323635393561363763613134 -37643733633138396432623031666333616136643735646235346632306461313136653837326135 -36643935303264303532396332356561643063373263303536626433623264393432343933363237 -65616237656131356537366337316437363831303064326436393761623734303238336334653131 -38363437373264373636653531346665666363616233643563336133316439643663336263613964 -66613835336638386631386565343233313435356434393637326339623933306134343332316132 -64326434393134643866323935663331336539396636303666623364363133613861303366313736 -61623465646336643161313839326333316632653365626231616264616633623336633463663232 -65313465313965316139316531623863373235633362633731636633393534663662623663623533 -65653762623938343833653639373730363932366330373237653830316438356666333636663938 -66353139333162376439306530653839306436393832333030336632643830376663653132633633 -36373965646666613436383931643662383263633066356666666362306430373636336438626231 -37653338336462616333353937626363663765346664623862616162353865633463393263626537 -32333336383633383237613731346465613635633633383065643038333536616331333966373232 -66663231343266393865663165383937633439373064383636323137363566646133616332656566 -35343335376465653939653933393161396265396136363936656433316566613336613537623365 -37393364326337633362303662656333613934663362323331343135666136376365663765346439 -35303465303163333732343737383135303635613865346331376537336566623561643837333433 -36633930376330623737633836376239663333616134356530623264303337666432326332646433 -31633034303166616134353736613838383231666363623563316430326461393462333564626335 -62646337643066313563343466303231643334666437383135393432663538623464313735663431 -63336166323839656531633862326534353136303264616266373431363036643335616562363438 -63643464356662333065666663643464623139353833353536323466663462313630366235303065 -34623433613736646465616466633232656362356137366634393735623031343531633231306334 -33393137343637343734613133366239306135383931353637313561376161666562396237386436 -61386637376563346633303032626361353462323963366233613566643434666532383965626661 -66663165336164313431653363653939653262326537623630643237636163613066323434653633 -38613939316463663833643062303933383165393939333233643139666462363037613032306135 -32643266333938653962366231363364616339656137646432666466653363636265643364656363 -32313966356238356266356339636465376133653861306233343635303135303735623037383339 -37626335333030643932306164316535353933346462666337353366633966346363366337623133 -65343766653261353365643039333164663231323031393233623062366432373430396563663264 -37313962363831316137663064313631646433353033336537636132623663393637336438366463 -36393565633936346134643465306639633737363431656161376533633434636663656535613037 -61643330383366663266626436326466646234333831386632633566663831336437646563333635 -65616339626561353065626462633530633461643764373866376264636337636431366638623839 -31366338653632333037353233623962303866303334353033343739636637616239626237343764 -39356464396239383235396132316665366238373833303266343535636164623862656139613064 -33393264363634636231653235613133656138663763326263386334303537333733653132346533 -61383739663963643365393638616233323138616131376461323233643262656633636435303566 -32656438303466306361653366656464303335663661656437373031356365336334373961386264 -32396230326431376137356534336566643137356361316232333939343362323766393232373639 -35363465356235323331333265303535623630666236376230633364643237653762386630323836 -38363136373331623964623964373163363930313138393030353636643930633335323761383764 -37316135393466323139643738366537396133636465393565613765633938306164633263653032 -35353931643438633436306464316230333437373532356261613565643164656330643862386635 -36616237653834653134646439636266643131613761373833346338623439383861636330383133 -34616630313465303535613032626536303762623331653435333633303262326464306330393832 -30623265346438656137383937306366646530613564306230353939626366653536653738323139 -63363332626532346462313635353366333235323837353961323862343334353232313464626236 -30633336316465666637626239373730383965653737663639336261306264343530643364663561 -64666265613762313032633837333433643537666562653534643364346637356363653732306561 -39623538623763653136353464663164356232623333363033646666396232666261323233653661 -65393536653237383863653134356134653533316631623231616539653861363538376362663066 -61646261656336363931303935353764313562653736633431633263656261623039613737373432 -31373165386161373038643831333937333366636230326133616430346131386663653964313866 -37626234396631646639626436326466666561303734346134653764353234376136656662366539 -39376161616162653337353235643236323832653835356235363634346365346462346162306333 -61326534393264666163383466616166626463626666616438653765346638383763636338376463 -35616466306230383233366266653064343962393731393434363435333466616462376633336338 -61643061613963666636336366663562346366616135326462383864326562346534353032343662 -37363861653866363630373565346266623037663233326432316562356661333538666332313465 -33333930343965313030363262653862626461393162653135666666336262663634653333313434 -37373030356665616238363438613739366337383961666662363364343535393033666336636465 -39333431353939366439393761343039626663386164653330663135313839356535393362376135 -66353531353461333539633135363832393235333535333066373461346363343863323239626335 -65313638623638313437303865653736626133653239643232306437663237313432346633616565 -37303539333830663235393862396665313164623263353932313036333362643361383732346631 -33336330656565616331 +37323831316166346536623334636163363030633634356262656631366264383833353039313236 +3230666365656463376437343563363263623938613432330a663639643062643164656338333037 +36656563393239336431643137666232396664636262643565393438643835303133666162633336 +6663633334663461350a613063343164613238363531303464336361336536663836383033336336 +65383537663231626137363135353539323136626137363934643230663263656166393361666163 +62353838373464323337613565613131353639626666313531666331303830343763313830636264 +30393838356462376334633633373863663238366639663065633833383064653161336162323939 +63613631636537386234323031653064326332373064646661653861623133376434623965666439 +32316130663430633862393538613830366337333735383235663362643137633432636531336538 +31363633353965653864383030303333333665393063613635336131376132646261626332633130 +39336165303462303633333838373662656262393531373165356633346331303439623938363862 +62393863653035646163303033646130343133326436346537333630333232353162306334333138 +34626364326332353265336564646230643432316530616438393961323666316432643530643432 +39343235623163636562316364326164396539303230633362396434336664636130356138383932 +61313264393732306566383166316130316264613830396166636361376561353635633266646538 +35323836623731616162373738336464316334366366663466373233653666356237333662396339 +38653564666534643764373532353064376431353864343731353530366438363035326634646238 +33343138396663376331336665366264313838383633333832346437613739393430313333653262 +33633964356130336564303563303433333066366233393532656361666334666633313266386662 +31393934663465373166313631636136353934316666386239373938366231333132343931326262 +31653634386532653738383131626536383630356333353634333638653032613161326439653039 +37356662636461383430643939333334346331353637363636366133623566626335666365666330 +61656230373435626131386464303339643937366237616231663635346663326530373034353962 +65346663353464356339663731666434353039646534383931623037633831623537396237666438 +31656462326662646561383533643730343934633637623664383337616431653638646265646561 +39623632376437613734383465383635396464623635313736373362656230303061373663643532 +65303563346630343163386530653264616265363832626132626564636336323663633032633633 +39306339353831653832643039376139613832353061366136383562663362623063633766343861 +64353666663131633636313766343137343730316563636638636634663437626161363862346266 +38656332346634383736643661393862383434386531663262333862326463306465376562666264 +61623030393631363565393233653233663436626661653632633334353961393434313337323833 +30303032386632336136333461306362366530393766633938346564393865663531633166356666 +38626466303233383934363361613236323965336132363663623130306633356436636432663334 +35643264353534386466633462353531663462313763333231333862613935363737623164323365 +62303362353234326133623363616437333434643532313632663164663838316564383433356439 +65396163373461366338333535663262386138653261393761336436353364316361653437346438 +34363733363739373766336663393138356339336161623234653535386233323936643938336562 +65353963313535306463646663363238656233633137346663313464303264646337353834343038 +30316439376562633431346361643338613737333363316363363831363430383531396664643364 +63646338656333613632626339383565653833373238656363393664386334363830363737653634 +37663664396638376135666364653064333863646330396531373136353561613439303739383165 +62356134663366303566323066383439663965366363613864313733353061386235616230353934 +62303432323965306633643937383531313362343435653439323430643331646262343438303563 +34383132646565393637656136613133663536363461393130393765366561353364633235636437 +64343932363333326564316234326334633035316539633663303464333832656333313463343730 +38316466356439376230323966616666653532616466353466376230643665343064363763323237 +63633864363266386232373065303931343636366361306566646537353834653231396138386233 +37623464376336316239316636373038643962663730333332343362613639316466353138633731 +62323065303038366465383565376238636562643561316161653432656463316533333131343435 +35353632366361316365623965386236386361346365633664303666656635383564323136633463 +30343934346439643266336166393862613336333762373535633730353830393763356635613163 +62646535333939306564336161386631666134393764663666356335326237646430663933376334 +38393335333863623638306130356634346232373833373366393437383034313038323264373631 +30666136316337663836393465363861336562643337326634613861616361333065623831623561 +34376134663565303938613739306164363539613938636336313566343734363937663732373866 +62366365653730363932303138633939376161336461343764653030656361326332383335393261 +61663030623837316237643962316563646263303430363066643265636139653664326633343034 +39613862303063386564313165373636616233663835363165376566356161366236306337393862 +64613133636132653236623334633435333831376664616663383537626137376665353035383139 +35323264373734306661636465333638663632623565646337663139303263616434393466333435 +39366562613230653133663234303765633266363938666139653739336437376433323630636136 +32373139666331623938626339393961313034313439333930666663666334626432316236366634 +36613934636334613337383062386639656432663832653461303161346139653132646533343837 +66303635306265663830326637613439356530323938663233623938383264616630396565613966 +62326539643832363536323236386334353438663665623632643264333839383463393832663936 +31346263303931626231363362663932396632326530316466336366626231323566383732313230 +65313661303237383532303062343638303736626435353264623739643564393166323061626430 +36396232393037326165363731653039613762613561383662613338356662623535366662303865 +31646530356565353063633434636662393132323434623139386533366333383163363063663733 +35313236666363653635653862363631643663643132373832316439356363663830306433323065 +32363665323835313030343636623161393263653236663764373632343832366539316435383963 +31363732353536653437663031323530666262313538363062363665393338363738343265306261 +36656166333337373036303263623561643265616262366133306162616562333437646137373038 +36376263613330613336353961633737303564323436333565366165323265363731303066333330 +36353464663531346163383761643930336161323539306438383234373565336236656464626338 +38356331636233326134353563653231346362336338663765353132666564386232303739303438 +32356438623135656235366533323362363837646139333064336138306131303763393735633531 +34373739643734373365346137366133613334396435343336643636656564363338623839666637 +66633834616539346634373035616438366166613032333836393638656433353663376133383764 +36656231396135633433306338393236383561623836336336623133653666363137383535366238 +37333264336535396431613237643664366233656464383462303737303834363334363531333335 +32636166313132383932353332306337326565313231346636623533353263663036613266666561 +63336664616130623531313234386164373364663839386165663536616531633463323633353933 +36363839623436643130326666323064326535666161373663333666643732333163313461366165 +33386262636334373438376562363266643039353062383736313032363432613366376462336464 +65646166353564393462666365353539336561653463333034383166656430383764366437663936 +34346436356463373532666437333230623861303663346337316335346463646533656336633137 +32326266613665363931613566363538393038623931663863643862353362633561383836386435 +39393262363564653635346133643133613534633133646135303464363833336430613838353130 +30633865663536353633306332363138373462643037393138363532643036663532356331616164 +64366663643134643434363138393063613663333938323366623435633039336465383830613131 +66386536386564663962303965353964313635346633303565383239383866656465613935643933 +64666633363734313766316363613065343564323131383032356131643765383762653662653462 +63613738656432343632393931313066366432316139646266363633616565326661333264383663 +35313935646236373330363239386565643939623033343963646535333439343163623563363639 +64393639343337326136643564346637663764353866303664363836643134306264663835663531 +38343265383934326161636638363330663130336665653932656264383038646636336239643332 +33383264333439356664636535336232313665383562623133373339656266353634393030643062 +64333561633765326665643532343635313536353637316536306431623030393762303664643931 +63666237346362623761303061396233643562663764343465393333616662396432333266306139 +30653563636131643530366264616534323361393438666561373032616332343634393639626561 +33363236353137336630616464333361656538326431323736383765663030656234656562636533 +64343236643836323164333633663238306634323739366631333835303765356239326463323738 +62613563333234383436613136613462393232303963336562333331313561343131623336393937 +37303235303536376165333765323737383961366634396366326166663335376666316265646337 +63363365666663393365663863316264396165353338353234616336313362383739646232663537 +39393235326661623539656539373064333636313761643163663735633834613135303036313739 +66323037663937616439373266376332393433353762343936356665666338326638303434616339 +66646436623433316239333633303261653466643261653430356262613865663532656561663030 +36353664316139303761316231383337393736393462313139636339356266626430363938333538 +63633833663831393932303934343564373163353438383531316563356466626365313134366335 +33306539636661653232373731626637636235633638313138613938303931333465623236323465 +30633033346337666638313661356261336535313538376633646563626237626237393634353934 +34343238333832313063346635306165643965643233363138653734353333303562393430653436 +36363263643662363333326462376166643137333034383232613836343966356161306131336636 +31363238363266386364636433343433363265323734653130353431363932363666393533303530 +62626334346164313465323937373130356361633266656237366438323862386531666434323566 +30613332363635653765646363623633326136343239336638393439373735396465346335666135 +62656130366339333636633765376637643735376337383235313665313037663032613364646635 +39626163643466303264616566346530336363613939646632356361333661383262326266343832 +34306336626134656263306462363134613164373634373836393939626663643561626233383465 +32663839373465353135633931363530386162313534303730316663396538623131626263653232 +30623337613532663038313738373763383064386137363862353932393235646163333738343239 +39653966323865393533343463646166656533663962646233333532326132366266356361323735 +32393065393334303730353431303037316534373830626433316438613839663462356566376130 +35396639336235666132626163396263363464393634383639623762663337353339366133306333 +62653939626433353965366632626631386232313662376564323233393364613264343737386665 +61323935306638316436303234616435343037376530646337306232376563376363353831613364 +39623761336366363861383230376665373935373735633636316161613039326166613363306637 +30323363643038643065396264623436613332383138343762346337313762646366333537346430 +61343762393064373138336132656464343766363863366239643061613438316461373339636363 +38353064323530393661333533396438316465366562633063356165336230616663633733306665 +61373364306266636431316431663933613538393330363666396137393134656332613539383463 +64336261373730383136626236356563306137356535303062633930636333323838643035343432 +32313965376332356531376663363830363530363739393832643934353737663766376238646566 +66306337376566313634306432323165646438643133396363303635333932353439316539376336 +31653165396563313433373230386134633636323664333762633761383333613263653430653137 +32383533326466336663393537623634353063653464316135343065326162616530316338356138 +31333732343731656266663962373939663733383732313762633338343733373936623831386238 +66303665303762383162353430366130366564613263333230653838313934353734633333373330 +30663330626331663531613030356165653363356362316266646164613763316432363331333631 +35376261393036613839316334353966643464366163656539333331303162333066376234316531 +33373037643061633064616162636663623065333334343234396331323961323337376235366530 +30323939633632313165643161303531386563613330653033666131343539336663663232643861 +35343666353466613434343730663530663161663235643233373638386166303064623530303262 +65623132383465616464376137306230376537626432316365616530303632393738333466613237 +32386536373338346162633364613863343139653538313235343566383037633338386439363362 +34323664323237333264353665386265316465346332633764623933326536383735323238633666 +36363032616662323435346365633336396130653033386332636438383132646533366461396638 +33323062396430306434636430333963623332393864366166396234306664336237646134353166 +35393762656162306535363965633365303932306338643632303364373234643066393563643332 +66373135623537313338303962313830613965346362383362396538393064633033333439346338 +62646639666337623930373437356237616537626365316438316461373465613639376238653166 +62636131346265323237383236386666326134353638636337643662306436356138373666636162 +35306666633538383835643764303133326232366363353735663935653166353630343461616133 +63373430643333313234363238396235626232306662383632303035393166393133653766616166 +62386565343934633830356233636364376466623764643435623537393538343766373834666462 +35666532336264643038393038353262633162316132636538333962363665383938336439396538 +33303235313261663262353563343039353336363363623637393166333464323235333065356466 +30663732393339306135383439393638666237323061663762383730343334363234316466306434 +65376636306633396337346632393731366134663461373762303238663266306161313962613664 +64643338666532643165643163643730356334336537623562383333646261636232333932393064 +65346638646464343237396136373037623038626465333963326564323932623939373061663731 +36363335363934353830633539613732653037343237343861333336646262383330333065306536 +36613361386234666665643838303665316664373238306330303961316262333735326332643466 +61376437623638643565336332303133343765383365363533666463336564356265323838376636 +61376665336535623461626634383133336335313366393932363566646437623832333534356539 +36616639303563356639646666646237616333346432343731383335393163666638396130383766 +64336135366135313964333334616131393731313662666462373339653235613632366237343035 +61306338323238343433626532643930613334376531616432636362313132346632363266653334 +31666362656366356161636531333263336361393561663061626239323264343162346131333063 +63613536633839643333663039363839623938393739353636623964663133326339656134326461 +37663130306638393238306331386537386132363736616565366637363638383462636435383830 +30383364396666343532336265323635303837373433623664653630313637386365346136306363 +37313937396135343731376531363037633535663437303936333135663566323639353739333665 +66663361323061316533666435363634353733646437343638666534656263633837316533616136 +66613932613931656264643934653164666564353865316666643865333134623138646531353934 +65636338323233303331366438366166613462353566653664366162623834373734613236303439 +32336532326238393034643936316232343839346535323964356166623832343837306462326431 +30343830633030333362393737656333653432393533316666636635353337343938356363636231 +39656337336238333931653134373434323561663130343937353131313136666564336633613437 +39626134316365653861303361393736336631373366333135346534383437316263363134376530 +37356266346335396161623430303262633830636639343632326130303339666162626166323737 +35316236616566356464316139383962653135373265373439303133393664376462623333626662 +37393732643738313165616261316464373338386133633963366238383634366661643065303732 +64373132393530613662323461386363663561316137646466663432313763333166386263383137 +61656430613538343734633832623762343430616533356166663562653832363233373161363564 +65363132356562663761626439653439616633613865613031343930316164613631303061373833 +35316337656435653338326639663934643732333537386336633265363465303039653337363835 +64303163653862393862363263646330326634343062633863393664656134383766303739313737 +32303231363061636362383634393464323130633564386134666639393663626637663639613161 +30313933663065366537316364636562333337306134343463363633303339326636353230363838 +31336436303066613332316366386636616138373838343463653232346162303837373663656263 +64653131386337386661636532323463353366316632656565333836636236643437343238326361 +66333132623536643430613131316339393965646337303466613237653162653837643233613331 +62386461343639333361376664303430356236323037616664343739613862393437323861336230 +31303433333664303532663938306437343137323431393030323637333963386432333061323633 +39353765626536316161613637616363386239616364386536643264646162393931393837336537 +33383234303835613831313932363136626539333039383738613834316133663637383731326535 +36393433336662356262383935653566383438616532643135373631313334383235613565333365 +31393335353864356665643738613330386365376231336430333363326632386661616666323835 +66386136613965323631646333613238616139373636366135346439303034356333626131303564 +66343233626163396139633730386137346232633763363965636133333835376166663962666666 +36373135653339313461346133303834626263373339616431333833626539396638373461393762 +34313862373566633237383334356362386436623362643963373534643631653231653432663464 +64316639656536356162656431376237363333393361313833633534393662333437643738323234 +39336364663530646266393631343965616436623039343162333136646563386234616363393663 +34393239393233646234626237393238306534303832343239356666643937343265636264653333 +62376239616330393034613061376165313238623665346335326466623137383138646136633738 +36656135316230393037623032373233623863316463313936303436663334303966383263383132 +63313564383339346263636462646166303431323662613238353738353039623833383535366535 +31306436343661353763346232386238646464306166323338643764643330393063383638616135 +66353330323539636630663431386137376261383130643031383432626139353638623630313464 +33623766336466353330333561326539303633633932386238636465616136306530653162626166 +31313765383931396135373461633564636133633763366266396430663833363636333638613063 +34663137353032313065343365633336656535643965666561346636363835353233626538663566 +39363765386137643135663638316234383434373931306562663635373434326232363564323935 +61353664393130303864653866333237363538363066636133353537653464326431666338626363 +61656364616537343233393462633337366435393231373865303834663137663861346363613136 +63613831333966356565333337653564323837396539643338343635363063373236323636613562 +66623963393763306539323062623633613962633436343433353935363130336637393232396636 +66356561386230386364373965383239613064653761373436313933663431326431666134306431 +65366331303231346239666236396133313034653861636565636134346633323339613432333266 +39663062313566323364346165373564663665343363346335666635353139333734336337346639 +31363338316165666363306337333361393061666364346639613131323830393965313831323235 +36666463353432376264373061303831613632316636633137303932343830336130343066336131 +39333031323232316539303839663263306566623530616531313138653862313133636532356333 +38653432613231653132636234633564303764306135396332373461366335326664396266626533 +35303364666633396465373831656138366537336166643037303831306138303837313862646566 +62663930653861653262623765343762643737343065663265626164356237323964373564386466 +39666664663938306566653036363536613662636630653139326331636436623434313162666636 +66323032663534643865633238356661636465633131633665373030306134363662306166363635 +36663863386266376534666132313165303332333430303161373835636566383333663266346533 +39393935663537346434643833613034613739383233663464316335333566313837633836383536 +39643434336330383036363663653864646236643738653930613535356630656139386533316432 +35323235653663613464376666333366616235633033646132326532616130363538613031666363 +33623737666337373638636263656439653964653236383030376134373236653335313733336136 +62396635306232333462643636663736373435333536303336656162623365636566646135356262 +62386433613033613564303439306364333764363836323765616363643562653566613235666163 +35656132323366356338303932633566663039353565326461356434326464313637623933306636 +35626333373462363635393964373963643665396237326236613363653630303333623039303061 +64343537353535393239363038656237303165393030366165616637306461346135326463643965 +31396461363735623934623363313263373863336561303666616139383236343161386263343736 +64323463353161643437326566356662623261323532393635383235663135636361613234656165 +66376533653236303635633866616436383366633533396131613738663836313631333165373865 +66373739366161666239363730356238366666656366323064363362646134613063646330636330 +61643136653231373637636436613832643939356637363432623539383266616132353437653736 +32303464643262653939623038373830333833666566313134303566313934343663306363616232 +39616530616130646132393962356530326430343565393831373266396230313361626230376532 +66316137626634373332313835373566663732373038303661616433633363373539343833373733 +64383035306232636533373633333032633531323061613666343637626638666561613864316235 +34636565386332623261336339663032613038663232373931653230316136663636623864633862 +62303233626632623665333332633763383263393234656333643637353666386263353464333062 +32613238323165663330336136613532323531343165363138303434653461663562643336383630 +61303465393265666666613165353463633532613163333562376639623732353262343238666138 +63346338616332306236396339346366613162323065666332613231353035393261393533363163 +30356338626562653933326537326530316162323231313235666130383736303166323634353830 +39626561356632333139623034303334623133653834303066303738326239383330626630626162 +64626639313664363562323630666434306633303765383031303364356666303538326138353833 +34376161303961333932383634336465336436623365616361613939343263336365353862303665 +35656462333534343163653138386362656333633533643336356231316430363737323664346532 +61616334636634313731643839323131363332663366383564323262643035613930613436376262 +30303266623938643364663563306534396131643237643361623730613335373465373835323336 +37313833373662366238653637616661663337653365623362393162336633393039343061313331 +33663632373538363937616232636138663265663166626539613533623234373939636238313636 +31636662336464643930343732323334343931643361323863306562303238356233316535316332 +66343833666161333734363234623936393964356330396432346566396361373638363563643665 +38376137393262663066343661316639383836363932373030666535656162626534663930326534 +62653137356561393166356630623231363133376661623239633934373238343134396463336664 +30653663353733333962353661633835333938383565643539353565323864323566303430356233 +37363032366564383431336562636237343930323939616430613138656432613464633764616439 +39376235393935663736626537646465343839346436326465356231306436373838383636656266 +66326639323763386432333739373237353462636336656538636664363536356333323336356261 +35653662336433663438303336383663363933393163616339613534306263396264666335396565 +64376339646461373337653565643563383564396334663965323730383261393664623932323961 +33356363363437303930343936633730376364353961333633363266616135323732323765666331 +37346131633332613630386261303434663734346131393435613733323638326464633933643032 +62666534643665366334323835613065363230386432343139383463646265646333323039316665 +65356431333762393761396331353735663561623037333563643033646435393236393633653233 +63616466313166636565363266346633633833613435346138626439393563343432336363653938 +37656461666130383131393832333965326438336534393532343737333062316165363633636331 +35336539323731656535303966616137656464323964343535623330663334313964646235663730 +39633962303163303562353033306531656634353933303535643061376661653336343331373837 +37666131623533396639303530613432373731313861656262646335373236346438306161653532 +39666564643635383136333136323032616562343430313566333865363161393662653839616631 +31366230303964353239336431623631613664386138326263353534376235666333356634356433 +32313232313264396637386531333339666536353162653539356666616264376237316331323830 +63633563646562366664636233313139383465383532353534633138316339653262313361373964 +31626130353464333230313665663736313330323435336539383163313664633538366263303934 +37623838646563376238653335326164353430343338363164366332626130646139353335353531 +63623832633761303063623061616363363636343634653935356131393566613230363664396234 +33373363663366363934353562313138346630623262643564376434643063313866353165623765 +36323438326465323531633566376164313536373037363564626264623164393732346565366433 +61666664353733656361653261626139656533333966303237666130393064333166626438643036 +35396432353731343937613333363534373532333430306137613834613536663362353032333964 +38363361643137323033313336633666656363313132363163316533323631386362353536383266 +32613863306431373033393035313765656265663865613463333439356265353733373665336235 +39643330653030323939633062353266353739353432316165363261316138356638366335616366 +66346266306238383664336130656634366534653434333937323332333035373133323532343533 +39303462393137393230313030343435376439386232396532636632656464653363313030316433 +31363535323362636463363733613934653463636163383263393666616531323335333565643165 +33633131313532623463343165333666313133653532373661353037313732326531653233363566 +31313761366535313263633162366566376662343935633339353065303838643030646234386430 +35366330366633313936323861326232343636633435373763663764353832613835306264613431 +62616164376638643236633166623162613331313533383630356435363261356364656233363335 +37383834303062633038346231333839343736346238633761363337663339323065313433346332 +33353262623666326366336538643866393462373661333962643538373861303163333564373633 +35356431376536333065373061663431653938653665323331333633353665373038306233343638 +38333137383062663033613932313266353539643736393665383034306430633834643030653436 +36313131303431376461343935626637663530613133666562376237396330313531386230336634 +35396238393338353061623535613361333564616264323761343630326363373538343738393763 +31393139323162366562323537623261326337363338323633663930366266653433653562623232 +62326563396338663066393332636430663966366339396563306663343862613561653839626631 +30303561643733613965353833373436306561373532316664356166306564393964356566636133 +35616331626565303733336330386536303864333330623936393761626664613732653163353763 +63386366343033366538346137366238653266383065396535383737373432616564636464616465 +35316538653330306663346632626336323932336232363534336364666533633563656366376264 +34316234643164396261306562653239633636323966363332626132386264323439636131316261 +31383766303437663639363466373264356331366364643833653031643861393936303537333934 +34346664356164333438663533646261303161393563333936373035386535663064663365663636 +61656239313265633666373434386433313161626434366265666564633663626264346235653538 +39653133663863366265326536653761313633616536386166616533343730353566343033343261 +63343161623562663738626437363635343766373837343466303635363262303737383336356138 +63353866316131636435653932626133663461346231616637376532393736343532316161306461 +65653164383835326336393938383537643464333636343235313532353262376230616564356633 +32666561336230636537366238313634373835326330386466363533613734343231633764623766 +33663163626439333839616465663964303035306361366564363766656637363937636138363230 +65653161633938373239343365343534336261396662613364633738343332343238333738386335 +35316635363730396264316266313265323436653735373139333831373138656563343332613561 +39643963666166616461616531636462363834633461346561616437646435393335653233666434 +66666137633236656464353637636664393832303235636564366536393831333531343134303737 +61303733393630633032343265313532626531316235373737343865333132663861643033323238 +32356531383839356133656235623632323161393633353866373563303562306532383031303636 +33386464383632653235346530366161323063383432306163333832363265363938343339343333 +30383461323334306234333565313032643765353836626236366533393233366162356265623032 +61623562643134653563303833376438383862326234373265306632386666666265343566626437 +61373038653539363365393666333731383933393662393334623332643437326461643136366634 +34363531356464356166613535383335346338363562383866656330343236323662646366646234 +63303062333733616165303136316465643030396533653966666437373932323637366538383330 +39353130383631653334363863323934623966633431383463393765343866396430626630306534 +34613163623962383562396139346166333731656462356234376266643338343833386264303333 +32333336323538326362633161643764663932346434336634353839396565343762373662623134 +66646163636434663833336263623465313032383431393562316466656163633830663264356430 +32643830393964313130366133623164616464393863653462663238616239316563373531363637 +34333639313038373565623331356463633839636333396438316364323361623166336236383533 +30353635313366613666623633313736633132336635353466353538646438366631343433653065 +34323966643961656266396462386337653736643539643165626635633061633862623439343263 +34376531363739383363613866653930623761336266373234656339393738633161303731336333 +61393531353139383936643537393833653736353732666165396361613235396637666431323339 +62346537633931623461356563373630316164656239663566626136333439616437363935313838 +34646430663163376337346330356162343139366165343838383034643239653865613662343931 +30326136316564613034333734326266353234353832636365626361316361373833636166653663 +35636338663730353538643331393237666239383634643561633762353835366534363164353936 +36666131323134353439623837383637373664393432626231613433373933366366653739343734 +37393433353938323764653433376664366433343433303665343636643537356465626363633431 +37326438616637376138323839313037343538666635663362353434316264633862653237386136 +32623937336366623730323937663835303964653632393437363265633733646463316432363665 +37303333313565353866653535376537323335323632336235343961323435373036303932386639 +35306364353836613137313866343938633436663961666662653663303563633838666236366533 +35313762653361396632383061393661663536626532393833336365613665333062333964613561 +66666435333134663566653365653030303161626339326566623737343232653962613534343537 +31306263636239383663353134666232643639376361666134613161396364376466636438303434 +66363638313164323234613734613161353334373134643633656430356235663536666666643937 +66646665383337623633313664373833373336373031626139396464376161303034623264386133 +30353162326432323737343237313164636263306663316565393838353231323736346262343435 +65343930373834396632306439396330313130656534623638313765613062363239316464323066 +64656461626333363239653062376163616664613364336261363632353931613738623932366135 +61343239663863316336363235613666396266306230633165663036323332633133393930306132 +66663230353664356635326433393338313165656633313531653034343065616664393364663433 +39373062613933383033383936356436313964303231396235393863623962356466373933636161 +66326434636262313061363439363432666537303663636262353566646236663431646338666333 +39373430343435633066643439363937383261623138636231353262393434626336633166326362 +64343834616232316366393264346630363238343361333565306561656663613239376562303766 +65323235663636363463653731303664363738303937366636323961633534306163303464646236 +30326333326133313534323338333934323135636234333430313231373434326630326432646331 +35636334313632366630616135363064343732353831366164643262653361656338346265326264 +30396366333533326132626638646338343331663533336435636264663163666138383564353364 +62316537656432636462636266313361633665653837636563363362323565613834326531386139 +64386137333136303862376631343534343930353836343135306564363732326362306330383136 +63626264643732353963343433333330623835613338303531316531656161313465313330323065 +31656339323035643539383336653863386331366630666330643735336464363134306136313734 +63393439646437376462343836306465643234303331616635666531393861313133346131616337 +30343136333561656637663633646261663638333732666264383635383463643736653565316363 +62333733333933643735623564366332623632323664373035376261636465356665636239323761 +30643338623735633935333563363832353433363231636263356664323665316632323236626135 +31633031393837393332633462303262356264643932363533656430323130393661303866313638 +66613235313932386266613465303163303238393235653139363731663766306632653931383436 +33626163373965313033393836616535396432613763383231653464616332616439386262613334 +30656439653630363539656131623035316161386661616439666566396130313237346332623231 +64383061626333643539323432353631366534373634396365633639636537623261616664393862 +65636363623439353266373939333164653733623336323637346664373565316263653465383061 +61343936643634353463363935393564616365336162646337333066313839633561643236316134 +37396361643865653730396338306566333463626465396165343938643264313737306163646639 +30633666623161663037626361323237386261633838613564316135383764663636356435333765 +32363435613632623833636434643239643762353636366636613762313233303061383165643737 +38613766336564646561343233336530373835643066313536376139383339303331386433643432 +38616433313763383939636361316561363939386437383064333535633163653863386635656532 +37633163613866636166373436633639303734643431376335373764386233326465656161643431 +30626133316262336361303264306336356633343261653336316530616237326163336536653330 +66323235356438376636313566376239343564616631306232356166326533653366653135636563 +64353330333961383266326363326136383963323333336333363332366130353333636263636132 +39343361303561376636373233316332336262653333393333633338316338663038303161336564 +64393631626266333434626230636466386166653439643135613438336664653436343738613237 +38663162663062633038323564663865333930633235303138373465356337616439393632373932 +34383430663539373563386366363764656661363363653532333535666662346130323663616633 +62323436633564623437666336323935376561386262616135306436363864313566313262313931 +64316330313331336635386663313438333233393231373130356435323861623139656430613637 +38333861616235336265303864363037373233613061323334386661383035343263643532303164 +31353963396234383463326533376263653036656264306563336335363333646537653863636338 +36653736626339346161333234316131313164373164383634376137393731336630653465326633 +35383263396632396131366465636263623234613138363666623761303631313231366439313031 +30666261393230616534313632393539383730663937303136363635626136373963333738646366 +31613032303330336534376534643030653631356635636435306339303133303834623035383434 +38336161636334366433333938623033393436633837646632363239623535376532313738386563 +63633137386137376166366532643461316130643739316461386632623930633963303436343938 +61653330343766323737396331303361326536663930306131303335306261303130306134383336 +64623538393938316664663031303639333232373731366531373366326562363262626534616339 +30656332356265623266373332313838616362336431333335353134623562303061653039346666 +66373761646332356436623830363163343564623566623362613863356531383665316638353838 +63383933666138306132383531646266323336313464363463376466343037666161613633323461 +35643461663563353664383764666430376233623339306261383564336264373363626664333564 +66363961653466653439626363323039356335633564353134663564393764303361653564633461 +61366130616338373538323931373030613931633535633238636631386333353563633335326262 +37323665373833336130396230386236386637363439326264363431626266323233333434383736 +65313236613230343864623833353261656138663065653836363964653162613130643039336566 +38383731666161363933353838633836636532363636306339303532313464383236646463623231 +61393261353166623061373430326663333037666364346436363363343837396435336231393239 +62386638313338313663623766393332613866316262636265343161663834316231333864386130 +65393131633562316137393865303131376433643464366334653338323835643334346461383561 +39306634373639383637353833383934636633643638613239613865323336646435663239616337 +63313664663637623234653962663839376565336335356461353739306533666132346236373762 +64383833663135366233613638373466303932613662613531666634316361633563646231306137 +34383566633562663132613138663232393062313234626639393665313636663537303433333539 +66643238656537323635393737643965363135636264366166303938323431643634623839383962 +62656165353630623632383062633164643932363333393961303239626263396462633262616431 +61356162383239316238663834613564343166346235303863656237393130616135373931303430 +38306634616235613366656336636639623832653063333132633039656536393137363538373735 +37333233353431353331316336376639353335623033356661306331633863353136626632353761 +66636230393765636330323161363937383932613639303831386262636463303639303139633436 +62663538343561323134666639323061336563643037303339373835313333323236653661353565 +31346161396564303437316664333162393935653839323664643731376532366665323431626534 +64303334383662343366623231633762313135306466383163303066643132373761336261313765 +34323135313261636532336135383231643465313162323934323366333533313432383835613263 +65653939333866303664356636366637316238373930336334343030396232376263616465316665 +61663631343537306134306132643263646563333133353835663633653330613036346336663736 +37366363633035333466613937646432383665326365613435303134316665613038356462343830 +32666363643632356531343865363265373231643266666638613836363633623330623062333839 +65373537303835643534616162656232353133353132633030393966323137336132613865366137 +66663334633366313532303834623163303062373435356363383862653837653636356237626463 +66653961633463373438343433373739643166643130363461353039333865343434393463306133 +66363033663866666563636335663737666139366432633362636263663031626463346235373839 +65323539343562306364373263336134663031306139323730303863353635626534396133616538 +64613361363063346566303365306332323031663439323436373839396563316464333937323234 +66306362323439343334343862623664623130316432393062336232333961383165666532643235 +66626363653136306239623061373931343865323036303035653832616335646162643665653835 +66656364353165626334633731653134353466633561653163373638306162633465383666333032 +37613936636164363361613631383738396464353037373437656136316434643561306362613035 +63633138376266383138343564653362326463653239323838323564656566383930663336396236 +39323165653162343337326466363131643031653332613035306231653765653936393834653537 +35313638323135646464643963383534613432613030616631353832343033353565343064376230 +61623563623831396264373132373164613432313364613266393334376432316634623565626261 +38613830313362373064366262383061626165373134633232376639343633333032626539343161 +61383630353435323935356164343963366365383835383830313336313863323739383030666538 +36653833623637326337323637333937633839383765343239633461323465616566626239653538 +63353961666436396463316166323234663864393037366437336166336465363835393133363165 +61633533363532656533396337363166643964323034383363663562323663343031666266643164 +62623538303161306137373039626238306631643433313865623534633437613539363831323130 +37623432663430303661386432653866646465663338353930386163383231623564666139353863 +32366635646664363763393366376438363565313833303331363334663133333738356531386633 +32323064663236656163323238383063633635626234353163643663333436396432346262323830 +64653331373461643937356566363237636536333437626532383733333262356236633437353864 +31363034323963376365393035313633386663363761623166326533643563363466353136616538 +37393431383832393934313462373738633130613933663230616131643734336532343062653635 +61376462666337386237636636393865626134353532316234633665653864366330306131656632 +62366339313132323837373761663062343635383330383837313136643865666563623064633733 +63323333383831373932303463376639656432626365343033366661633035633035353333353063 +66326530316235313338396230343562643431333937663331373036633666393933326461646634 +64373964326564613233393033306439386161363134393131303136313964343265313838303833 +33656161646236643939633461303831346133653236356534393732613430323231666636623037 +38353136633136373264623464336139383864336639383064663262393861326137313935636361 +36323431323038353635643862303038393933373033646336306339303830386665663664363663 +30363265626534643638613962336336373365363539333135366631356561323366646332306338 +32336536346438633532393162373366613030663266346661383363633231653733313038356135 +39633538323262326264383831663638343339306165323364386135363563363033366231643731 +32386132653766336534613035343339623432616631363462336566363338353861353031313761 +63353835363465313835343065333537303836366239326239393135373365353930353730656433 +34323633613561613231313832653334356461663864333038616661343631646534356461303761 +31656365373165656431383963623633363630306665643234653761313838663261636361346230 +62373966633936373237343738646438373164393333383339636337653163313665333832393035 +31623432613030666138363366646164323961626331653462616662653535613662373361376465 +36633431343764323333343731626636313166626166393833333730656333336430343566326134 +36323339316161626531353462356132393131333831636430336235613765363532313065313133 +63363033393964326263383836363233366635653064383830333932366135336231666336386136 +63353439626236326434616433643238353035653466643337353939353738353430623634346131 +31363830643635396637663533666536613039343761346332343633393962393034376335633162 +35656437653136376234633066616534313261373863613664373031653939626339303236623633 +61336638323233336135653135616135383337306339613736396363326362373966653562376265 +39613434303062356661373266396236643934366631336239363534383733393138323361353934 +63613565366333303564623162616130626162633965306133376434626364343561653339656137 +37373161663332316533316233653439366165323835383430653064643464313463626531376635 +39646530383463653134333235393763313662633439343735323464346339666336333635313532 +33623230623332373561373236353538356534386338396166653134663434356632316234633037 +62383536386231303937633736303664393137366639613136383765643632636638666538303366 +35666564386635366535346338346131666466616132333231313465643139343638333262666231 +33333665386665343531616430643662313634636637343731613432313136663539323735306635 +64393930323263393737373662656335333432343465333233393666616261633335643066663838 +39383939663365326662616236333036653162363332356634636566393662353064386437393834 +37373266343739633431376465313936363331396134646564356665363533353935326138363464 +38383332636536313039333965383563343039653736336166376238393765356639393162333961 +30646336633264386531306532623937323835633966343339643739643162646562663337333038 +31643432313038303635633733383531363962376333626265616262623932666136653333343763 +63633836323339366630316364343662396139613132346362316239316430353366333139383935 +63316363363732653130376265363132323264323264303561366232303838643835633633633732 +62323965333738393164656338376332616636343836323432623834316434646538363638666231 +33353630356535326364376232303731353130353638356438313235643264336366383366393264 +61366664323562643538616264373066383034353035373131333130616462613863646232646531 +63343735333661326633333034356364386136653530356362623862363563366634303733393862 +62323162306532366461323438313738653634356334383836653665613739346662306364363439 +37636334356333326631316631396639353764626333363633306535316261633838643831343038 +34363438623033316564343739616131616334626130363531636536353033366638633938613331 +36303533396138353765306663653733623532633464623363333634626363663563366134643438 +61363864613564313266393533613233356530376436633639383365363765373865333430343638 +61323063386330373134616261663866626364666165643534313536313565633432376465306239 +62666331343635303839303164623662663136613539393633323861316636316561363462656361 +36363335656161373566363431643565363762333862306161633062313532336230666232396136 +62353437363338643939316333613532626339383337636438303030313235616665613263656661 +63656631633765643931666431333162353231636237653037383537656462333737393730616633 +31323830616563643837633730366464633832623037393962346238306336656332643130386432 +35376462303736363835373630306336383739376666663434343864336238396233343130663134 +66393935623032313735643938663138323836376437396434383163623962366466653263636236 +61636432633964383734626433313963666562336332383630613631363064373838303636613033 +37663837383031303034313163383137643333386635306432623137363530663062623966633630 +37643665386137396663333031663435316237373863623631393930323535323634313062306136 +61333731326333303134356163626262353466643036346239333432346262323562356366336635 +37633962393662623761653430323762323165653964646439333831313734656235623339383936 +32373064313236663039373866646532666333633936663834306237616166353665613163373565 +31623937636261306363393662376163653264396564333262666131626436343833313161353838 +37613833353139326635343339346166663366663464306563323536633034333737376139616231 +38386162393234353330343463316464323631326265373639656163623765613837373036646463 +31313737343834373935653835663736393031373962616534373137313565333836653737643866 +30613534373538323035623263326361303265333563333164373835393637343034363764303166 +32636135616334643565396565633832636339336466323237616535616432393839613638663937 +34316263373766333133653236353364616564626163313133353532386231663962333831646165 +65633133343435316461326232313036346366366464363236333261626536386530383338303030 +62643236663964323430313534646666623064346533663038383330616435393932376637346531 +32626166306665636336383665356238616463663137353836663362336336393634643361333438 +30353338313665636135363066653331323563626336363030373861663236373335326135363864 +62333737323537336138656230616666613766333331623230626430393031613631623630393339 +64346565363563636336303134623264303438363932613765326630633965306439336262626637 +37393664636462383533373331376132626630653634366362393335653139346364356264653038 +64316462623632383235303963303838333831323630646665376565623834333161336438313861 +66636263316361616131356464366630633937316639623034373934623334373833396638656265 +30393364393266366366316437393631316637323136343939373464656261616664323530636330 +34656233646536633866393731323437333665383431333266343361343232303961643734636336 +64353964313162623261303036633464633439613836343637626439633635333830373034333639 +31636236656137313462383631383962366431343462363435373136646533633536326133623132 +35663734643464373136396334633964636532643636333435313732666532646131663562383663 +34323564313235336463356161313463393831333763646539323262393064643332353165616133 +64353662663634613439633364336463396636386136376338316434396330323834343339396135 +66353837346535656136356139356232366333313262303031373237396364663332376133396664 +62663434383932616239383063653637633565363439633366646333313265366264623238646336 +61643230356432366561626435306638616439663733336236373131396136623236656134633332 +32373635366534333866643964376230616161393235343133393463633763333630353033623836 +33316461623030633763306338663939353961326539343336373362613962383434326330373830 +62323264336664366364316437613338343439346266386666653563346437626536653562333064 +65346236633362343633313735633866333930363236313930623163643033366437323830393338 +32616137613738303030356339633632356462303332633737663833643733386435626362303536 +64656637336663666133353936396630326562363637336132326165313431323239303132363939 +37623233633332326335393764363961343333663464386638666339323833306135613731386536 +63343331343539323933303138633435643663346365623166363636393031353537356633393535 +38313832363934616665656635383133373464646362333534613061343333326534633735633537 +39373161356334633830336663393163396633626463336366366363383738616362343730343763 +37616632346136666335313263306631623062663134366362373435323237386230346462623864 +63616436663332343062653337646432333532373839383465363337643639383664613164323138 +62313262363064396265653135316638633131303239353631386166326335363438656232623937 +65653133346438326234363763303432353335643630326262336363333964643631326134633635 +30656561303038366537363232623363333733613262353964303235363563393339343338326539 +32316535373834666137643136396439643336393266356661353430303062666538343563386437 +31633930666662373036626264363536386364316462383164653636303936333663626636643238 +66303239636664313939663065393762623537303137393038646466346165353636316132363635 +31386239666537393539666130663031316334366666353734386235383539303962616532663636 +65323734313332653439303131643430666336336163633636353236363832656565653765383665 +37326436366531613334656137393939666564316239653062643866616630663934336539653962 +34386266613537663333353162626232666236643465653738613036393230313132363530653161 +39353661323064333638313833353333353166643637383037346532366435363237333964353166 +36383732613664363464623836646436633538346535663734383136373935623134393633353532 +64356332366366376536366334356339636464646236353039343862353234346465643263306438 +62616538303530613533316236306635313731363230663538343736656330663664313933363362 +61316333363664333062613165393366373538303732303130313534356235366233316131353037 +30623137633737613332376231383238333166383336616264656235333361396532666634616362 +39373538356436663661363038633262333437343335306662346165353866316565316136336166 +62663163313036653865323161353733303261646531376536663332333336346336666134303164 +63333435393962663935623263386534393562653738326439316639343232386263326130376534 +30323164663362353763343835303230386537346662663434653736326366613338613761353565 +63643137353761376465323837336463303165316532333539396131646335313262323334306165 +38363933333133653964663664383964383930326365613637613532303963636265376133633163 +63393937343039373738653664383730646235656436653261373536326162366139396335346637 +61656361323734643036666131323832343030613636323732313561323439323964646163633530 +30313832333031643832323965323935386538386565636661623636366265363466363166636238 +64343933306565333330323962396635616530383436633933623131376232386538303539663661 +35623338656161393634373030323137316537333436373064333834303936616438376566613133 +66353237393338613436306163646466366334333065313730323732306331646533616465323565 +31653337623363303266663031323234653166303331333637323030313636343236393763623736 +62353863363461623136386336346461393330663332303263623464306265373832323663313734 +66306635363761323737666536393332613463643162613138386336353331653364663339636433 +65346437303236333839303665643664613836343232633734356636363737616463366137623939 +31643532663737356563306437383236623431363764343332653434613762383862383631626136 +65633835356532373934323763386535313635643963346634643730663431376433333736343738 +39663563393266386337393138633833623738633331376634383833646664393637313939383764 +37383765636564373736623935393063316133383237376564623665336137383631366236623634 +38366139633361333763623938663365616266643861366136666661613037633465323430343937 +66333136383730306236333665386261646661643761373238333435633736353938636464356439 +31613763636430386337393230386263356539613436613064383664363664353132363563643938 +36633036356265666539366464613934376165303933316333633737396230383237616439343361 +39353161356133353161656434623166623837643232306333303161353239653761653238383436 +38636563393536636361656662633561356331633735653763336134383931306365633363663662 +62633235353530383764346465343733633661656331386564623730613336333864316432653136 +65336435356138336237656437363662366334646265323465663634663039663734656235363363 +32383130303966346536313135326365636630666336383162343037306237663838373334336261 +33633965313163353365346261356537353733656235666234383232643264636435663738623230 +62623531333866613736626532326635626261333465393066363639616537646463366238316634 +65346630636230396232343635366138313035363762313133396662343539666563396162663539 +30323230346365643664653665366463303635316334373539383937313034383931356665363734 +35306533653365326663346639396339623136393261616433666639346464393033333930373733 +35643934636139373732346462396362313161386636333964326533613031623534373535353031 +31373864383135626534643733653332396538373962636630303766633735353736643461613138 +63316434636231613666393662316139343538646134633064623731663463383939666436613062 +37653332626139623062376135653434643662626535353536613638323736303038333761633562 +66643936316639326566656535326136393765326435313765303031373537303436653362363830 +64336364383630313266623735333134343038346164356663363732303031363265326263363764 +64336435333833346634623635323632383231333030336666336533393065383131316133386532 +62336136323033343233623065356332306531366361393461646334616363623630663365633666 +30323332393732363364333261643961343262616131336366333339363131643933366231383732 +34386333303730636439613738303735303937333964633861333834376664333838353836666532 +35653132363765636336343433663332646564326361313438356336303766323531616533323938 +65663234663531363537303662343965313833646235623361303061333239666536323465393565 +32356562326533376334376531393338653366373066393336353738383563373635366166313735 +30383264376538633234313035646265386236336464353434653163326334356265643262646165 +61663734613135316133316331333533343262386538323539643333623761623937373838316239 +39343031663036323662336530653163646438313237316661613964613434383765663731633737 +64663765646532666637303739363665636466616230373636313661383636623331663534613230 +32666161623966363330623139646261633534393337373339663666623638393062616434326233 +39623262333330356634636638383865306236656132383934356265613031386231373661303134 +64653535343836346665346439396136353061343730373761636365616132376566326436613030 +30393263613265343534346136636266656366326433663033643831386431663562356533313732 +62373231633364306462306662343632653862316632633733396335363036353966336562383062 +39363938653635373662356637346635663966653033613061343234353835616136336363363635 +64613935616339666338386564633830666331616134386530666365326562613166316333343037 +37336533376539626434373931303935663932616666333631346361303834363563656330303633 +64663064646662656235366161353339313037393032313264316538386631363337336133393362 +33643666376237633264356235306566333538373834633835316166303131386165353263333035 +65636437303766303162313137303731636131616535663839383531643236353261623034363662 +32613337626135366632386431346639653464323837373039363235383639346665333039313164 +32396562373534633639646261323937366532383538333532336234663962613937346535633032 +39396636336337643432363237373739396336653636663761626436353335373764613030356435 +32396532353865313566646561636661303863636132356139616230323030336462633533373138 +65616432643934396335623836363131633533636563346163623239396165373638373231303462 +35653735376431356537643166356365376131326466313932656133313964336438373938633762 +32643836313233653930346630326236373561353434616634336163326430383338333133376337 +32306434363436313236326130393339343263376562363937306639373938376330653437363964 +61626530633234356466306533336630373364653131333635623631353037333034613234363139 +33396633613239373034316638366434653932663138306433666631666334396662633336326536 +38353764636432643963656562636463383463656663386462663838666335356237373262393332 +61663935346230313562376363396631653463336434343134306166616363643833346234643061 +63376336316432623163386339643264323339633061396664393062383430356638393234323134 +61343633656366373533383130346437373765336463346636393763643038656566643665326266 +39306338326638383738303161303634643763613261383631646466323063646263336661366334 +30333734373931616432343037306530333734303737383437396666393839303435306531383134 +37306532663838313765656634303566393063366464343966333837303233373864356439323164 +34633630356239356561396330313137303030386130396432393836333134396563636533613537 +35303138393536326261336131656434393334623930643865656562633164316465643336333037 +35663539633164613264313165306261373932306566306339356633343538386163343366383363 +32376631366132653265336439343731393538316230343361616536343031656465356565373236 +33366266666237313562666134326133646531386539356436346632303933623361313234656630 +32306366363936396434623334306532373033353539383566623664306338346131336666616563 +63343134356635393939666161386638653763653739343462666365653138363833306666616532 +31646266303839623964643961326239316666363631643430643461373362343663643365323433 +38343237643439386638326365373830656530303939636331316638646263653632646162366430 +61363965643038393039653638303761646536646136333665656165343931653466666565396632 +30393535383134393032633164373262356634313239323032643930393864363462303232643866 +38653631333030663733623662306538313433636462383065636465353365343966383162313361 +65623264643937633132393164306461636339616235616630343731383633393339663638613761 +30336236653534336130623233393038646662303033303063343039613865313361336133353139 +31303832656664663134366133356234366565666463323239326636373034393235383666666435 +6139 diff --git a/misc/vm/Netzlaufwerke neu verbinden.lnk b/misc/vm/Netzlaufwerke neu verbinden.lnk new file mode 100755 index 0000000..e2fe26b Binary files /dev/null and b/misc/vm/Netzlaufwerke neu verbinden.lnk differ diff --git a/misc/vm/injector.ps1 b/misc/vm/injector.ps1 new file mode 100644 index 0000000..4c785cf --- /dev/null +++ b/misc/vm/injector.ps1 @@ -0,0 +1,155 @@ +param( + [string]$ticketb64 +) +# BASE64 +$ticket = New-Object System.Byte +#reading from b64 +$ticket = [System.Convert]::FromBase64String($ticketb64) +if ($ticket -eq $null){ + write-host "[-] Be Sure entering the correct mode" + write-host "[-] Cannot receive ticket from file or b64" + exit; +} + + +# ------------------- FUNCTIONS -----------------------# +$ptt = @" +[StructLayout(LayoutKind.Sequential)] +public struct LUID +{ + public UInt32 LowPart; + public Int32 HighPart; +} +public enum KERB_PROTOCOL_MESSAGE_TYPE +{ + KerbDebugRequestMessage, + KerbQueryTicketCacheMessage, + KerbChangeMachinePasswordMessage, + KerbVerifyPacMessage, + KerbRetrieveTicketMessage, + KerbUpdateAddressesMessage, + KerbPurgeTicketCacheMessage, + KerbChangePasswordMessage, + KerbRetrieveEncodedTicketMessage, + KerbDecryptDataMessage, + KerbAddBindingCacheEntryMessage, + KerbSetPasswordMessage, + KerbSetPasswordExMessage, + KerbVerifyCredentialMessage, + KerbQueryTicketCacheExMessage, + KerbPurgeTicketCacheExMessage, + KerbRefreshSmartcardCredentialsMessage, + KerbAddExtraCredentialsMessage, + KerbQuerySupplementalCredentialsMessage, + KerbTransferCredentialsMessage, + KerbQueryTicketCacheEx2Message, + KerbSubmitTicketMessage, + KerbAddExtraCredentialsExMessage +} +[StructLayout(LayoutKind.Sequential)] +public struct KERB_CRYPTO_KEY32 +{ + public int KeyType; + public int Length; + public int Offset; +} +[StructLayout(LayoutKind.Sequential)] +public struct KERB_SUBMIT_TKT_REQUEST +{ + public KERB_PROTOCOL_MESSAGE_TYPE MessageType; + public LUID LogonId; + public int Flags; + public KERB_CRYPTO_KEY32 Key; + public int KerbCredSize; + public int KerbCredOffset; +} +[StructLayout(LayoutKind.Sequential)] +public struct LSA_STRING_IN +{ + public ushort Length; + public ushort MaximumLength; + public IntPtr buffer; +} +[DllImport("secur32.dll", SetLastError=false)] +public static extern int LsaLookupAuthenticationPackage([In] IntPtr LsaHandle,[In] ref LSA_STRING_IN PackageName,[Out] out UInt32 AuthenticationPackage); +[DllImport("Secur32.dll", SetLastError = true)] +public static extern int LsaCallAuthenticationPackage(IntPtr LsaHandle,uint AuthenticationPackage,IntPtr ProtocolSubmitBuffer,int SubmitBufferLength,out IntPtr ProtocolReturnBuffer,out ulong ReturnBufferLength,out int ProtocolStatus); +[DllImport("secur32.dll", SetLastError=false)] +public static extern int LsaConnectUntrusted([Out] out IntPtr LsaHandle); +[DllImport("secur32.dll", SetLastError=false)] +public static extern int LsaDeregisterLogonProcess([In] IntPtr LsaHandle); +[DllImport("advapi32.dll", SetLastError=true)] +public static extern uint LsaNtStatusToWinError(uint status); +"@ + + +Function ConnectToLsa() +{ +$lsahandle = New-Object System.IntPtr +[int]$retcode = [KRB.PTT]::LsaConnectUntrusted([ref]$lsahandle) +if ($retcode -ne 0){ + write-host "[-] LsaConnectUntrusted Error (NTSTATUS): ", $retcode -ForegroundColor Red + exit; +} +return $lsahandle +} + +#-------------------------------- ENTRY POINT ----------------------------# + +$assemblies = [System.Reflection.Assembly]::LoadWithPartialName("System.Security.Principal") +Add-Type -MemberDefinition $ptt -Namespace "KRB" -Name "PTT" -ReferencedAssemblies $assemblies.location -UsingNamespace System.Security.Principal +# CONNECTING TO LSA +$LsaHandle = ConnectToLsa +write-host "[?] LSA HANDLE: ", $LsaHandle +# EXTRACTING KERBEROS AP +$retcode = New-Object System.Int32 +$authPackage = New-Object System.Int32 +$name = "kerberos" +$importnantlsastring = New-Object KRB.PTT+LSA_STRING_IN +$importnantlsastring.Length = [uint16]$name.Length +$importnantlsastring.MaximumLength = [uint16]($name.Length + 1) +$importnantlsastring.buffer = [System.Runtime.InteropServices.Marshal]::StringToHGlobalAnsi($name) +$retcode = [KRB.PTT]::LsaLookupAuthenticationPackage($lsaHandle,[ref]$importnantlsastring,[ref]$authPackage) +if ($retcode -ne 0){ +write-host "[-] Error LsaLookupAuthPckg (NTSTATUS): ", $retcode -ForegroundColor Red +exit; +} +write-host "[?] Kerberos Package: ", $authPackage +# GETTING CURRENT LUID (INJECT PURPOSES) +$output = klist +$CurrLuid = $output.split("`n")[1].split(":")[1] +$sysIntCurrLuid = [convert]::ToInt32($CurrLuid,16) +$luidFinally = New-Object KRB.PTT+LUID +$luidFinally.LowPart = $sysIntCurrLuid + +# TICKET INJECTING +$protocolReturnBuffer = New-Object System.IntPtr +$ReturnBufferLength = New-Object System.Int32 +$ProtocolStatus = New-Object System.Int32 +$KrbRequestInfo = New-Object KRB.PTT+KERB_SUBMIT_TKT_REQUEST +$KrbRequestInfoType = $KrbRequestInfo.getType() +$KrbRequestInfo.MessageType = [KRB.PTT+KERB_PROTOCOL_MESSAGE_TYPE]::KerbSubmitTicketMessage +$KrbRequestInfo.KerbCredSize = $ticket.Length +$KrbRequestInfo.KerbCredOffset = [System.Runtime.InteropServices.Marshal]::SizeOf([type]$KrbRequestInfoType) +$KrbRequestInfo.LogonId = $luidFinally +$inputBufferSize = [System.Runtime.InteropServices.Marshal]::SizeOf([type]$KrbRequestInfoType) + $ticket.Length +$inputBuffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($inputBufferSize) +[System.Runtime.InteropServices.Marshal]::StructureToPtr($KrbRequestInfo,$inputBuffer,$false) +[System.IntPtr]$PtrToCred = $inputBuffer.ToInt64() + $KrbRequestInfo.KerbCredOffset +[System.Runtime.InteropServices.Marshal]::Copy($ticket,0,$PtrToCred,$ticket.Length) +$ntstatus = [KRB.PTT]::LsaCallAuthenticationPackage($lsaHandle,$authPackage,$inputBuffer,$inputBufferSize,[ref]$protocolReturnBuffer,[ref]$ReturnBufferLength,[ref]$ProtocolStatus) +if(($ProtocolStatus -ne 0) -or ($ntstatus -ne 0)) +{ + Write-Host "[!] Error in LsaCallAuthenticationPackage" -ForegroundColor Red + write-host " NTSTATUS: ", $ntstatus, " Protocol Status: ", $ProtocolStatus + if ($ProtocolStatus -eq -1073741517){ + " Ticket may be out of date" + } + exit; +} +if($inputBuffer -ne [System.IntPtr]::Zero) +{ + [System.Runtime.InteropServices.Marshal]::FreeHGlobal($inputBuffer) + [System.Object]$ticket = $null +} +klist diff --git a/misc/vm/vm-prepare-sys.ps1 b/misc/vm/vm-prepare-sys.ps1 new file mode 100644 index 0000000..ad8f16f --- /dev/null +++ b/misc/vm/vm-prepare-sys.ps1 @@ -0,0 +1,73 @@ +# Installiere alle Mounts aus target.csv +# Geprüft wird, ob das Laufwerk bereits vorhanden +# 11.05.2025 da + +function Mount-Drive { + param ( + [string]$DriveLetter, + [string]$TargetPath + ) + + try { + & "C:\Program Files (x86)\WinFsp\bin\launchctl-x64.exe" start virtiofs viofs$DriveLetter $TargetPath \\.\${DriveLetter}: + Write-Verbose "Laufwerk hinzugefügt: $DriveLetter" + } catch { + Write-Error "Fehler beim Hinzufügen des Laufwerks ${DriveLetter}: $_" + } +} + +function Import-VMInfo { + param ( + [string]$Path + ) + + if (Test-Path $Path) { + return Get-Content -Path $Path -Raw | ConvertFrom-Json + } else { + Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)." + Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt." + Pause + exit + } +} + +# Laufwerk Y: mit weiteren Mountpoint-Infos mounten +& "C:\Program Files\Virtio-Win\VioFS\virtiofs.exe" -m Y: +#Mount-Drive -DriveLetter "Y" -TargetPath "VM-Data" + +# VMInfo aus JSON File einlesen +$VMInfoPath = "Y:\.vminfo.json" +# Schleife, die auf das Laufwerk wartet +while (-not (Test-Path $VMInfoPath)) { + Write-Host "Warte auf $VMInfoPath..." + Start-Sleep -Seconds 1 +} +$VMInfo = Import-VMInfo -Path $VMInfoPath + +# Weitere Laufwerke einbinden +#foreach ($virtiofs in $VMInfo.VirtioFS) { +# $targetDrive = $virtiofs.Drive +# if (-not (Get-PSDrive -Name $targetDrive -ErrorAction SilentlyContinue)) { +# Mount-Drive -DriveLetter $targetDrive -TargetPath $virtiofs.Target +# } else { +# Write-Error "Laufwerk bereits vorhanden: $targetDrive" +# } +#} + +# Drucker installieren +foreach ($drucker in $VMInfo.Printers) { + # Überprüfen, ob der Drucker bereits vorhanden ist + $druckerName = $drucker.Name + $druckerVorhanden = Get-Printer | Where-Object { $_.Name -eq $druckerName } + + # Umwandlung in HTTP-URL + $httpUrl = $drucker.IppURL -replace "ipp://", "http://" -replace "122.1", "122.1:631" + + if (-not $druckerVorhanden) { + # Drucker hinzufügen, wenn er nicht vorhanden ist + Add-Printer -PortName $httpUrl -Name $druckerName -DriverName "Microsoft IPP Class Driver" + Write-Host "Drucker hinzugefuegt: $druckerName" + } else { + Write-Host "Drucker bereits vorhanden: $druckerName" + } +} diff --git a/misc/vm/vm-prepare-sys.xml b/misc/vm/vm-prepare-sys.xml new file mode 100755 index 0000000..b00a30e Binary files /dev/null and b/misc/vm/vm-prepare-sys.xml differ diff --git a/misc/vm/vm-prepare-user.ps1 b/misc/vm/vm-prepare-user.ps1 new file mode 100644 index 0000000..15b540a --- /dev/null +++ b/misc/vm/vm-prepare-user.ps1 @@ -0,0 +1,102 @@ +# Installiere alle Mounts aus target.csv +# Geprüft wird, ob das Laufwerk bereits vorhanden +# 11.05.2025 da + +function Import-VMInfo { + param ( + [string]$Path + ) + + if (Test-Path $Path) { + return Get-Content -Path $Path -Raw | ConvertFrom-Json + } else { + Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)." + Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt." + Pause + exit + } +} + +function Add-PathToQuickAccess([string[]]$path){ + $path | %{ + write-host "Adding path '$($_)' to Quick acccess list." -F Green + try{ + $link = (New-Object -Com Shell.Application).NameSpace($_).Self + if(!$link){throw "Item path not valid to be pinned."} + $link.Verbs()| ?{$_.Name.replace('&','') -match 'An Schnellzugriff anheften|Pin to Quick access'} | %{$_.DoIt()} + }catch{ + write-error "Error adding path. $($_.Exception.Message)" + } + } +} + +$VMInfoPath = "Y:\.vminfo.json" + +# Schleife, die auf das Laufwerk wartet +while (-not (Test-Path $VMInfoPath)) { + Write-Host "Warte auf $VMInfoPath..." + Start-Sleep -Seconds 1 +} + +# VMInfo aus JSON File einlesen +$VMInfo = Import-VMInfo -Path $VMInfoPath + +& $PSScriptRoot\injector.ps1 $VMInfo.krb5.cred +$klistOutput = klist + +$serverping = Test-Connection -ComputerName "server.pn.steinbeis.schule" -Count 2 -Quiet +if ($serverping) { + if ($klistOutput -like "*Client*") { + foreach ($Mount in $VMInfo.Mounts) { + net use /persistent:no "$($Mount.Drive):" "$($Mount.RemotePath)" + #New-SMBMapping -Localpath "$($Mount.Drive):" -Remotepath $Mount.RemotePath + Write-Host("net use $($Mount.Drive): $($Mount.RemotePath)") + } + } else { + #if (-not ($klistOutput -like "*Client*") -or (-not (Test-Path "H:"))) { + $Credential = Get-Credential -Message "Die automatische Einbindung der Netzlaufwerke ist fehlgeschlagen.`nBitte geben Sie Ihre Anmeldeinformationen für das Netzlaufwerk ein" $VMInfo.User + # Laufwerke einbinden + foreach ($Mount in $VMInfo.Mounts) { + net use /persistent:no "$($Mount.Drive):" "$($Mount.RemotePath)" /user:"$($Credential.UserName)" "$($Credential.GetNetworkCredential().Password)" + Write-Host("net use /persistent:no `"$($Mount.Drive):`" `"$($Mount.RemotePath)`"") + #New-SMBMapping -Localpath "$($Mount.Drive):" -Remotepath "$($Mount.RemotePath)" -UserName "$($Credential.UserName)" -Password "$($Credential.GetNetworkCredential().Password)" + #Write-Host("New-SMBMapping -Localpath $($Mount.Drive): -Remotepath $Mount.RemotePath") + } + } +} else { + Add-Type -AssemblyName System.Windows.Forms + $message = "Der Server kann derzeit nicht erreicht werden.`nDaher können die Netzlaufwerke derzeit nicht verbunden werden.`nVersuchen Sie es zu einem späteren Zeitpunkt erneut mit dem Skript: Netzlaufwerke-verbinden" + $title = "Server nicht erreichbar" + [System.Windows.Forms.MessageBox]::Show($message, $title, [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning) +} + +# Ändere den Namen der Netzlaufwerke +$shell = New-Object -ComObject Shell.Application +foreach ($Mount in $VMInfo.Mounts) { + $folder = $shell.Namespace("$($Mount.Drive):") + if ($folder) { + $folder.Self.Name = $Mount.Name + Write-Host "Das Netzlaufwerk $($Mount.Drive): wurde in '$($Mount.Name)' umbenannt." + } else { + Write-Host "Fehler beim Zugriff auf das Netzlaufwerk." + } +} + +# Pfade zur Schnellzugriff hinzufügen +Add-PathToQuickAccess $VMInfo.QuickAccess + +# Pfade für Standardorte ändern +$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" +foreach ($USF in $VMInfo.UserShellFolders) { + Write-Host "Set-ItemProperty -Path $regPath -Name $($USF.Name) -Value $($USF.Path)" + Set-ItemProperty -Path $regPath -Name "$($USF.Name)" -Value "$($USF.Path)" +} + +# Explorer Neustart erzwingen (evtl. nicht notwendig) +Stop-Process -Name explorer -Force +# Start-Process explorer + +# Bei Lehrern Papercut-Client starten +if (($VMInfo.Groups -contains "teachers") -and -not (Get-Process -Name pc-client -ErrorAction SilentlyContinue)) { + & "C:\custom\papercut\pc-client.exe" -m --user $VMInfo.User +} diff --git a/misc/vm/vm-prepare-user.xml b/misc/vm/vm-prepare-user.xml new file mode 100755 index 0000000..f3f8854 Binary files /dev/null and b/misc/vm/vm-prepare-user.xml differ diff --git a/misc/vm/vm-update-user.ps1 b/misc/vm/vm-update-user.ps1 new file mode 100644 index 0000000..c3036d5 --- /dev/null +++ b/misc/vm/vm-update-user.ps1 @@ -0,0 +1,30 @@ +# Injects krb5-credential from .vminfo.json if available +# 02.07.2025 da + +function Import-VMInfo { + param ( + [string]$Path + ) + + if (Test-Path $Path) { + return Get-Content -Path $Path -Raw | ConvertFrom-Json + } else { + Write-Error "Fehler beim Einlesen der VMInfo Datei ($Path nicht gefunden)." + Write-Error "Tipp: Beim Neustart der VM wird diese Datei neu angelegt." + Pause + exit + } +} + +$VMInfoPath = "Y:\.vminfo.json" + +# Schleife, die auf das Laufwerk wartet +if (-not (Test-Path $VMInfoPath)) { + Write-Host "$VMInfoPath nicht gefunden. Skript beenden." + exit +} + +# VMInfo aus JSON File einlesen +$VMInfo = Import-VMInfo -Path $VMInfoPath + +& $PSScriptRoot\injector.ps1 $VMInfo.krb5.cred diff --git a/misc/vm/vm-update-user.xml b/misc/vm/vm-update-user.xml new file mode 100755 index 0000000..b6500e8 Binary files /dev/null and b/misc/vm/vm-update-user.xml differ diff --git a/roles/custom/fvs/files/lmn-patch-dolphin.sh b/roles/custom/fvs/files/lmn-patch-dolphin.sh index 60707c8..a3aa8e2 100755 --- a/roles/custom/fvs/files/lmn-patch-dolphin.sh +++ b/roles/custom/fvs/files/lmn-patch-dolphin.sh @@ -16,11 +16,16 @@ fi id="$(grep ID "$file" | sed -E "s|^.+ID>([[:digit:]]+)/([[:digit:]]+) 0 + - exam_teacherpc_ips is defined or exam_teacherpc_last_digit | default('') | string | length > 0 + +- name: Install no-way-out-policy + ansible.builtin.template: + src: no-way-out.xml.j2 + dest: "/etc/firewalld/policies/no-way-out-{{ item }}.xml" + mode: '0644' + vars: + zones: + - HOST + - "{{ 'libvirt' if vm_support | default(false) else '' }}" + loop: "{{ zones | reject('match','^$') }}" + when: + - exam_destination_allowed_ipv4 is defined + - exam_destination_allowed_ipv4 | length > 0 + +- name: Install no-way-out nf-table for macvtap device + ansible.builtin.template: + src: no-way-out-nftable.j2 + dest: "/usr/local/sbin/no-way-out-nftable" + mode: '0755' + when: + - exam_destination_allowed_ipv4 is defined + - exam_destination_allowed_ipv4 | length > 0 + - vm_support is defined and vm_support + - name: Enable login script via pam_exec.so ansible.builtin.lineinfile: dest: /etc/pam.d/common-session diff --git a/roles/lmn_exam/templates/no-way-out-nftable.j2 b/roles/lmn_exam/templates/no-way-out-nftable.j2 new file mode 100644 index 0000000..93305a9 --- /dev/null +++ b/roles/lmn_exam/templates/no-way-out-nftable.j2 @@ -0,0 +1,43 @@ +#!/usr/bin/bash + +set -eu + +interfaces=$(/usr/bin/ip link | /usr/bin/sed -En 's/.*(macvtap-.*)@.*/\1/p') +gateway=$(/usr/bin/ip route list default | /usr/bin/head -1 | /usr/bin/cut -f 3 -d " ") + +filterchain="" +for interface in ${interfaces}; do + filterchain=$(cat <<- EOF +${filterchain} + + chain filterin_${interface} { + type filter hook ingress device ${interface} priority filter; policy drop; + ip saddr \$allowed_ipv4 accept + ip saddr ${gateway} accept + ip saddr 255.255.255.255 accept + ether type arp accept + } + + chain filterout_${interface} { + type filter hook egress device ${interface} priority filter; policy drop; + ip daddr \$allowed_ipv4 accept + ip daddr ${gateway} accept + ip daddr 255.255.255.255 accept + ether type arp accept + } +EOF +) +done + + + +nft_table=$(cat <<- EOF +define allowed_ipv4 = { {{ exam_destination_allowed_ipv4 | join(",") }} } + +table netdev filtermacvtap { +${filterchain} +} +EOF +) + +echo "$nft_table" | /usr/sbin/nft -f - diff --git a/roles/lmn_exam/templates/no-way-out.xml.j2 b/roles/lmn_exam/templates/no-way-out.xml.j2 new file mode 100644 index 0000000..7cf782f --- /dev/null +++ b/roles/lmn_exam/templates/no-way-out.xml.j2 @@ -0,0 +1,10 @@ + +{% for address in exam_destination_allowed_ipv4 %} + + + + +{% endfor %} + + + diff --git a/roles/lmn_misc/tasks/main.yml b/roles/lmn_misc/tasks/main.yml index 22134c5..7c15ede 100644 --- a/roles/lmn_misc/tasks/main.yml +++ b/roles/lmn_misc/tasks/main.yml @@ -98,7 +98,7 @@ export superusers password_pbkdf2 root {{ grub_pwd }} notify: Run update-grub - when: grub_pwd|default(false) + when: grub_pwd | bool | default(false) - name: Allow booting grub menu entries ansible.builtin.lineinfile: diff --git a/roles/lmn_network/tasks/main.yml b/roles/lmn_network/tasks/main.yml index 7a39349..571c107 100644 --- a/roles/lmn_network/tasks/main.yml +++ b/roles/lmn_network/tasks/main.yml @@ -5,14 +5,14 @@ mode: '0644' content: > {{ apt_conf }} - when: apt_conf|default(false) + when: apt_conf | bool | default(false) - name: Set NTP server ansible.builtin.lineinfile: path: /etc/systemd/timesyncd.conf insertafter: '^#NTP=' line: NTP={{ ntp_serv }} - when: ntp_serv|default(false) + when: ntp_serv | bool | default(false) - name: Add proposed-updates repository ansible.builtin.apt_repository: diff --git a/roles/lmn_printer/tasks/main.yml b/roles/lmn_printer/tasks/main.yml index 960b1fa..996cb2e 100644 --- a/roles/lmn_printer/tasks/main.yml +++ b/roles/lmn_printer/tasks/main.yml @@ -37,7 +37,7 @@ line: "SystemGroup root lpadmin {{ printer_admin_group }}" regexp: '^SystemGroup' state: present - when: printer_admin_group | length + when: printer_admin_group | length > 0 - name: Disable cups-browsed ansible.builtin.systemd: diff --git a/roles/lmn_sssd/templates/sssd.conf.j2 b/roles/lmn_sssd/templates/sssd.conf.j2 index fc3bf48..1591f1d 100644 --- a/roles/lmn_sssd/templates/sssd.conf.j2 +++ b/roles/lmn_sssd/templates/sssd.conf.j2 @@ -9,7 +9,9 @@ ad_domain = {{ domain }} id_provider = ad access_provider = ad use_fully_qualified_names = False +{% if localhome is defined and localhome %} cache_credentials = True +{% endif %} krb5_store_password_if_offline = True default_shell = /usr/bin/bash # default: # ldap_id_mapping = True @@ -17,6 +19,7 @@ ad_gpo_access_control = disabled ad_gpo_ignore_unreadable = True ad_maximum_machine_account_password_age = 0 ignore_group_members = True +krb5_renew_interval = 1h {% if localhome is defined and localhome %} override_homedir = /home/%u {% endif %} diff --git a/roles/lmn_tmpfixes/tasks/main.yml b/roles/lmn_tmpfixes/tasks/main.yml index 8e90138..69cb6f7 100644 --- a/roles/lmn_tmpfixes/tasks/main.yml +++ b/roles/lmn_tmpfixes/tasks/main.yml @@ -8,3 +8,11 @@ - bookworm.yml - cleanup.yml when: ansible_distribution_release == "bookworm" + +- name: Set chromium gl-flags fixing AMD graphic issues + ansible.builtin.copy: + dest: /etc/chromium.d/fvs + content: | + export CHROMIUM_FLAGS="$CHROMIUM_FLAGS --use-gl=desktop" + when: ansible_board_vendor == "LENOVO" and + (ansible_board_name == "312D" or ansible_board_name == "312A") diff --git a/roles/lmn_vm/files/lmn-vm b/roles/lmn_vm/files/lmn-vm index 7d4011e..006b84c 100644 --- a/roles/lmn_vm/files/lmn-vm +++ b/roles/lmn_vm/files/lmn-vm @@ -3,6 +3,11 @@ %role-student ALL=(lmnsynci) NOPASSWD: /usr/local/bin/vm-sync %examusers ALL=(lmnsynci) NOPASSWD: /usr/local/bin/vm-sync +# vm-delete: Delete VM-Images +%role-teacher ALL=(lmnsynci) NOPASSWD: /usr/local/bin/vm-delete +%role-student ALL=(lmnsynci) NOPASSWD: /usr/local/bin/vm-delete +%examusers ALL=(lmnsynci) NOPASSWD: /usr/local/bin/vm-delete + # vm-aria2: Start/Stop aria2 as systemd-service for VM-Images lmnsynci ALL=(root) NOPASSWD: /usr/local/bin/vm-aria2 diff --git a/roles/lmn_vm/files/vm-delete b/roles/lmn_vm/files/vm-delete new file mode 100755 index 0000000..84a8aba --- /dev/null +++ b/roles/lmn_vm/files/vm-delete @@ -0,0 +1,45 @@ +#!/bin/bash + +set -eu + +directory="/lmn/vm" + +if [ ! -d "$directory" ]; then + echo "No VM directory found." + exit 1 +fi + +qcow2_files=("$directory"/*.qcow2) + +if [ "${#qcow2_files[@]}" -eq 0 ]; then + echo "Keine QCOW2-Dateien gefunden." + exit 0 +fi + +echo "Gefundene QCOW2-Dateien:" +echo "-------------------------------------------------------------" +printf "%-50s %10s\n" "Datei" "Größe (MB)" +echo "-------------------------------------------------------------" + +for file in "${qcow2_files[@]}"; do + size=$(du -m "$file" | cut -f1) # Größe in MB + printf "%-50s %10d\n" "$file" "$size" +done + +echo "-------------------------------------------------------------" + +for file in "${qcow2_files[@]}"; do + read -rp "Möchtest du die Datei $file löschen? (j/n) " confirmation + if [[ "$confirmation" == "j" || "$confirmation" == "J" ]]; then + link_count=$(stat -c %h "$file") + rm "$file" + echo "$file wurde gelöscht." + if [ "$link_count" -gt 1 ]; then + echo "Achtung: $file hat noch $((link_count - 1)) weitere Hardlinks." + echo "Diese liegen evtl. unter:" + echo "- /var/tmp/${UID}/vm/ (temporäre VMs, werden automatisch beim Neustart gelöscht)" + echo "- /var/vm/${UID}/ (persistente VMs)" + fi + echo + fi +done diff --git a/roles/lmn_vm/files/vm-link-images b/roles/lmn_vm/files/vm-link-images index e4c8618..0eccd04 100755 --- a/roles/lmn_vm/files/vm-link-images +++ b/roles/lmn_vm/files/vm-link-images @@ -19,8 +19,9 @@ done shift "$((OPTIND -1))" # link system-VM-Images to User VM Directory -for i in *.qcow2; do - [[ -f "${VM_DIR}/${i}" ]] || ln "${i}" "${VM_DIR}/${i}" +for filename in "$@"; do + filename="$(basename ${filename})" + [[ -f "${VM_DIR}/${filename}" ]] || ln "${filename}" "${VM_DIR}/${filename}" done # allow lmnsynci to remove old vm images diff --git a/roles/lmn_vm/files/vm-netboot b/roles/lmn_vm/files/vm-netboot index c21024f..92ca621 100755 --- a/roles/lmn_vm/files/vm-netboot +++ b/roles/lmn_vm/files/vm-netboot @@ -7,10 +7,10 @@ set -eu ## Imporant for all virsh libvirt calls: export XDG_CONFIG_HOME="/var/tmp/vm/${UID}" -menu=(standard "CLI Standard Debian GNU/Linux NFS" - standard-ram "CLI Standard Debian GNU/Linux RAM" - kde-desktop "KDE Plasma Desktop Debian GNU/Linux NFS" - gnome-desktop "Gnome Desktop Debian GNU/Linux NFS") +menu=(standard-edu "CLI Standard Debian GNU/Linux NFS" + standard-edu-ram "CLI Standard Debian GNU/Linux RAM" + kde-edu "KDE Plasma Desktop Debian GNU/Linux NFS" + gnome-edu "Gnome Desktop Debian GNU/Linux NFS") img=$(dialog --clear --backtitle "Virtual Machine Chooser" \ --title "Choose the Virtual Machine to Start" \ --menu "Start VM:" 12 70 6 "${menu[@]}" 2>&1 >/dev/tty) @@ -22,6 +22,8 @@ mac="$(ip link | grep -A1 -m1 "macvtap-" | \ sed -nE "s%\s+link/ether ([[:xdigit:]:]{17}) .+%\1%p")" tapdev="$(ip link | grep -A1 -m1 "macvtap-" | sed -nE "s%^[1-9]:\s(\S+)@.*%\1%p")" +livebox=$(host livebox | sed -E "s/.+ ([0-9.]+)$/\1/") + if [[ $# -eq 0 ]] ; then mem=$(sed -En "s/^MemAvailable:\s+([0-9]+)\s+kB/\1/p" /proc/meminfo) cpu=$(sed -En "0,/^cpu cores/s/^cpu cores\s+:\s+([0-9]+)/\1/p" /proc/cpuinfo) @@ -31,8 +33,8 @@ else arg=("$@") fi -kernel="http://livebox/d-i/n-live/${img%-ram}/live/vmlinuz" -initrd="http://livebox/d-i/n-live/${img%-ram}/live/initrd.img" +kernel="http://${livebox}/d-i/n-live/${img%-ram}/live/vmlinuz" +initrd="http://${livebox}/d-i/n-live/${img%-ram}/live/initrd.img" kargs=(boot=live components splash locales=de_DE.UTF-8 keyboard-layouts=de swap=true live-config.timezone=Europe/Berlin) @@ -42,10 +44,10 @@ case "$img" in kargs+=(console=ttyS0) ;;& *-ram) - kargs+=("fetch=http://10.190.1.2/d-i/n-live/${img%-ram}/live/filesystem.squashfs") + kargs+=("root=live:nfs4:${livebox}:/images/${img%-ram}/live/filesystem.squashfs rd.live.ram=1") ;; *) - kargs+=(netboot=nfs "nfsroot=10.190.1.2:/srv/nfs/debian-live/${img%-ram}") + kargs+=("root=live:nfs4:${livebox}:/images/${img%-ram}/live/filesystem.squashfs") ;; esac diff --git a/roles/lmn_vm/files/vm-run b/roles/lmn_vm/files/vm-run index a957a49..af0bd67 100755 --- a/roles/lmn_vm/files/vm-run +++ b/roles/lmn_vm/files/vm-run @@ -90,17 +90,21 @@ create_clone() { local VM_NAME="$1" if ! [[ -f "${VM_SYSDIR}/${VM_NAME}.qcow2" || -f "${VM_DIR}/${VM_NAME}.qcow2" ]]; then - echo "qcow2 File does not exists." >&2 - exit 1 + echo "qcow2 File does not exists." >&2 + exit 1 fi # Create User-VM-Dir and link system VM-Images [[ -d "${VM_DIR}" ]] || mkdir -p "${VM_DIR}" - if [[ "${PERSISTENT}" -eq 1 ]]; then - sudo /usr/local/bin/vm-link-images -p - else - sudo /usr/local/bin/vm-link-images - fi + IMAGE="${VM_NAME}.qcow2" + while [[ -n ${IMAGE} ]]; do + if [[ "${PERSISTENT}" -eq 1 ]]; then + sudo /usr/local/bin/vm-link-images -p "${IMAGE}" + else + sudo /usr/local/bin/vm-link-images "${IMAGE}" + fi + IMAGE="$(qemu-img info -U "${VM_DIR}/${IMAGE}" | grep "^backing file:" | cut -d ' ' -f 3)" + done # Create backing file cd "${VM_DIR}" @@ -130,18 +134,30 @@ create_printerlist() { } create_mountlist() { - if id | grep -q teachers; then - NETHOME=/srv/samba/schools/default-school/teachers/$USER - else - NETHOME=(/srv/samba/schools/default-school/students/*/"$USER") - fi - NETHOME="${NETHOME#/srv/samba/schools}" - cat << EOF > "/lmn/media/${USER}/.mounts.csv" + NETHOMEPART="${NETHOME#/srv/samba/schools}" + cat << EOF > "${VMINFO_DIR}/.mounts.csv" Drive;Remotepath -H;\\\\10.190.1.1${NETHOME//\//\\} -T;\\\\10.190.1.1\default-school\share +H;\\\\server.pn.steinbeis.schule${NETHOMEPART//\//\\} +T;\\\\server.pn.steinbeis.schule\\default-school\\share EOF - echo "${USER}" > "/lmn/media/${USER}/.user" + echo "${USER}" > "/${VMINFO_DIR}/.user" +} + +start_virtiofs_service() { + local target_name=$1 + local shared_dir=$2 + local drive_letter=$3 + local socket="/run/user/${UID}/virtiofs-${VM_NAME}-${target_name,,}.sock" + + systemd-run --user /usr/local/bin/virtiofsd --uid-map=":${GUEST_UID}:${UID}:1:" --gid-map=":${GUEST_GID}:$(id -g):1:" \ + --socket-path "${socket}" --shared-dir "${shared_dir}" --syslog + + if [[ $? -ne 0 ]]; then + echo "Error starting virtiofsd for ${target_name}." >&2 + return 1 + fi + + LIBVIRTOPTS="${LIBVIRTOPTS} --filesystem driver.type=virtiofs,accessmode=passthrough,target.dir=${target_name},xpath1.set=./source/@socket=${socket}" } start_virtiofsd() { @@ -151,9 +167,17 @@ start_virtiofsd() { [[ "$GUEST_GID" == 0 ]] && GUEST_GID=1010 fi # END temporary fix - socket="/run/user/$(id -u $USER)/virtiofs-${VM_NAME}.sock" - systemd-run --user /usr/local/bin/virtiofsd --uid-map=:${GUEST_UID}:${UID}:1: --gid-map=:${GUEST_GID}:$(id -g):1: \ - --socket-path "$socket" --shared-dir "/lmn/media/${USER}" --syslog + + # start_virtiofs_service "VM-Data" "/lmn/media/${USER}" "Y" + # start_virtiofs_service "default-school" "/srv/samba/schools/default-school" "Y" + + # Home@PC / VM-Data + # if the environment variable VMLEGACY is set, /lmn/media/USER is forced + if [[ "${HOME}" != "${NETHOME}" && ! -v VMLEGACY ]]; then + start_virtiofs_service "Home_Linux" "${HOME}" "Y" + else + start_virtiofs_service "VM-Data" "/lmn/media/${USER}" "Y" + fi } ask_really_persistent() { @@ -216,7 +240,7 @@ while true; do shift ;; -o | --options ) - LIBVIRTOPTS=$2 + LIBVIRTOPTS="${LIBVIRTOPTS} $2" shift 2 ;; --no-viewer ) @@ -267,6 +291,7 @@ while true; do type="ethernet,mac=${mac},target.dev=${interface},xpath1.set=./target/@managed=no,model.type=virtio" LIBVIRTOPTS="${LIBVIRTOPTS} --network type=$type" done + LIBVIRTOPTS="${LIBVIRTOPTS} --check mac_in_use=off" shift ;; --os ) @@ -315,18 +340,38 @@ if ! virsh --connect="${QEMU}" list | grep "${VM_NAME}-clone"; then check_images fi if [[ "${NEWCLONE}" = 1 ]] || [[ ! -f "${VM_DIR}/${VM_NAME}-clone.qcow2" ]]; then - create_clone "${VM_NAME}" + create_clone "${VM_NAME}" fi # delete the old vm virsh --connect=qemu:///session undefine --nvram "${VM_NAME}-clone" || echo "${VM_NAME}-clone did not exist" #trap exit_script SIGHUP SIGINT SIGTERM + for dir in teachers examusers staff parents; do + if [[ -d "/srv/samba/schools/default-school/${dir}/${USER}" ]]; then + NETHOME="/srv/samba/schools/default-school/${dir}/${USER}" + break + fi + done + if [[ -z "${NETHOME+x}" ]]; then + NETHOME=(/srv/samba/schools/default-school/students/*/"$USER") + fi + + if [[ "${HOME}" != "${NETHOME}" ]]; then + VMINFO_DIR="${HOME}" + else + VMINFO_DIR="/lmn/media/${USER}" + fi create_printerlist create_mountlist # start virtiofsd-service [[ "${QEMU}" = 'qemu:///session' ]] && start_virtiofsd + # Create VMInfo Json file + #( umask 027; ./vm-create-vminfo > "${VMINFO_DIR}/.vminfo.json" ) + # Start vminfo.timer + systemctl --user restart vminfo.timer + uuid=$(openssl rand -hex 16) uuid="${uuid:0:8}-${uuid:8:4}-${uuid:12:4}-${uuid:16:4}-${uuid:20:12}" @@ -348,7 +393,6 @@ if ! virsh --connect="${QEMU}" list | grep "${VM_NAME}-clone"; then --memorybacking source.type=memfd,access.mode=shared \ --disk "${VM_DIR}/${VM_NAME}-clone.qcow2",driver.discard=unmap,target.bus=scsi,cache=writeback \ --network=bridge=virbr0,model.type=virtio \ - --filesystem driver.type=virtiofs,accessmode=passthrough,target.dir=virtiofs,xpath1.set=./source/@socket="/run/user/${UID}/virtiofs-${VM_NAME}.sock" \ --controller type=scsi,model=virtio-scsi \ --check path_in_use=off \ --connect="${QEMU}" \ diff --git a/roles/lmn_vm/files/vm-vminfo b/roles/lmn_vm/files/vm-vminfo new file mode 100755 index 0000000..559d47f --- /dev/null +++ b/roles/lmn_vm/files/vm-vminfo @@ -0,0 +1,117 @@ +#!/usr/bin/python3 + +import argparse +import struct +import subprocess +import json +import sys + +from os import environ,path +from impacket.krb5.ccache import CCache +from base64 import b64encode + +home = "" +nethome = "" +vminfo = {} + +def get_printers(): + printers = [] + try: + result = subprocess.run(['lpstat', '-v'], capture_output=True, text=True, check=True) + for line in result.stdout.splitlines(): + # Extrahiere den Druckernamen + printer_name = line.split()[2].rstrip(':') + ipp_url = f"ipp://192.168.122.1/printers/{printer_name}" + printer = { 'Name': printer_name, 'IppURL': ipp_url } + printers.append(printer) + return printers + except subprocess.CalledProcessError as e: + sys.stderr.write(f"Fehler beim Abrufen der Drucker: {e}") + return [] + +def get_groups(username): + try: + result = subprocess.run(['id', '-Gnz', username], capture_output=True, text=True, check=True) + groups = result.stdout.strip().split('\0') + return groups + except subprocess.CalledProcessError as e: + sys.stderr.write(f"Fehler beim Abrufen der Gruppen: {e}") + return [] + +def get_krb5 (): + krb5 = {} + ccachefilename = environ.get('KRB5CCNAME').replace('FILE:', '') + if ccachefilename: + try: + ccache = CCache.loadFile(ccachefilename) + cred = ccache.toKRBCRED() + cred_enc = b64encode(cred) + krb5['cred'] = cred_enc.decode('utf-8') + krb5['starttime'] = ccache.credentials[0]['time']['starttime'] + krb5['endtime'] = ccache.credentials[0]['time']['endtime'] + krb5['renew_till'] = ccache.credentials[0]['time']['renew_till'] + except: + sys.stderr.write("Fehler beim Ticket laden") + return krb5 + +def get_mounts(): + mounts = [] + mounts.append({ 'Drive': 'H', 'RemotePath': '\\\\server.pn.steinbeis.schule' + nethome.replace('/srv/samba/schools','').replace('/','\\'), 'Name': 'Home_Server' }) + mounts.append({ 'Drive': 'T', 'RemotePath': '\\\\server.pn.steinbeis.schule\default-school\share', 'Name': 'Tausch' }) + return mounts + +def get_user_folders(): + HOME="H:" + if environ.get('HOME') != nethome: + HOME="Y:" + folders = [] + folders.append( {'Name': 'Personal', 'Path': f"{HOME}\Dokumente"} ) + folders.append( {'Name': 'My Pictures', 'Path': f"{HOME}\Bilder"} ) + folders.append( {'Name': 'My Music', 'Path': f"{HOME}\Musik"} ) + folders.append( {'Name': 'My Video', 'Path': f"{HOME}\Videos"} ) + return folders + +def get_quickaccess(): + quickaccess = [] + quickaccess.append( 'H:\\transfer' ) + return quickaccess + +def parse_args(): + parser = argparse.ArgumentParser() + #parser.add_argument('input_file', help="File in kirbi (KRB-CRED) or ccache format") + #parser.add_argument('output_file', help="Output file") + return parser.parse_args() + + +def main(): + global home, nethome + + args = parse_args() + + home = environ.get('HOME') + + vminfo['User'] = environ.get('USER') + vminfo['Groups'] = get_groups(environ.get('USER')) + + for dir in ['teachers','examusers','staff','parents']: + potential_path = f"/srv/samba/schools/default-school/{dir}/{vminfo['User']}" + if path.isdir(potential_path): + nethome = potential_path + break + if not nethome: + result = subprocess.run(['find', '/srv/samba/schools/default-school/students/', '-name', vminfo['User'], '-maxdepth', '2', '-type', 'd'], capture_output=True, text=True, check=False) + nethome = result.stdout.splitlines()[0] + + vminfo['Printers'] = get_printers() + vminfo['krb5'] = get_krb5() + vminfo['Mounts'] = get_mounts() + vminfo['UserShellFolders'] = get_user_folders() + vminfo['QuickAccess'] = get_quickaccess() + + vminfo_json = json.dumps(vminfo, ensure_ascii=False, indent=4) + print(vminfo_json) + +if __name__ == '__main__': + main() + + diff --git a/roles/lmn_vm/tasks/main.yml b/roles/lmn_vm/tasks/main.yml index a39325a..0dc1fa1 100644 --- a/roles/lmn_vm/tasks/main.yml +++ b/roles/lmn_vm/tasks/main.yml @@ -19,6 +19,7 @@ - libvirt-daemon-system - virt-manager - dialog # for vm-netboot menu + - python3-impacket # - name: allow all users to use VMs # lineinfile: @@ -142,6 +143,7 @@ group: root mode: '0755' loop: + - vm-delete - vm-create - vm-rebase - vm-run @@ -149,6 +151,7 @@ - vm-sync - vm-link-images - vm-virtiofsd + - vm-vminfo - virtiofsd - vm-aria2 - uploadseed @@ -236,3 +239,26 @@ src: vm-netboot dest: /usr/local/bin/ mode: '0755' + +- name: Provide vminfo service + ansible.builtin.copy: + content: | + [Unit] + Description=Create .vminfo.json for VMs + [Service] + Type=simple + ExecStart=/usr/bin/bash -c 'umask 027; /usr/local/bin/vm-vminfo > "{% if localhome %}/home{% else %}/lmn/media{% endif %}/${USER}/.vminfo.json"' + dest: /etc/systemd/user/vminfo.service + mode: '0644' + +- name: Provide vminfo timer + ansible.builtin.copy: + content: | + [Unit] + Description=Timer for vm-info + [Timer] + OnActiveSec=0s + OnUnitActiveSec=1h + Persistent=true + dest: /etc/systemd/user/vminfo.timer + mode: '0644' diff --git a/roles/lmn_vpn/files/10-lmn-mount.sh b/roles/lmn_vpn/files/10-lmn-mount.sh index 6f42725..b19724c 100755 --- a/roles/lmn_vpn/files/10-lmn-mount.sh +++ b/roles/lmn_vpn/files/10-lmn-mount.sh @@ -13,19 +13,24 @@ if [[ "$CONNECTION_ID" = "VPN-Schule" ]]; then # Exit if server is already mounted findmnt /srv/samba/schools/default-school > /dev/null && exit 0 - if ! klist -s -c "${KRB5CCNAME}"; then - #echo "try to renew KRB5-Ticket" >&2 - #sudo -u "${USERNAME}" kinit -R -c "${KRB5CCNAME}" - echo "KRB5-Ticket is expired. Sleep 3 seconds and hope it will be renewed after." >&2 - sleep 3 - fi + counter=1 + while ! klist -s -c "${KRB5CCNAME}"; do + (( counter > 30 )) && exit 0 + echo "KRB5-Ticket is expired. Sleep 1 seconds and hope it will be renewed after." >&2 + # if (( counter == 10 )); then + # echo "try to renew KRB5-Ticket" >&2 + # sudo -u "${USERNAME}" kinit -R -c "${KRB5CCNAME}" + # fi + sleep 1 + ((counter++)) + done echo "prepare mountpoints" >&2 umask 0002 mkdir -p /srv/samba/schools/default-school chmod 777 /srv/samba/schools/default-school mkdir -p "/lmn/media/${USERNAME}/share" - + mount -t cifs //server/default-school/ /srv/samba/schools/default-school \ -o "sec=krb5i,cruid=${USERID},user=${USERNAME},uid=${USERID},gid=${GROUPID},file_mode=0700,dir_mode=0700,mfsymlinks,nobrl,actimeo=600,cache=loose,echo_interval=10" echo "after mount" >&2