From a94671b747ef8d30deb26dabd3258d117a8debed Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Fri, 25 Oct 2024 10:03:21 +0500 Subject: [PATCH] Migrate maddy to postgresql --- mail.yml | 1 + roles/mail/meta/argument_specs.yml | 10 + roles/mail/tasks/main.yml | 1 + roles/mail/templates/maddy.conf.j2 | 8 +- roles/mail/vars/main.yml | 1 - vaulted_vars.yml | 388 +++++++++++++++-------------- 6 files changed, 211 insertions(+), 198 deletions(-) create mode 100644 roles/mail/meta/argument_specs.yml delete mode 100644 roles/mail/vars/main.yml diff --git a/mail.yml b/mail.yml index b8ef645..b556e90 100644 --- a/mail.yml +++ b/mail.yml @@ -3,3 +3,4 @@ roles: - role: mail users: "{{ mail_users }}" + postgresql_url: postgres://maddy:{{ postgresql_users.maddy }}@postgresql:5432/maddy?sslmode=disable diff --git a/roles/mail/meta/argument_specs.yml b/roles/mail/meta/argument_specs.yml new file mode 100644 index 0000000..714ba95 --- /dev/null +++ b/roles/mail/meta/argument_specs.yml @@ -0,0 +1,10 @@ +--- +argument_specs: + main: + options: + postgresql_url: + type: str + required: true + users: + type: dict + default: {} diff --git a/roles/mail/tasks/main.yml b/roles/mail/tasks/main.yml index 9906cc7..89ef4e6 100644 --- a/roles/mail/tasks/main.yml +++ b/roles/mail/tasks/main.yml @@ -20,6 +20,7 @@ image: foxcpp/maddy:0.7.1 networks: - name: mail + - name: postgresql env: MADDY_HOSTNAME: mail.comfycamp.space MADDY_DOMAIN: comfycamp.space diff --git a/roles/mail/templates/maddy.conf.j2 b/roles/mail/templates/maddy.conf.j2 index ebfecae..8343bde 100644 --- a/roles/mail/templates/maddy.conf.j2 +++ b/roles/mail/templates/maddy.conf.j2 @@ -23,8 +23,8 @@ tls file /etc/tls/fullchain.pem /etc/tls/privkey.pem auth.pass_table local_authdb { table sql_table { - driver sqlite3 - dsn credentials.db + driver postgres + dsn {{ postgresql_url }} table_name passwords } } @@ -37,8 +37,8 @@ auth.pass_table local_authdb { # imap-* subcommands of maddy. storage.imapsql local_mailboxes { - driver sqlite3 - dsn imapsql.db + driver postgres + dsn {{ postgresql_url }} } # ---------------------------------------------------------------------------- diff --git a/roles/mail/vars/main.yml b/roles/mail/vars/main.yml deleted file mode 100644 index bf82e98..0000000 --- a/roles/mail/vars/main.yml +++ /dev/null @@ -1 +0,0 @@ -users: {} diff --git a/vaulted_vars.yml b/vaulted_vars.yml index 7f9c772..fc2916e 100644 --- a/vaulted_vars.yml +++ b/vaulted_vars.yml @@ -1,194 +1,196 @@ $ANSIBLE_VAULT;1.1;AES256 -35643261326366646231323831356465646461633330613761343534356630386361653161326166 -6162623665363762346265333931656339373965633266660a653562626636636531383666343861 -31373434393266363435613031633832663739353630663063326436346335356334623765343036 -6138343365306361300a353830613939323462303466303064616233313062383865313031336466 -34343366633664626164666266643864313566663139396166656166326439303964633764366562 -65333835636638366237386365353532343364343439613533626464316134353038383564306438 -62643265653863373538386430653539316530656638636639373163356331363662613661353061 -61373833306561616231656537353633313330623261653130633765653238333162356463386136 -65623930396136363035616530323161366564393836623665666638313230646137386264356238 -38303732333337386464656132393839376164666162383032306135363364656661656566353264 -61323633636432393636346464666661396139303939313835346335626337383966356235643433 -64356437393266356161346164313630656665323765396336666636653735396561306335356262 -63366366396362336334666539656663663166363263346666643962386435313237616666333065 -36313933333130363433363162376536643733313833326639383832643130333639376562643130 -64336363356437306239626130313035326630356633353964313339356238663664643631666436 -39633761663461343233383465366131303264386538653439663161343830356136303365366564 -37623231356538386439653935623662663038343865333130663063636435336234623366393231 -39646130373365636438663737323633396239643764646339383837643864306230663738613032 -64383032623236646133333437633934386266653233396631333734343132646465626563623138 -30643466336333366337626231626166666633636137376136333834373739393636663031313465 -35376137336438623765313666656332393836653761626632363632383862663435393937373935 -66336332313431373066666439623264343061623238666465356537353565373831366363313463 -66653439623866386636363531626636316435393061636463363339383262633066333731343039 -39306663616339383035373539656630666634393733383839383539313964346164633639386661 -61336662346461633831663062356236663365346238303963656636633438396562643430623265 -34313964613137666263336565336366386362383663353264643039336533666533343831326631 -34306164633332663035343464633732373662333338373561343463616263626463666465613263 -61346432663832653063663361346234363762323334353638313066633537626462356631393631 -30366637336161393838666666366235646134346331663164383931303063623438363235343738 -32366563666465346536643363393862633061373363653834313534623438353335303930353834 -31663038303834393866623332666366316163393534323862633036626562653061366661623566 -39346336373838636466626138316165336131633765653035656430653034386433376463376339 -30656563653364666264343339633830663466353666323635343635383464643033313735383461 -66643035383530623162396632633361623565363662393532623035333162386534653335356132 -64356138393130616131393530303831306661666138386461386165393237376165346339323436 -33313963383833373333303638313536393131313734363239656466643661303439336535376337 -36613630306564633831623139633935663531396137633461383066663539633263373235616231 -37656231343264313937373561666563656530613232336663313030643765393330633162393438 -63623838626433333939663339356463393762323764333038316161356437663566633831663065 -30336336366439356133353035633433663962636365663236663739623834643962393834613765 -32326662306239613766303032636563313737333034323665646534373535326466326263386135 -61613363653630396266613331336262643034373135653033346365616666343432343730313562 -64383963333735366233336638666632383835363236633330386136313663316362353535616339 -62613730306662663832613564306435333633323262363461626130663463343765333866383238 -33636663356566613230316465313761346536383935653935393134306334626330643930353333 -63643762303531313131343834376665306363396137333062336431306238616463386135313734 -35303934343361613930376664653065353965616266343337656161386362656564656562613535 -63393835346330653362363864373331353335613934366435346161303566616139386665633539 -38373730303738626163313539656339663938633432343464653833653161613163336236303338 -35353632396662376530633461646464363062303932393961323238386265623735356535613831 -39383637363330333337313864623832643534633130373866613562643631646464356339313237 -64613466343966336361336337383766303736653530356636363736326637396266316531633131 -66333162623537343536643263633430633634326437376662633136613464373135626139633439 -61373064623235326661333466613961336637626433393539656531633763393065623232396161 -64623132623061663139626435643434333437373166366230376361333030613337636133356338 -38643739356162376638363230386438336334363732393365333465393039346531313136393465 -37303935386266383564666237383738336362653539303866633761316231643033393733623834 -30333564633961613137393664353061653363393531383161373637646530393138366361313965 -34666637613462376665353839313230396435373334336231396538393939663933396130643632 -39653930346530646335656461393334656461336231383433313764666161376664313339373533 -64316564366434376533666661356636623161363365323535653366333135333634666536376631 -37393362633665663433303333663936393836336664323939393235363563623761613761666532 -33393331656433323431636339393831396133363665393464393238646433636637323131303465 -30663734663932623832356565626166626137383633316163323030386438313265353230626631 -38356438656665373535393531333035646464386463396434623238643837366437343865393132 -61306536623666326164323665363064663963376566323634643832653238616137366161356463 -62643863343436343537303565316165353235663564643231316564646132653566316339346438 -30303263633330656330643739383539376638383835313864306639613363383862616139386663 -39343039333261656663396139656431366630656134613665623335666563343130653739613132 -37376238623262663230333239323338643561653538353265623536306366356665636237633531 -61303761623832373136326334646462633063613733666463636136393962643961356634623263 -64366434333136656331663731356435313834326666643137623366343632313839373739373233 -66363831623964656338333235363935656439316262663762306131306166333233613164343838 -61396233386630343236656334316534363631303337616635336434373431383461643837376332 -39336461353764343539303034666231303336333132636637356637393938303364623030373130 -35363433613965636135376365306565306431666333363961663639313862396363336535663738 -36383464613536633333626365626161663633303661653034613664363861366133636663643064 -37663936376532356330646266656638653135373665653733636534643737633765336132613035 -36623737313366393133366566373732636535396230656436613035626232666162613233613066 -65333539613965623932633431653633396537643932343762623564363737623432613335373935 -36643638303533663836663533626263353537343132393135353066666538323137386266613038 -63623831623839646133623566303537326566393464323635666435326338643937393161613439 -61653766643064623832313437633566626132623339643832666435353761616562333831386638 -35326631343165313432353536386434643138666638336235313365303966333237343636303961 -34373935383135353434353333643837636437646539306135376538386562323235353130626433 -39306664656631356334353936333765393839623866646361613537323163343232346133626562 -39633230383965393130396637363039393431306537396436366530386338666632396536383263 -39323865613564643139666461313631303564353736323534383533383136633138313662656234 -34363364356638363331343066323564333863316665353039663631636564336535376333666534 -66633766353062626330626561373038333165376162336539343536623330646461633565363732 -33633839633635623965303734666632303231363530363339323232656537373837383939356162 -66626164666234623236646633623436393166313032363339343764333630383264333463653661 -34393635383832613131383366323734373361373866383131633465663034353032363932356531 -38343030646531663835313166346161363639613061316439613639306161343837626534373164 -31363065633832646439666436373862653431363131643934396638303238356563623233663733 -35656638376265316430616266343537616232353331333461646363373062303238303736356266 -66393862343466323534613464386435333435343664373738366465343637333335646564393661 -32383461343263323837356132383933373861656233623765353536336230366639366262353639 -62353430376336333663316365323961326637306363323037623764613661313963366139663930 -39343438376361663930316664653835336130643165623530333862363364623137663461383734 -32353531643036626138313661653332356536303638306165626331616632376662383333343963 -65633964666562383235376231373231663534656265326531396339336234386431356266636538 -37613361663131306163383264643938326139316164303334383237383436633135643162373732 -37386434383061393039376435393761386139623235643333363166333966396233616435343932 -32623730326633303565303537376639336430663363306661353539616661323963643534353434 -37323365613761343434333134306633396264333535643566343061366633393764663164646236 -39393264366266383031663831363662663765643134636532363335623830393732656464653332 -36663038313239366465633336663462356361663032653537393333316261633933666163363165 -39323736666633366265643733366532643561353433363162643563396135353437333361346639 -64353539666536363761323661653762613039333035663336656661356132623136613233323862 -33323065613434336333623865636162666166626435383863373765326631666536646466346333 -64326434336633316334363330626130363836316164313334396631386535363466373632346332 -31626432363663663461653335333038313633633463356332306436373731646336356162303363 -33663762336632373664343364326331633433363530356461353766663265333265393464303463 -62383232336264303439323437306234656136646535616335653233306663303638306132623437 -39386439653065643637663465376464343061653032643530643031313131653866396539313032 -62663639623337633662623836346564366465306337663166313935313736636234666361623939 -63363364643235653163383831356333623935356139613838363232363939346133316433623361 -64643830306363393938326366326637386538326330663433643266376163376565613936323238 -36336264633866663061333037616137393663386166656230623331363436383035303363663636 -61363030313064636562373238386363643130623764333930333062663064376264343165313233 -64666631613965366334646232386339386439643666366633326230366466376335313461666262 -35343463366663393364313765666135636366336163313762623763306563616438303766383662 -66613138613962316430643839333762363235656633363131633331643330393433666130326335 -64373530323263306539306137343238303739383731353937346163333066386663333734623563 -33623365366366326464633730613033343262393633353064323036313630383737613739343437 -65313964343063653365303763613336656536373063666334393530393166393964656134613964 -65343430663735643565306335393963613539666364363462383362663837303030346262666136 -62313861336565393638646463656163613038373039356437646435343765666464373263353238 -39323930613331633261323664353762303736653738306635643565656636303636373031363265 -31343564313566633933343635313163626562386437313434316665346361623836323731666634 -65623933313133316639616165613066343939346631363735383562656263643564613739353366 -62616661326263386165626639376232633061646635396363336135366435383330653936316239 -36366666303531636238613766633930333864616432356637633037323738346531366638613436 -66313964363065633362363462343338363031343730376439316334303339383230366531363432 -63383030616130363830633132363633653232343561323739646366636265386131303636346461 -62343963656533353238653561633539663038393435333539636666363836653833656465316566 -33643364323164313330626136343063613830636234323764336436643839396635303466366537 -35643761336633653031353332613261306136343139643334323739646337656364326265383331 -30393538306632633862666431306133346637366537376439633538653332613064353830323262 -64623335393161363861363132346236636534643763333164333766363839623931343637313733 -36316166366430396232613736353764666231313135313836386337306530343035366635666437 -31343331323637663761626330663964353234613030333333383463663862376538623962313864 -62633361303039303836303630356232636530333731316362316564396363313834333534623363 -35393161326230373635373465643562653663626637336230343330623536313565333466663732 -30343830393965613662663464353035336565306466333165626166346164636331363538623137 -66333230663530633364373138353830326135633935316136353465653661366637333565373137 -36626433333061656236363439306239393137363466386438636238363064313436636530373031 -32663135623266353537626338643835613062383762333832363364663664386133633463613765 -39656232366463653163643432623365333339666161353130653666623036623636666466663432 -38393937303561396530306432626239316464313536316165643965393866626162623331393232 -32396164373331323733626563376164383162343865386432393732343836386435333835336638 -36393933383762643635373333616663643734623032633861306336336434663731646634336364 -64323936383962663965613565353831386666316430613933623664653035303332306433626533 -38646638366461613664646335633339663939366133323337323765653731613763656364383666 -30373561643935613265343431623732393933613133386362623431653938326164363335393365 -31333364316431363036653834393236663964306438376234383435623864333730643838386338 -65333837353134383233343165653165643733623364633536363563363463303831643738363461 -62383738366437646665633036663564326337356435313661396565343639343336633230333662 -36613363396465353931336436303931333431383233613335306134383534313936613039396335 -33323436653930316432366233383439336234653437666564643864663765383732383038663532 -34616566636632626330643930303130636435643730386433663264383931663061393165616539 -38383234636332613130323635353766306534363633613331396431613739376433626237343934 -33383962643938636135626665633965663736653661306264623762646564383735373861376538 -31393236643261636464393831613231616136306633653732323262653736643333393433366638 -39303537313433656632346162366134393464663530333436386534343466393239613038316437 -36643133633966613433386235333932653662386266643032366665356335613065393234323861 -61303731373363643138333136366366666231383565376262316137313966376361666563333664 -65653833353235356431616261326235393339353161303731643864313031366664306131356463 -33653261643232373565626537616635343163343632343138303138636330336232303531663637 -66643532373261343137393861383235623465643662326336663731356563346166333239343039 -30363462306562646335306535633938643730323238313038313939396637616230663866306134 -64613839383137343337653638316532613439393465666466633066323834343737363537653263 -36656135646532623666396430656539663530383034363563363535663537646535353264333161 -38613861356234316563373335346161323162623465376530383661613131333635373736333136 -34623130376166393362353033663266383761393664316463646533656634356234353931323963 -31373366666531316361303233383631383431373431303336363034633231383564373265623364 -35326231363165633639643366326134626332616163666134376666643830636638623139626338 -63656532356661663138633333623231373230663233363264363462623831666331633731396161 -66383035613061383161643735656332633136323333653537356237666563613662303964616166 -31323866353538323737346166396136343436323861636263653661313266386630633563336131 -34393134303964333065643766306533396161333138633463376539656262666462313438666633 -30623138363562343637616433656535633436616664346562343962663065386566333834353938 -62323531663062376633396466613063346431643431353038376665303061313436623832393632 -33653939663961656162323934356233353332316236333235366161333133666631376537316661 -37303536336132303535626133363864323635633330633632646438303639666363333835643464 -66386539663737666565303139643537316236306637346631386134353231356230353735323565 -30303639333634613530613965616263363662356438653333316462613863666130646361666533 -62323435616430356166336661666636306264306334633766663032306134396538376230613539 -33323334633932343965366464353362363432663438653062626463363139663961366134366135 -31326436316261383361633931376137373764336531633938613834396664316331323161333031 -63613534373630363561313965373065373833343033353335356634623961313336643537393061 -32333965396433343137363162316530626338616235376364656230633566383234 +31393432626564366537636630303233376637633566343064646666373635653833363364393635 +3436623765376337636331653731656334323838663636620a383837383263666434613165373464 +31666565343263366132356334323033623338663563326161373962653032336631666632313861 +3935396164666166330a333364323566653130363939626162616231383365613361366632313031 +61383535386463356665653231353661336462613361656666663161383363666236613963303330 +66623962396566626366386630633665326563643135633762373638346332363339353036323963 +34646330626539313066316464343161326632396530633639656433303435663230326238303033 +32666535353139646131653933313664333039663736386662623238366430303236613635323661 +39323934343931666661333662383262646231313461383762316536653133323464643331373133 +32666663656263613161376534663165383535613365373630656265653661333564663636313131 +31343661613237366131333339613530393438666230383031343537353934336532323036373130 +62363366633335326566303437303938373637653639333964666238336139623935613936666435 +65323435653365666135643737333666356236336533326262633437306364313763366562313830 +39663331323433356231326135343761626139653763336332636432386436636237336538303432 +66353139363839373539313331346130313237376131643139306633353132653635663266653838 +32363737306363323664656532613231396438373835333264366231366138626432653136626137 +61363935383330623636383732653530626233336234353731353964623834663166613135386234 +35303236633030306532373064666465373565663765613730636565633261663761383430303731 +65346336326237393362313637636439663763616566323830643834353330393864643137363766 +39666639623632663763353236386363616432616364383937633738613633663335613965303138 +32353232343839653362326636373836306465396432636364373139363831623763653763353837 +61363138653334626632373961343038646435373030613462636138363139333737623336313561 +62346437303361363366386233376561643736653436373566376532663265326431343566343432 +65363330326433376335373732346366633162623735306233376533613432363566343036333933 +61326232663261326132643030623033396364623530643561386565383836386335386666633937 +35383064373638306338393733613130323364616632383663376632323166616233326530636539 +38343065336639356464336239356334623132323135646438616636373162306462393563623737 +63633530623362306362613334613731313132643338326334646265303836393131343234323635 +35373261393363653364626136396131633832643866373936393636623734663536636132643733 +63363566366565343836343137666338343937373463356331663962336539356437393833333134 +37643535356632656636666536313139396665336234366239306436383731633731346564363934 +38313833663266356632336232396239646235626236356434353532366332663636633563343666 +37303231366362343933383464333133383064613930373833346138323866373266383432306561 +62653336623334353661326337326165303963313965646165663134633266373438376464313262 +39356432386132356234616534386366336461653030383965663666633137616330353030663938 +66363930636636636131376431333865656531653938653439313161633564626561643162643866 +66363034366564666535316335616635646336313866343162326435666537666435666165396463 +33363133616132626364373132643561363766663031393631363837343932393936623764363866 +64616636346234353865666164346364343764376333396632623663636632333931613036333634 +34363363663766626163396637353432666531396561356134376538363539313163633634396662 +33313361663139303766663531376338303665346136303864616535306533383639303662326261 +37383831386133616265363834613663396138613639393266313336376262383133336431663839 +63636234363837373261353737323665613733626233343634623734383265323932653963376262 +37353135303561313137623836633165616531633432613432623765333834626364643166373930 +36613261376237323339633166633965366466363431363163346436383136303437343262373333 +32373963643636336562333637653739376337363631333933623633343431323339366338353333 +38336333653166336636363536326431303264626362313132623039636262616262333138326561 +35383032383137656137373465343464663261633535383031353530353332633163636439336339 +34376332326261646664653535643763303031376662646330313039656362376238353536376335 +63323832366536623637356434353062353336656162303838356237653866653930613436343166 +65363630346436386137373362306630636236646235336130323262626465323666636338323535 +33653961366435316231613038366438393434366462383062646337346332346661636162313062 +36613761643862363838386236313930363431303163343036656638656538376638363835623837 +37363233363230646561623732346435316634343939636538393535613839646433376239386265 +36333264666564343561333661616432396662326665363063636530643361323762303364376363 +34663038613761643562373431323436653536346331313330346138613661366531396638623632 +62346330653965653637666366646134383562346162343330663339353838303138626335626431 +66656137663037646235656131386436623030626638366562393765383737386462616635333034 +63396261303034363334333866616230623534303862613765333237343866363264653530336462 +33663435643561323432306638326436653030326238313230343761343964323137663463333137 +37396532396432636631626339376462326639326238343531316363303865636663306663303538 +63343635323962393233353363373838666439346531313839666136353531623333633034656364 +39613434613833646639376332383762376164316362376464656537363139316531383666356534 +31396561303066613734643064626530333563323465383037633838666361373661346332313835 +38313039373038303365633736643062323931633330336331646338353736623331363561366537 +30333062653334386339653262666364656166383736383762613564613163363966616234363639 +62356338336538366336373564656162636565333663656632663034646333313065303232323561 +33346238306630346331666336383637623965316135653037626638373136663738643861613733 +34636331353262356135666238353766336430353833653265616432343462326636613837343334 +31306466366163313864653330613637386165363730343932366439393864323463323665626165 +35646131303064663539303530663635366533386631646233383935343033303232363562663431 +63353939633538363135306163333362306333616465653639323936323338316331313433653030 +30333062373138633434323637336536396463633330393663653131623234613838393537623834 +30343263366563653534303866376133363734643633313533326137343531393436636665343631 +37383331636365626536633063396336396630373531376164363434353836303632316364626161 +36376566383664363266373661646139393030303362663632313539383232373334376535353034 +62663333303966376339666132636236616365333839303762376431383563366164666236636339 +38666631303139373733663930313663643934363435396666386238343237363930363934613565 +62616237666332613633363762393533373535366137316436626266646362313762626662313035 +31336335356335303864383833623765383635303665366530306135373566316661633861616533 +65373165643565343961373963306464626536663433343365636237303937313331313037633066 +39356665623839306261663236633236626130383233643436623864636461633039306331393439 +38303635323363303135353836623534396236383639333666356563623465303532386631666236 +32316263323462626330383630313364656330636232636636623534383833303361626366393736 +61376536323364343239653430396130306231376166643566653436383763336366356533616337 +36383138643864386631633233303935313563366265653235363930303765646436333630326333 +31656232656566656366396638646161313932303233393365326339393530663662333233346337 +62646538363533643732633834386566346336633538326564653566323639323332363165376461 +39616138393735343536356233353862663365336464313162633866633130353063343466393333 +35336665306662656632306234653461353339643665373430336632373161366331363234646433 +33313662613934653532346532316237623936353431326239643966616536373363643636613834 +30626337343439326663326134306662663534623331643338363638383738633334613032623063 +37636561373231333064633332303630613965376631663765306566326265616630663361393133 +31313735646264636532353939363335333930373362386232636237643764386333363231303334 +31323231656537636465336662343638633964396362383138353936353432653163626537333237 +37326238323538626466326464653036643864623732613439393739343431343366336266346630 +64333663663034663330313936623039366662383335343835316132343666363933666433663435 +33646565363963343634373433383330393932383432366565653666323232646133393938666231 +30336232363063303238326132346334646634383063633936303336336332353166636139353631 +64393433333936363661383830316137363862626239663439613965326336643338336562646264 +62663664653363646436363338646631373534356661623436636235393762643034613766313861 +61663262393838363730363238613439633432643463613036663731373039633130376562313134 +63363036356237663333616534343464623036613363616434396430656438316665613932616237 +33316139323562613037383966646335633263666464323039343964373731336161626532353932 +63396434623637656133323266346633636239633964643563663132306566353331373263666566 +39633936393265666565313436353237353463616562356363363933656561336234386337333534 +33323633646464363061303132343739613933666433386466343463376333346332323838326336 +61313238366461313538626632303665353630313733353933643232333930323263343962323631 +66663433353064653863353334396630313130656263356561643663343639356134376235633165 +65623664313737393463346339623833353239333962656231643237633837636132636261653665 +38336563356138383237386336623663613365313261393561383362666635323163633161636362 +37636466353961323239373936653335663364643330656433616561396236633234316565333233 +33306661366536666538323633303637373263343739336334303863643666653732623035626638 +38396637343261343133653463623765663231326532303235313765663632383636393135363736 +39363738323133373162376162303130363466333139366330646132636666633366666638626163 +31353866386161343338353233643833356537316164653862643561363434663764393261626365 +35666631613731666666376263666232613336613962373132646131646134613734383766306164 +36326536396133663634613235663033336138393839303434613635613734313230623161663630 +37643235626331666530383966636131343035376563666631646436633039363338663438343733 +34633462353162303236366632623566393964396661656636663232633562346561663566656333 +37633961383036393162666232333732616633396265343533663964346465653930633733353630 +30613738363538383534366632633764376365666633656433326661333666336630393133653538 +66346365653065666437363035663433366330613765356136633431356564353032636564316466 +65383836336436356665363762316436373938353562353039363963363836393462643263386463 +37306462663132316632633538393162393137646165303930383636373761393438303261316230 +65316163353266383735616463666164336466663764383930356439373830643463366238626230 +61653132613231626162316161653432616236303862373035633839623936616230623334643634 +39343962323230353363666462303266383331353337653935643030306130393262336335643133 +38386536306338303363323435623237663933666539383461666363383837373462636462313964 +30393662333364653638656539623765393334646633376139323234323265383437333938643033 +37303963616536396235653339323031323139663839653633363437633961333930346264383538 +34626232336230323934343363646139316465656236366133343362346430666164353331653133 +62353361336538663162316361356665383638616363626630363564636639656161343733316239 +62643737353933313530396230323034353266653964616137626334623464633436363839333366 +34353535646130336165376239646365613463303935373332616234623166653736353138663361 +35383762373934306361366162356634663236643432306339343930393866373230346665376437 +39663339353939343833613666346434316332303937376537646232633864393731333436623230 +39366562343639393961396430326437356331623532353631653663373761343532353736313236 +61666637616266616435333233356363653334386637643262396635366237633465623837636133 +32613131633162616432323939343034653936383830376437653935366433613766613235633564 +66656433373964326464316439633765313766656238316165306536383539363838396135633839 +35353064616265623133666536313262393930343935653662323039633564613337323232383264 +31363464346537363061343230363938666437613662383265393237666464363830386366646137 +61373865643166356666626231316335616632383138323864396465666361363130323966363861 +62366139376166383161376564663239643334323037333335383931343830616632666566313638 +34636361303737663264653164333835343765386562353936343032303735343664363835663334 +39653061623766303064643439383537373937316664633236353964663534326163633466386466 +38613563613834646532373730336133393332353832353261343939343336306436613863353930 +36326236343963343232336439353463326539346130616465653235393238306330393632373261 +33383862333632636232653835643137326665386562326430643465336566343631363636363065 +38353734636565353432343431303262383636303037633036396332326537623233353234663234 +37636137613863616466626439346339323536343231313639353639316266616365313639656534 +38626233386534636466313564343231663334633635663337613131353733303037363638393165 +37353364623865356637333739316330633432316164636138393532653766393663313465346538 +32386565643936616337356366663630623165343230666534383135373137306632663137316662 +30303938313639303264633462386132326236313333656634343139363837396133306230666363 +34373631663466363536653333613638383361656230363633633836396562356332323431653335 +37636239636534363630663634643331396232363438346161303231326334326534623962303763 +36656530646366336639323537666665353638643833366137313837666265373236393734626135 +66343162396565303561616165346237363761313763343162636330353163366632396333373962 +32383664633335333465323533343130303362323734613663613533613830343234303763366466 +33636630373038346462653231623962613263626634386462333461346231643737396134323530 +37323131323339356165646165353762343437623536386131663535396464643666323863353034 +33336637623061346539633665626438386330636633613939383561346330393836343735656633 +61333962396237613639333736383563386165343662613534373562313463316534353336323666 +65356136373537326230336631333034313438333130623032366437383065396533626262353961 +62656665393965323937646364356433646231363863616263363733636562316434303431636562 +39646530316266623135333363666664303131633339643162616631303336383835666362633935 +39383066363863623231626631373233363931626333366462353739646638376630616163636661 +62316535356530356336653264346532376531363665663339303136636235366330616463666532 +36353236333335656635306335363565313630303930363836373433613234353936363339393162 +35613166663963313833383435306661323738366637326539633830306434633164663665343737 +66373231336662343737353563643763336464396464656531633466636330303132646635666465 +32313761653138623365303733393639663834633761663763356432626439666530633832383036 +61313261656237306637663132613630353938636431616437613566386462626136613566373730 +31323663333231663039306666613831383131373433646635623762633835633833353339363537 +38363734653437343435653262666166623233636463303238306635353439376362653735343835 +65613465383561653663316563373665636534336465346234303631623636633837393366663237 +37333835376438393637396136373663336333353062383838656534616437643232343766616138 +38393533363830626365646231323231366531383934386562643837353461303061333738346631 +66343565333338656166643334363935643831366238326132626661336639623835613538323634 +30643832616438353061303536336566373131353562393830653531376332326432303831366330 +30373034396532356433396631363064323035353662333632363639646534373035663937663439 +34666436666564336362663830383030316237633063363962646236643464316463313832343938 +61633530393132636130666631353761303132333764313035396266623936646462346465666165 +30383133626464346361336432633762363233393330393738343133316337346530363033333332 +38613262616535323931386636613864633230346635363537373735643137666165623562386338 +30326561666537616434633734653238396466636136306439643733396165653632363063346465 +64626436356532363562616439323335653637316339633163353834383064363137623631623462 +33386231386362313135313833316261363366343366313034636161613334383666656137396331 +37326337313833356264366434353431393933343766363432363331616265623866353536353461 +37333237356637343537323464653261356462363365343032373435376464643862333238623661 +31636331616531363864313061313931323533613436306337363334316431633663653830633662 +65663161333261653234386339636366356230333465343738333330353237653436613039353139 +373436643563343438663230316130653731