From 671c296a5d61935db19232f80fe48a9581669354 Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Mon, 14 Oct 2024 23:15:34 +0500 Subject: [PATCH] Run tor service with basic configuration It's not ready to forward any requests. --- roles/tor/docker/Dockerfile | 9 + roles/tor/files/mastodon/hostname | 1 + .../tor/files/mastodon/hs_ed25519_public_key | Bin 0 -> 64 bytes .../tor/files/mastodon/hs_ed25519_secret_key | 10 + roles/tor/tasks/main.yml | 48 ++++ roles/tor/templates/torrc.j2 | 192 ++++++++++++++ roles/tor/vars/main.yml | 1 + tor.yml | 5 + vaulted_vars.yml | 246 ++++++++++-------- 9 files changed, 401 insertions(+), 111 deletions(-) create mode 100644 roles/tor/docker/Dockerfile create mode 100644 roles/tor/files/mastodon/hostname create mode 100644 roles/tor/files/mastodon/hs_ed25519_public_key create mode 100644 roles/tor/files/mastodon/hs_ed25519_secret_key create mode 100644 roles/tor/tasks/main.yml create mode 100644 roles/tor/templates/torrc.j2 create mode 100644 roles/tor/vars/main.yml create mode 100644 tor.yml diff --git a/roles/tor/docker/Dockerfile b/roles/tor/docker/Dockerfile new file mode 100644 index 0000000..7cc4142 --- /dev/null +++ b/roles/tor/docker/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine:3.20.3 + +RUN apk update && apk add tor +RUN apk add lyrebird --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing + +USER tor + +ENTRYPOINT ["tor"] +CMD ["-f", "/etc/tor/torrc"] diff --git a/roles/tor/files/mastodon/hostname b/roles/tor/files/mastodon/hostname new file mode 100644 index 0000000..1a01a79 --- /dev/null +++ b/roles/tor/files/mastodon/hostname @@ -0,0 +1 @@ +mcomfyzeyibt2unmkttoxa2li2dzpsljcp3sasrioqsks4ayrl5kk2ad.onion diff --git a/roles/tor/files/mastodon/hs_ed25519_public_key b/roles/tor/files/mastodon/hs_ed25519_public_key new file mode 100644 index 0000000000000000000000000000000000000000..12ab8ab2b1727b846fe8d7c26db82628facccdd4 GIT binary patch literal 64 zcmcDuRY*-SGBq`{EHl(CC{4=AOtw-esVqn}P_VUSU|>j?bLg?kA!ggaH6hPlH+#Fa UPd}L{{9VCIqeNw8fkf9Y0IrS~*#H0l literal 0 HcmV?d00001 diff --git a/roles/tor/files/mastodon/hs_ed25519_secret_key b/roles/tor/files/mastodon/hs_ed25519_secret_key new file mode 100644 index 0000000..4bc8aab --- /dev/null +++ b/roles/tor/files/mastodon/hs_ed25519_secret_key @@ -0,0 +1,10 @@ +$ANSIBLE_VAULT;1.1;AES256 +61396332323030333966396133656338343630386661646431393233313061633436656138356264 +3666343065366430303331333733383535646133373964370a353666666535386261346632313838 +39393637333937383934393131636432653730373639653737623066633737323665326530366334 +3235663166373338320a616365626364306333396263396462633334663037626538646333643439 +38383632373537626537646134663532323633616638636166393335303130666565636234373266 +65343932316465306139336365373539356161616166323930383466353430366465376336393535 +61363863386436393530373434656435626430366263346262386439336263323765313333396137 +32326334383364653838326436386561623264626335643434626663663236633730306437373766 +65613939666433383732363634656437346432323339396161386630313562336332 diff --git a/roles/tor/tasks/main.yml b/roles/tor/tasks/main.yml new file mode 100644 index 0000000..f6a2b66 --- /dev/null +++ b/roles/tor/tasks/main.yml @@ -0,0 +1,48 @@ +--- +- name: Create tor directories + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: "1700" + owner: 100 + loop: + - /etc/tor + - /var/lib/tor + - /var/lib/tor/mastodon +- name: Copy tor config + become: true + ansible.builtin.template: + src: torrc.j2 + dest: /etc/tor/torrc + owner: 100 + mode: "0600" + register: torrc +- name: Copy tor files + become: true + ansible.builtin.copy: + src: "{{ item }}" + dest: /var/lib/tor/{{ item }} + owner: 100 + mode: "0600" + loop: + - mastodon/hostname + - mastodon/hs_ed25519_public_key + - mastodon/hs_ed25519_secret_key + register: tor_files +- name: Create tor network + become: true + community.docker.docker_network: + name: tor +- name: Run tor container + become: true + community.docker.docker_container: + name: tor + image: git.comfycamp.space/lumin/homelab-tor:v0.0.2 + networks: + - name: tor + volumes: + - /etc/tor:/etc/tor:ro + - /var/lib/tor:/var/lib/tor + restart_policy: unless-stopped + recreate: "{{ torrc.changed or tor_files.changed }}" diff --git a/roles/tor/templates/torrc.j2 b/roles/tor/templates/torrc.j2 new file mode 100644 index 0000000..02c59c4 --- /dev/null +++ b/roles/tor/templates/torrc.j2 @@ -0,0 +1,192 @@ +## Configuration file for a typical Tor user +## +## Lines that begin with "## " try to explain what's going on. Lines +## that begin with just "#" are disabled commands: you can enable them +## by removing the "#" symbol. +## +## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, +## for more options you can use in this file. +## +## Tor will look for this file in various places based on your platform: +## https://www.torproject.org/docs/faq#torrc + +## Tor opens a socks proxy on port 9050 by default -- even if you don't +## configure one below. Set "SocksPort 0" if you plan to run Tor only +## as a relay, and not make any local application connections yourself. +#SocksPort 9050 # Default: Bind to localhost:9050 for local connections. +SocksPort 0.0.0.0:9100 # Bind to this address:port too. + +## Entry policies to allow/deny SOCKS requests based on IP address. +## First entry that matches wins. If no SocksPolicy is set, we accept +## all (and only) requests that reach a SocksPort. Untrusted users who +## can access your SocksPort may be able to learn about the connections +## you make. +#SocksPolicy accept 192.168.0.0/16 +#SocksPolicy reject * + +## Logs go to stdout at level "notice" unless redirected by something +## else, like one of the below lines. You can have as many Log lines as +## you want. +## +## We advise using "notice" in most cases, since anything more verbose +## may provide sensitive information to an attacker who obtains the logs. +## +## Send all messages of level 'notice' or higher to /var/log/tor/notices.log +#Log notice file /var/log/tor/notices.log +## Send every possible message to /var/log/tor/debug.log +#Log debug file /var/log/tor/debug.log +## Use the system log instead of Tor's logfiles +#Log notice syslog +## To send all messages to stderr: +Log notice stderr + +## Uncomment this to start the process in the background... or use +## --runasdaemon 1 on the command line. This is ignored on Windows; +## see the FAQ entry if you want Tor to run as an NT service. +#RunAsDaemon 1 + +## The directory for keeping all the keys/etc. By default, we store +## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. +DataDirectory /var/lib/tor + +## The port on which Tor will listen for local connections from Tor +## controller applications, as documented in control-spec.txt. +#ControlPort 9051 +## If you enable the controlport, be sure to enable one of these +## authentication methods, to prevent attackers from accessing it. +#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C +#CookieAuthentication 1 + +############### This section is just for location-hidden services ### + +## Once you have configured a hidden service, you can look at the +## contents of the file ".../hidden_service/hostname" for the address +## to tell people. +## +## HiddenServicePort x y:z says to redirect requests on port x to the +## address y:z. + +HiddenServiceDir /var/lib/tor/mastodon/ +HiddenServicePort 80 127.0.0.1:80 + +################ This section is just for relays ##################### +# +## See https://www.torproject.org/docs/tor-doc-relay for details. + +## Required: what port to advertise for incoming Tor connections. +#ORPort 9001 +## If you want to listen on a port other than the one advertised in +## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as +## follows. You'll need to do ipchains or other port forwarding +## yourself to make this work. +#ORPort 443 NoListen +#ORPort 127.0.0.1:9090 NoAdvertise + +## The IP address or full DNS name for incoming connections to your +## relay. Leave commented out and Tor will guess. +#Address noname.example.com + +## If you have multiple network interfaces, you can specify one for +## outgoing traffic to use. +# OutboundBindAddress 10.0.0.5 + +## A handle for your relay, so people don't have to refer to it by key. +#Nickname ididnteditheconfig + +## Define these to limit how much relayed traffic you will allow. Your +## own traffic is still unthrottled. Note that RelayBandwidthRate must +## be at least 20 KB. +## Note that units for these config options are bytes per second, not bits +## per second, and that prefixes are binary prefixes, i.e. 2^10, 2^20, etc. +#RelayBandwidthRate 100 KB # Throttle traffic to 100KB/s (800Kbps) +#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps) + +## Use these to restrict the maximum traffic per day, week, or month. +## Note that this threshold applies separately to sent and received bytes, +## not to their sum: setting "4 GB" may allow up to 8 GB total before +## hibernating. +## +## Set a maximum of 4 gigabytes each way per period. +#AccountingMax 4 GB +## Each period starts daily at midnight (AccountingMax is per day) +#AccountingStart day 00:00 +## Each period starts on the 3rd of the month at 15:00 (AccountingMax +## is per month) +#AccountingStart month 3 15:00 + +## Administrative contact information for this relay or bridge. This line +## can be used to contact you if your relay or bridge is misconfigured or +## something else goes wrong. Note that we archive and publish all +## descriptors containing these lines and that Google indexes them, so +## spammers might also collect them. You may want to obscure the fact that +## it's an email address and/or generate a new address for this purpose. +#ContactInfo Random Person +## You might also include your PGP or GPG fingerprint if you have one: +#ContactInfo 0xFFFFFFFF Random Person + +## Uncomment this to mirror directory information for others. Please do +## if you have enough bandwidth. +#DirPort 9030 # what port to advertise for directory connections +## If you want to listen on a port other than the one advertised in +## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as +## follows. below too. You'll need to do ipchains or other port +## forwarding yourself to make this work. +#DirPort 80 NoListen +#DirPort 127.0.0.1:9091 NoAdvertise +## Uncomment to return an arbitrary blob of html on your DirPort. Now you +## can explain what Tor is if anybody wonders why your IP address is +## contacting them. See contrib/tor-exit-notice.html in Tor's source +## distribution for a sample. +#DirPortFrontPage /etc/tor/tor-exit-notice.html + +## Uncomment this if you run more than one Tor relay, and add the identity +## key fingerprint of each Tor relay you control, even if they're on +## different networks. You declare it here so Tor clients can avoid +## using more than one of your relays in a single circuit. See +## https://www.torproject.org/docs/faq#MultipleRelays +## However, you should never include a bridge's fingerprint here, as it would +## break its concealability and potentionally reveal its IP/TCP address. +#MyFamily $keyid,$keyid,... + +## A comma-separated list of exit policies. They're considered first +## to last, and the first match wins. If you want to _replace_ +## the default exit policy, end this with either a reject *:* or an +## accept *:*. Otherwise, you're _augmenting_ (prepending to) the +## default exit policy. Leave commented to just use the default, which is +## described in the man page or at +## https://www.torproject.org/documentation.html +## +## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses +## for issues you might encounter if you use the default exit policy. +## +## If certain IPs and ports are blocked externally, e.g. by your firewall, +## you should update your exit policy to reflect this -- otherwise Tor +## users will be told that those destinations are down. +## +## For security, by default Tor rejects connections to private (local) +## networks, including to your public IP address. See the man page entry +## for ExitPolicyRejectPrivate if you want to allow "exit enclaving". +## +#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports but no more +#ExitPolicy accept *:119 # accept nntp as well as default exit policy +#ExitPolicy reject *:* # no exits allowed + +## Bridge relays (or "bridges") are Tor relays that aren't listed in the +## main directory. Since there is no complete public list of them, even an +## ISP that filters connections to all the known Tor relays probably +## won't be able to block all the bridges. Also, websites won't treat you +## differently because they won't know you're running Tor. If you can +## be a real relay, please do; but if not, be a bridge! +#BridgeRelay 1 +## By default, Tor will advertise your bridge to users through various +## mechanisms like https://bridges.torproject.org/. If you want to run +## a private bridge, for example because you'll give out your bridge +## address manually to your friends, uncomment this line: +#PublishServerDescriptor 0 + +UseBridges 1 +ClientTransportPlugin obfs4 exec /usr/bin/lyrebird managed + +{% for bridge in bridges %} +Bridge {{ bridge }} +{% endfor %} diff --git a/roles/tor/vars/main.yml b/roles/tor/vars/main.yml new file mode 100644 index 0000000..b95051e --- /dev/null +++ b/roles/tor/vars/main.yml @@ -0,0 +1 @@ +bridges: [] diff --git a/tor.yml b/tor.yml new file mode 100644 index 0000000..b069d47 --- /dev/null +++ b/tor.yml @@ -0,0 +1,5 @@ +--- +- hosts: webservers + roles: + - role: tor + bridges: "{{ tor.bridges }}" diff --git a/vaulted_vars.yml b/vaulted_vars.yml index fe23e4e..68c7b6a 100644 --- a/vaulted_vars.yml +++ b/vaulted_vars.yml @@ -1,112 +1,136 @@ $ANSIBLE_VAULT;1.1;AES256 -34646465666661333035663364656438653739616533343964616336343363663164363038613634 -3732386633376134333131646365656339343838366666390a663934333132353261643439366537 -37363930623832623034353661336133643837393630613965363434663865303839333337643531 -3961373238383532620a636539306634356437303062303961346538623463396634363335323163 -36633134613734393335386237626632323437653731326435373837643066623163653162396161 -32343437333035633138353461666139646134633864626438613266386130343263323662303430 -35336330326331376238366230363036376461343137306333376138396562366235643033613235 -66313066393934363835363938663262613539353830633666386165333032316634333330623334 -37336664613031363337623934306661653938306231373163353534343133366331306230653964 -61316133346365373063663539363335363263303432373066303833626338626337376131303266 -66336135333839643733383961666433616334313335373035363032343935386164333631313231 -62393263643537663138323266316231636630373064613432356331373531303431323563383462 -34663438333433333762323562623465313632613638356466656634393130366531633638643864 -62666564343235323938653663633265653334306531656533383365393339313235613932333066 -62363963616466346539666562366330303064656562383735363862633138363466336237663262 -64353264373066303962326364343239643164393939333566613935356632613731333366613963 -39653831373934306237393565343161383232623062633035306163336235616530346162393961 -33336435353062313633623635303931383230323265313835613631303930623265383436396361 -32363032616461366339643630306263643062623564336666623561373235653266373466306436 -33346231376461363130303231326139383131316236303539363035356533333163353165366637 -61306236373936646466333339653964333663376666383862303664626163353736663633613161 -30636135343462343436336566633637663062653566323430616433333933373463393564653234 -35313634646638623766666534653937643661353933616264393732373961333831326264633531 -30373762663364326363653437393532323831366564643131383234333565646437366365666534 -62346536396463313561616265373064326433316137643336616434643239343364633133336235 -61616461306465376638373332353730313264356432383439373632643937643062363731393634 -37633539653534343335613236366564396461626236653239633632623735646533323238376463 -38336538633239313138353630383832633730646662366632373962363365316566643231393838 -63653962623662613265363466343138636333303034643562366136323234323439636532396638 -34656236653064653364643337303832303437363661636333356332613163636330346138663266 -35383232303438336234363231626161323033663865316563326161666561663534353466313234 -37383865313064336634623631323935613535373137323333353834363639333762326633343165 -66376132633466623265366433316665303934323662626438366637376331386465346335303436 -31666464623237366239353831343436636564636466343830626236623935333038633562353566 -65626238363663326432646633636335383935623736373761363862316263383664656562653332 -39623436656163353232666137633666336631393738303565396436653535396163336236653431 -32363462666539373130656631366435306465386138616261643866353537306165613934343233 -61303038343435303264663433353232643830373437373430326161613963353164393934326435 -32646163343863373134316336363063313139643838613035303638363665313963346537643862 -32653562383562333961333061616239303138306661656265326565653830396165663134363534 -63353039626438666663326531376430613864623730353763643932646532656664393331346231 -36313933356566633665666530323239656632303837343362653230303931616461373734343633 -66663433376332373933623662376634306333616366333461366264626333313462363833353639 -38396337333139666530316536333130396530616239376433356336336338666635613630613437 -65613030336364353434306631366332353063383761626664633030313336653764366265356437 -65666565643962306331333739653361373538653530336161303430643437663566613235346161 -38646163643530666162366464383237666366666333393964353364663064316663313935663264 -35326561643939636233366164663239396537333538623435393932313137633361333231333663 -34373561383438653466636238326331626431633437363861663439386334313466303733663166 -66313830326533656564396562313834393933313962386166383963623162306238336161636537 -63363361373839336435316238643333643866396137366466633239383031326161663561363539 -38613031326434653763303438306335663665303662376432323066663435393162326135396332 -32646533326162653935393563323539623361633066306130376662313233303162303930666433 -37346436393438323134373364616561343636383861653063353362303934353239633061396536 -34653637633166393864626363303530323234643163303835363561653636666438656363363433 -66353834306461313463356166663765323130336264303331396235313637646538656137363736 -32633665326131363337373930326462623065623132613335656136373031323930623862626562 -37643166663731316162346166386235656537653331643431623133663761366435356635363134 -66343665363136366536346135306237666366613664633031303639363933373635396161306430 -63383734646363396662633531616266303036663636626136346163636431356432343664643139 -61333864646436373162333863646662643163666338663731346465373762626563353263303137 -38323961306130356132313263616134353536626534626165353162666262373538623133343930 -30643231303135383964373038666434363239393736656561636335636465333333353732656139 -61343664376333653063663266656438343930393230383238303734663439643636303863303336 -64323335663565666331386362343236326233333739343837636664613931633332393033373730 -61373534366635343066656635613532623331353631656236356331663634316266643866316338 -32646539373931653262643031626361646566346332373238336233313238383634316434653739 -66383164313764383339356564656238626339346637356538303937323431386630656166313530 -63346533383163613730333731643733623836343038306566353837623034303938366564313737 -66326163373739373764336536356232383634623035633733616237343664323530303161373964 -36653732326632393731383262663434643136346464653931653865336337316533356139326435 -65636536386563313366353863323231366161643636373836303330653135343065303830356431 -32373364393334393236363635353139363139656366633532633436623964303366636464373135 -38323731323664626536346639666237386332626664383433313834366135356536363239323631 -31346532323737393330646364393764643338353061373833363666656632666464646462323931 -30633263616464386237316435393031306436393733346163306166313934653633363566616162 -32323033656632393931666531363536386135353239613165656335616565336331303839663130 -37643465313466386466323836643737313633653537353235356335333461303235383031396236 -61353837666339386334656131336332613435303635626566633630333537336330356537366337 -35343565616363626632383237316233393239613965376630356437643937383734623137633766 -61303263356339383266636537636339653533366432373464393761636666393463356334383963 -38363434393938396636613963633161343861333637323231633231363134303138613864353038 -35313939386333333665616164666334373962393937323166656533343765663332656561353838 -65333762663962666362623731363039353137643133356532323931313966323039623631393736 -64613639303762363561633433363737343637336566663937323737326133313334393139633431 -33373837333434323430353134613064313063353737306239396231356465656265396239376565 -62623535643832383961653436383362646439336263633430346365623039656663393735303836 -32616536666539376562383730643636653762363336666331343938343161653630643939636635 -32303935323732623930336330303133383830666633366239343733646338343939663635343331 -33333565653431346130646533386435393964316231616661333735623761656332323264366164 -61653133636437663139366634363264656130643530326133393366313665343730373230666432 -64656231633038663136666635653136633062623132333338636438346533353731333265333765 -38393266643737356162346466323866646237396435396536373736623838333836656562656531 -32383935613664666266313436356437313833303633363835666161336666356639643436616366 -30316534383733313737646364323639653833643535316334386363643161363564393834396132 -36636236396331356664626265396331303361623233336435383032653731653337333238613034 -33373832373363623531303764366462393738653338653533656533303232323763313238626131 -30646662373261316537383061613539363135653431346637313861646333343933646333366366 -36393463346536303866643738383538646334343634653431666130373663666232396230623631 -64613838656364353835313265656366363462666466363833313531306366363261306265613739 -31393666663037643566373131323935656135616339353630613339353065343261366330393762 -62323636653931656161363262626166376665303632326265613130663633616161663834343066 -36303036383139313431653134666163353230323536633762643631383238613732346439346665 -37623433633737383562336238373461623262653261346136393233613230373831313137383133 -62346165656136393032383764323533626430383936366338336130623633373965313961666538 -38333936653763656632303761303937353739313531643931653565313535366264666538343737 -39396337623136376161633463313431343434316431366531373130666131643266643237393762 -37333935373831646566323066623833663831663565643530366636623839326330346564643730 -34326663303931343336643061633564373536653066323562363234386239326364656431316366 -38616265333632626232336634643538623761386136646235383536643564393430656264393035 -383639323339333239383266623566633466 +30373832336334383031646564333333653031653261353835306230386636653566316661303737 +6364386435343864386361393466663839663563363430370a303030613533363830626134363862 +37376436353530383662643338373936313566313165376134656532356139666136313635383635 +3961666334376565640a646130383664323466616566316539636663643338306162353162393065 +33663031643362323434623836336664643762303139303031613065346661323262383938623764 +35323862623835623037343537313533333362306666396237333839313835303665306130623933 +63333038666232643936353062353562316263306338623161636463376132343665393139333434 +38373165343465343131616130613739633437636361663563373730643631663534383735663266 +35383535383732636236383831626130633333633535386430356666393533386562636633333365 +61666136353163396462346535326631626238356430636465636464373634313765653735666436 +38313435326330346131376332663161323061323633636363336662333135623265366139653831 +64616333303464373331323562613433343935343731393531333063346130653462616535396562 +66653935313339373339626139376139623335353761656638653666333632383037366665623739 +37666539346165616165653633643661356638326333396364626465373662343134386336373637 +31356531363062346533323835343666623062373239313435363863373133366131326430363963 +61343438366532346631313532643363343932636566336338383138623138363761663533306463 +33386333663261633464333264616161366164376262646265366431346330363834626138656662 +35613063303735653039303664343065386663616335343433386264346635343639636432653633 +30393137663230323764376434383966363335663831633634613564626366646563343937386435 +31303237356332313432306163356531656364323032636338636264356636393137383066353961 +36363266393166306439663764326339373037303063653036383733656237653930376262623963 +64663462306161366530343232336436353237303565323939353534653863653736373033633132 +38323736663961373938363862663262623030643532623761303036616438373665646263613730 +66393436623339333035393237343734636561656363643938373539316435313337363531333335 +61656139643035366361316630623630646664323438346466353234396233376634376230313638 +30646630623362333334656533326164343831646463623965383461336336303362386134366463 +37633030363636636161303735333734323939323534313131343837663634643830383836653864 +63313834623439636439643734376134316334326337316337623437333566303537303030373662 +63383630633564393164356534646562656139653063306438646164383437356635616337333234 +61633066323636666135303761373863373934623135323163356434323231363965346264373363 +65356139396636326538326166636338353536623432626363643566333165376331666131393061 +30666436306137643333616365333165346363633061363534313662306430613433623461393439 +38353037303064306631303461386163316135663636613534313037666361363935613763373835 +64666465383238366335383635363962313534313937326338663134316439346638393164363463 +62393835383734316232623039656231303234613132373634363564346635663938613762623733 +64353437623031643066643832313039623763663238393933326563646637623333356661313336 +63616462333261316130666365336261343639353737346438666237653430326531323437626664 +61623863613336333232666139343534636433653333336661626436343332373363306337666466 +61353532613630626564666437363766343834646632333266396630393261343965336537333632 +33653934646265663833366562343331363763653961326132353530636166363135336436303362 +64373262666666633961393537623036363763323262303435333036633362623366383765333764 +66656338636634636265343066386332643332653433623838386630373930363065386433316630 +39653834326533306161616366333761626165653233646462336566633664663836376337663961 +62366335626132323661356362643564633634366331303663336336643535383039663964393330 +30353966373862643038626532313539373666646161373437656635633033666166323664316162 +64363632366337356234376265333164393261656634313133343966643364666535383532663931 +65643764393363383732313637333734323137383830643533383330373465363861653138356563 +63356338653066623630333639336535613939313663663865616562653038356661356539373439 +38656337613835613939623736623234356234623932643130613437643333356333306166623835 +35643133383466313861373236333435326633326232366233656538663261396663326563386437 +39663633653230343063663663373430333933353931313638346239626538386361343866353933 +32366439633137626239373938646264663537373135373031653062663465376332646561383431 +35386532303134323463633761323165333831626566393966376561303261373832313336623439 +39653631383638393364333061663839323632343638326330323064303036386162666334633066 +65356636366664373165383163316465383566646530633561376266356636306263653039613361 +36326165336135636438666132386366356230326435393234333862663432633364333430316266 +32373230323735623162353938373466623337303765366665316530323731316233643266633930 +62643737326661613961313430333763663035646262626264323639383635343264326535363263 +62393235326631343035346530613631316638643661653164356134663163383235613330353030 +63616532346363376361643334666233656664303837333237326366623136313937633961613434 +35393834313538353936383638303466316234366665353832386430616131326365613635303338 +65343130373032323538333364313633353966343561373366613831396463363961326561313366 +34323833363761386433633961636266326632356331613563306230663739613134623532626532 +38316531346636323361613331646332373661613665626338646161393332656434663139396164 +64613962363635396538343365616665626439623466316334356638653733303338363264633361 +31393237393964613062356566303361623933346537383032303530623232666166643436313164 +36373435656234313639303463663861653661323737343232386230303131613962353132633261 +61333739393831313630663864626535623832326535653437383932356163656533313231306566 +33663231336461323464316138366232346432333937613335623966353235646235346231636436 +30616533343330373263666136373234303061383632396530303734633361613133613735356162 +31643835313463623034393530373933386630393064306465336234373763646437376263306365 +39663436623430316362356261383064656530393330313662373731316135633937313432646630 +39646431653663386432323961663530643436663436313461663264656134353231386365323931 +34323438306363306537363137393830666463313462336631636438323365626334643162333466 +63626334623433666431316339383830336438666139383437383132613831343237376134346563 +63633337633262303561353862313137383563343336636366626238396636313765623334376432 +31336436383532646532663636333461343635363933313533613539626664393061646237376431 +39613337333730373263353836353731356264653131356535323532623862323262353862386535 +34323764646137353063303237396464303666643132313861633534616637323363663238653362 +62303336356237376534333534656262383433306266333663343535376664383034356662613663 +37343365363436346538646334363833323731636533316664316632366162346535633463306439 +36633336623632383736363761396331303239376535316230323339616163363230663030393761 +30623461646130326338613262373135656264393963326364373065663030366566383036396464 +66613130373435383236383430353262356537323038663665633631343838383433613062316432 +66616233343938326236323364623965643364356565316666663338306133643738393638393532 +32636662663066353132363065353939613161383765663538333233316165613537646162383136 +32313434663834396165336236333763646435643163393938346234646563386639386234303163 +35313537636564323366376337643465373162306138613561326462633035343638326533386330 +31646436356264393832313265663238363765313639336431346166356261356430366162396531 +61376234616631393435613837663036613663373334393066366366353966626266303562666134 +32333763373936376663343233663165313332336263656234346234356465653462316531313737 +34386566346132313639613465336634613737616331306164313866316530623832616565353936 +36383930306563336634383234356536633638303833636535386535343937383865386232626238 +31653235303336656466636363323333656333343037633935613964306664393931623938396537 +65346136626665653933346639613261313666633736323735633265633762356462353739363636 +31616333653831343631333736376433326135313963643363663766323065366538393437366631 +65363332643066666663316134613430613239383666313135663839643236346537303238316533 +34323432653863323966366461653361356232356466316162653739346563643138643965313363 +64663266376461383066613538613134333638316333646363333537646132643836363136303336 +64353431393133353666333865376139316664306434356464623563643733353763633738336261 +36626130366362393061626434333365373164373037303439316263316530323333663261346232 +39303463646364633562656565646235616637363464636631333138363663306531313464643535 +30353738636162373866356438356237343837623136366365613739383234633335306431646139 +65353565316530313461333863353161383464323439643132653136613962613133303731346162 +66653237323738333537356464323362383062326531613039386235633063336666316631326366 +32316233373237333163373532336633326565396237363432323236393231396435323365653139 +36313732353437656231373334613732613063306634666235643330386463653338306162663965 +34623933356231643861353733613933326332326539303036366431383937383132616138663965 +39393631313635653035636339663034373862376534663365333863393531346236373038653031 +35343065316533653639356366306230656362646239373138386439613161366162633361356563 +61356461356362613063346530356634333839376637383762353437666430653439613831303032 +31653564633362623232616330623134306638306262613135663861396338643363663266313732 +62373732323134303335383165323164393737376338636134313265383963343936303863336431 +38356337383537393630323939653063396366653735643437343261336362313765383833313337 +65306435326531306630623236643438356337636364636437396533663361336338316133306237 +34666561393730346132366339333361623631316636323263666462353533336161663731613434 +30643338653264643636373735353130396436613231303535323965656439393932366262313837 +33386333653534613763663133396430633938653737646132303566643863316666636238613864 +38646137346163643933363736626662343863636533323563343438646539376535626464393863 +63346435643138326134316638346139643635373064316631643265313437343466383536396265 +36643236323933626663366663396636343835623861653361653239643138366138373338353939 +65383836353334386432393132376433323831393461303133313631333634353938316166336539 +64626633386262346136386336313432636365333861643463613264393264643331336361626361 +37373333323935323663663561333630333565633665653836356632373337356165623166656538 +62336437356431393136303037633662663762306436373538323135316130356165616366366336 +34363235623133363961363462383934373830396133356232303938656131386632666133633062 +64323330633731616264393263326137353434373538623537646431646133646234353034326462 +64306139353834616639613638326238386632363232356338306337623136326563653334666564 +64353765343630306535653430376431343132396232303466393964383333613666626561333766 +34646430616231633061366332323337336462363437626166363561363232353563633563323332 +33616534643335343832393164646434636430363366333037666539626132376161303731386561 +36663830303433343932366661343536623865303438366132313832386637643063663439353038 +65643335353163316533306633363037616232383530393839616334663336306237303531613832 +65636663336239376235643036623032646331663962633430633161306539646464656131623163 +346539663562636361616135326237383664