From 817e5363402b143c9269681a0138b6884940cc36 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:52:33 +0200 Subject: [PATCH 1/8] add new Cloudflare R2 guide --- assets/r2/cache_rule.png | Bin 0 -> 28906 bytes assets/r2/encoding_rule.png | Bin 0 -> 23817 bytes assets/r2/gzip_rule.png | Bin 0 -> 27662 bytes assets/r2/index_rule.png | Bin 0 -> 27317 bytes community/CloudflareR2.md | 144 ++++++++++++++++++++++++++++++++++++ 5 files changed, 144 insertions(+) create mode 100644 assets/r2/cache_rule.png create mode 100644 assets/r2/encoding_rule.png create mode 100644 assets/r2/gzip_rule.png create mode 100644 assets/r2/index_rule.png create mode 100644 community/CloudflareR2.md diff --git a/assets/r2/cache_rule.png b/assets/r2/cache_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..769d00c436d9d508a3432d6072a1c81d1a3f692b GIT binary patch literal 28906 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 C!5g{& literal 0 HcmV?d00001 diff --git a/assets/r2/encoding_rule.png b/assets/r2/encoding_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..c56bad5b94ac448b0eae6d8b23a1198366babe9a GIT binary patch literal 23817 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 z zZP{0|F!)1CvlZ4|J{$o7qQe#${r${ok7V5&yu%Xb+vQa=>VSzhL92|rae4E-o;$4< zkJrD>IJ$p?FXj8l_JnK`f6?Y0E@`^^(}fZFra{^U&$xi@u!L9#Z1vcUJ$7>>N z2erfPx5@0SSf~_q7OarD%dK7jSD+f;AshonYOk1J`5LY<_LAWw0LcIxM;$>OF^sBl zSOeD$JLv8$c?L3bCbO3?9<;v;4BKbH)vFPisk@CnYa_12nN`B82+SYp^DsMYd-WQnf6W3pFc3lO>*h6*hV}h_02^(@PXGV_ literal 0 HcmV?d00001 diff --git a/assets/r2/gzip_rule.png b/assets/r2/gzip_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9d6af879935b3f22617f6ced5bff7febb3d30f GIT binary patch literal 27662 zcmb4q1yoy2*KQI*2_D=bxJxNTiUo&aEfgzGp%nK5#R6@CA_a;&g|cS0$y#ogWA z<%WL$ch`Hr`>(t1zZT&nbI#1{*)#L(y`Mej(=#;%Tr5f~004liq$sNa0HA53K4uUQ zs$^%RKL~XJx@ag!0}A`7H&8#omQt!x06<9u_O&TG>NlpNqMi!?fY);W0k%8jm;(Sd zSxT}}FFYoMwP-CL<3ymvocW@{8iE4` zee@H0?BAvn)0dL9Tc+;gSW`v?0IKtLn{08oSj08B6dfDnr68v;Op z!2mc2^#8gYiD-J*G*f@PR>b7vr2_zvn}SAzm}IJI#eS~QcV4(Od0A7TTH^BurwBPH zNxba_0g$qU#hag%@Z5j^6D-W?%|HW@w_2$0)0ou;4wXAs>`F~@g1t-co&x~IkO%*V z0N3eYgW;mJZw@-&xwcx^H>UEgdv-qp0c}YL8F#U-@DSX zoTfS6_tI|XX_&%dF4l&ZQ`^X8j`hNng#OpO?v0)8tM9Kx-F;&t?&npaiEdRj(1rEF zYI-optGYF8k_qXb<2Nw>0nv1aXsB_!>e@Yb|C4C6I`1x))-4XE%qsmGtA!ACu+p#%P)Q}14=rs z+A-#fT^wFYHQrQ*DvT56rS5ubCZ(TZ6lzynZjZyOUao!Ad;Vp{L&-WhbGmS0=Vj># ze~uTioqTz?_yv`l&0(KYo#xl8Nq=aU^wMF@Zp^E|XWyCzznps~JLxM;opZ-1s81 z)9>^*-fF?5`;=e(aZ!3WVajP{AAByAvDSb8xHi6k^zCp)NG?d?4 z0UTqAw=zO_L(10CalyJ-PehAUHlJizQ#>lmQdvfCu{yVWWRkJrD zZ$RELUF|26u& zEaO4Ji#K!w=zp&B>BTu_*a!k`)x7$JSdfy+tP$a_Ec$n*a8GJxys(8C3VL76fsjwX zV0Ff=n}Dr#HH06!DJP{=l0DSBEpxxkw?i|fzGXTCmYc7?S)h;JfbB=(#RmO&Ci?)t zRmO=8lQ|eF3+Z}hSq!2Fw%|U;$Wm&{7+4_nUqEI!XzpH5o==8SF5#$Nda<~~&0bZB zO?wsDy&He!lNgm+Hl2wOaO%ZOoZh5z+W9F5>-}D6Lp(tFRg|M5aCc{%uzA-?2T@PqhA(h>>!1nz%+o^jRCeHW@1Blv|`;){2^b6|;iTsjXcb{dLg}QuktYC7_ z`nTkxw_Pnfn4q;K^1zL$*ydt2hK><|9}Rz^W17F=%V(L*Et*#NOgPNzvD#<6!)Yg3 z=`Ap%irOIXQggn5UM==YYyJw|DRB#{C|kyS9|%HFWf$714Y+tE@xtV<+2s zp??#|;rh~_<_=vey$l5jwy0zAPkiHUq9pZmC=!=f{rBvzIDWI`CAB?}U^5p+TPEAWD*fBxnAC9X0q$ ze=K>c_rznHQ+q#+<#mp%j!MW(^2%^m09^$seROLb!^OL}=OX(C%kjy~0b|h}8<9oY z$cq?A-swsBrA<_z9UBZKP%-BD`|9|<*=M#|H&1sz&JClX3IW9Xb1ci~l9=_CWGVa7 z+9OQP6!)4(@}6!dRD9yYnfHLDFG(N^@bp5CRGDcEwukZbx>RYTOM?~H2c({Se^2pL zFsMyx_G>wWjGy|KKNM0w*ES{-`jmv@o8tLR;8Mey$m|6^2BBki>|WmMqa}sYUbzdd zZj>SaAK3N(KXdP6r;_ye3Gqn z%6rdUHCvUu0g(Uk7kPhG>^J9=P^5N1iDG8{0!LB!`~R5Z3F#?(6` z=oQvbrDdSj-OW+>n)mh#0zW^m)r}~c*Hoi?YSGnq?6Ad=Z)n}e~+52s64wpO;I#0e{`RsF>vwOTq-MPidGpY+Xx8S5%fLeK zujmHiNW%W8!J2@`#6V|3_a;Tg`1q&MhcxUjcg2P-oA0oyvIfZ`Sd|B#L_BC8Y#yDf zB8enyGPrp%vj1pJCr`<=L;Xz7p<^Mj|CZ;%tZ`p(q$uZ*k5jc zMNFip<yzkTD~}?lnhCW8tjHfqYZ7ldW{D%Qt~*aqO^!RVTb6#{Ha1mX>&DGrP}a+?|K_#dfUS zeBtySU(jhWYKqm5}(jO=E;{;~m#!TU;Ong`%@bJ|uyftJUZ1RoexA`3_TgQ9{102~zx000E{7DE=<^rhauTGgeoPW7&X`-)#3 zqhm~>XXeNGRnt2Q-~OW#qqq1NU!@TFg00b=oA9Wal;0*)$hU*JSg#-h_aTrKGZ>XoLv|9eKBi?Bj26|iW zwaWcUPV#4V@Tas)y;!5p2HCS(U{sl_T`ke~w|$^Z$Qj9{9-Q6AD3J^dFbRW@t8s&E z4xwM-1b&1uW)QEh4!ZX7t}K#LIH`k&Yyb53mRsnp=KOGS+0nAe`dUU8Da?A}5_d>P z5jR6HU}s=T4eXsDfB=w>WZ_PNAZr{f3%(#9yJC~NHhVTV2j*)DR4|V@eVTxFHVA4XQn%8;ii7qO{n#Wec;dWk6W}`5uKkkAeJoA6NPsMF-QJvkWf#%Tw3e6i|;k%8YU@jzIH=%>2|uk5@j z7#_69f-#zmJv=-L>ksgQ{t>YL&*IpB8@BtH?Ef$NMM|n5#rlI<7Cgk#)UvI9h#UUu zds3aC{<$^{7qFe*q>gMhc@}4ZGEuHi^y0oJp1LZX?aO$vhSut}ho2m&5>z_rJ?`DH zIxo2Clp%^fwXgIJ-)dKaWNmVf>d>rd8dNqFza$t)>{5H&~F;H}chiAT4z*_~SM;0~g^-zWu@h@YXSaOnuq4Fw(rSF5z{+t>dcYc?H=uu+ zlQ8c4Rb=tD&+0df(pe}!MQ+Ujy*EtR^^-Tbzh6V10qqxeFH0rb02zA&Y$8Yo}*{S{xfBWKPrnl+D#Scwm4wxsE9ni*QiD*CU z4{*D8%oSE4JiU#MPf7XMV>r@Oect%7-AuUgH&j}PS6K|O$5^pbYO`gRBzK&&Y0$s$kN@C@awbHwuu7T*QbW~o@uQ8cb%8UM$YnS z*eaLQG(hI&X(FH-FW=~IV}+f(J_Wc{4NvZ&g}LfLtYklB4FR>t#Tmh~2PLml=POIixwhZXjMOPrFy}xnmM5)T~v?tg`&KKmVGE^}LQwjFPYE&F_O`bSQyoos+ z>I-xh^Fwh}Cu5c+xwrrTEj7@qVOB3s81&;=e`+)pGX8Y(;CQ6~!X{epS$p}8_?mBbuw2yI4`;F9acCjW zXGGDe%{`EK#AqQG!{?WDfO4KtN}Ei*sQV-w1z9#h^gXz$84(z;854v__loG@003ft&Oib8<-~J%_xMZQ$ViUD-MdbT zD%9ma;TQ&z=&2i^g#_&yws-CkS@pH($=ncmMz~Hw{7T&evrB&SK?|2p;*QNKKes#< zdrUA6Dok!q?Fc$yVlWeo{E#TAG`clW!nF^x*lVNn_5B{Wm5BMeiNKQcOGHAWmwDht z+(FG~^7`Yl*&+EF)hl)X(@?mrAKrPr)BRS!hGCQQ;ou*LbHO6fx!k)N<^z?hr$Hb+ z`2BW1KOl9S?Ylx-^EM1oS09h+AG3<^_g8oijXwVNeL%N1#B?u$>hyeN<@HfT2_ol^ zUzeU1H|St_zwVJ}C&zpO>$?&zBY_hJgO;8zm@hT3Q$~x*J_IGexS+R&KYqhp{AL-O zB*NUjhHy%i^;;a*=nXlTU^c2+u{}8L#c7FW80rl#F$>PD=#5WN?lFAT4UMo5K+^!x zRYE7(Tms!LQt3UPX@q~-G6))`b3F>pBgP7VUE}M)i!FgS)V~IvDdawt4dM>cv;#W1 z)hxGQZYreG^z3lM+WB@mq{S$oeNKRsi|AkUww}#vd%X^PTH*FRgxTEGjRZ;&CAb%L zG_9u=8R8+(?x3-tZcut;0vv+AeoMcGv-Q$a zibVFwgktR8q3DkwZqg&Wyn1#>0F)jZa!T23ur>@#vEI6v)P+Md3@r;TXpYL8O(*n_ z9>JIST(r0zEam<$(p{8rQqSx6*V7X9DqcpazGcrZLHv;)URGhPui*;>jMAF7P;i^j zO5>*>I3E|(Jp`zpicf%^VCr=pE*TIOVSmn2n>T&))A@n;He)ekFb>|A>5oA+^ddex zrHB9+1P_J{;VDLplNFl+DL5$F$}RDSR~;=~YS5Qy!SB)BS_HXF%o^K3uT97F;T%R# zUn=bNCy(A?LzVY5L3ic$J@^hZCYd?57Vl!2Uaw>|aS z>gy-N{b#F_o|i*sRLvFW=2n%|BL^OVP{DVNTKFXvvku@XwvToK0s7d%HKzVG1oaj` z`fb#cKF2k^Q>D7PPrhvs*fCaDAw>K;-#SaIsThzg0(#hg(Fp`t0MVtO5+Ar=)xSY) zYUJ)L*ot?%^}Wx~!@$$V)SDiuvmkj5I%_W28e6cyYvPwZqhrQ=p30o{uU4NhMCg--x*5_-5zA;r?}wwTRx`nTzmq9$gJ$;C9}Wd`yI?*i zqK+gSCnAa0Ud7omYv}mQ(9#xlG~x&90HGF~Ya}``Ja4+3oNnxBll`4Ik-*H9F^03e zC^sZvKY~V7+lo8{#COf)2}u7cEQ*OI0k0DdelI-Is>J`4bju`YP^x3#i3PXplNjj? zC|gQZi3~2W!H06)o5md;cVYKxNes;Msc&*+g4RO7%?6q`Uhf<;+rvsH;1Z8##cQa z5`63qo0Uf~@=;$Xpqwwxn zsax4b?F;?!>4D3VL7F_c$J+>co83oPoe=F{$GsLS7_X@RLHV0Hp9eqMTKq*oe;Oek>b~_1Fv!DHLB4Jh*)3{=kvO-0- zM@+GlAtt(6L1&pLk;+TT+35jg@I`E5g3EZ@utE`hoVjgEZ>B%hIg^Q@3lG1Ode8U zv)VSYuQnr<)ezi=+nQB^Dx;IN4wtM%Nh7dhl%q!QsZr;_w&U(<{GyEC`yaKp?(Z4! z{$>mg>S@ts2YZcAdlM?`U?EHC%Mz%mfAZ3!!~6+^|C`LpSBij+d3p~v9_FuLf&hpd z#U{>k*l*|n)QwMw9ZdXWnt_iRd~CNlG3&%9htc1b`2pX|AvWUQxN#;a z)&QDE*sEM;i*tgSPNx-=X%~90W#B}@qQK5X0?!?-AV5#+AUEXA8DBLg2hPk)DM>); zk&5Q*$34f<0cAA+KbdP+&urZHyY`&1dYG)aeWWZylp@ohjSRdIfR~Clyc~47CotfM zcKLAN8Dl_NQ8?}=O&JdWgj^pA%~B39z0nOA$#~FU%EFPb+Cp9u@Ui9PSZNco3ttp+WNPplGA<@LZX^)(tvq@d>*M?YAU$t}!?qElU2BiV4*- z;iuy+C{!KLEvAGOb3MSwuRNqML}n%jzxg`&s!zL|9hB5#pic_TseK4KgFfp_IRPSbbg~3Ex$)TbBZ5nqx z_14h1K-JxRz0>u^OKHRik9>-Q}%~7bg%n&+ZMMRzBP9zL}f8c~TL7 zhN9q^=I;t-ZmR2U#GQPP7EbLwbYl0?jf(!#<76Ckv8OJS=6+Y#2P4+ZD5mTGp9lYM zY@10G=D77;#^m{t{ZOj!>xz*Q`?8-WA=%xaT~@tQ>^BuVqFY`s#~j>mdjIHkEUqf8u+@;|(uznwj+?5TI@iubtQZ7Y^lEn(zD^|=JfBCzSLD6bwL9zts@xFLBHW*N zxs%EsV~0bE=_O?os; zkLRDtIv80A_sw}<8}m^x0@GvWmj=H>hCD5a2Cm5vA6e#gN&Fr>tq5bm4PfMP7FCqr zp;)S%w9H+@Oz`gXU&Cl7W9sRmS`~dJH}d1Ib(UtSJPO@} zdM-r2T8)JMtH94*(kMQ3tS%s*A(Vu@(!{(Ve?Y%8FAh6U~1 zwux5?PV|Awtz-c-jP6mi<*VEJX50E);qT=z074Qsyfy{#0sTJnuLMWMUiWO%zYYbU zmfk;q-mkB}r!oNRHlW?Tz4Wv+BSXXRgM5MSNxG`MkLE^uj*2l5yW(z3V@w&VFQa`O z9gC}~&M?wqf4m_2xiP}@=*X^D4Brc|-mZD}Mj%No+nxK*S2s|@Q#eW0>l6he7lDQ( z^Vf|9iEF0#07Ku+w|6r;fK+)u!e=$T(u!ICyesapd3tI5)0Of@32x}K1{@Pm<^Q(? zv|?^^J2-?;CKzf2_oIqLpf(o*%mkDI-5)9-j07+L>FJ67*Vp?}5a3-B!eOq_=VWsv zF!`+rux#JX_fX-`zVSGSM9n_l-=XwxW9NoM&!WywwsabNCjHVS{YFJm#pB=Hj~u;z z^_=kn%j7!F2SIR9pJBr0gZ^M|KFbMV;#X=EWD0@#^;ikN4opS-;_*LIiCf=to6{0SB-9SP zZ>P6EI8V)opBc}9kC(mrhE(K3p@TF8Z4pxQm|@3XiHe8UnKD@C1aH|EFXAJ``!0m- z4BqH(l5VKJm+gNyu`?MW&OeH-y`Y@>I(D{#Fj8k*EoqV^1cHOEP!1H zRpsrGoo_rY7Hpv;f_Rw=6FD_tSM)}|yV;wuPAw#{hS*e*t+`DzwvE|o{6C{p+fJf8hmfwU4IaikOA3WKmY9=asF`6 zi}he;fj3gDOst3TNIb?}6tAn9*z*Ff0>e%PbNwb1zxFa_@%BhyxTE6E$oC@}T!&~t z$N$wI)xHN=pKKfil(0X<5A9WLrg~pzB!UG_(i!Br$E(1{R|ix|TA(KirE*%JOGnWT zlJ(o4$%r&1eRHcrpQd~j@^n_lxhJcH#l6j8hX?>4@c3_xuv z=(W`wzvMqP}~quwk7a85x>d=L-l5P0ly6cQ;($ zRiWJj4{~T|=>2;%TF2f$$JSqRp(y0sA5x#m`m=72u`X~KjkvnHdYPs1qnLF3_hmYZ z_RvqI*EbafCpx4}z>FpJnL;G#7|89-neiFX07;GoNAEd#|5MGpPb0^rx08#PoYDAz z8Lv(GaIo$4!NCDQF28Aa`EO~e*Cq?0BC^o*#;twSIMExhKB_5nqwqJ8@i#B_zmYow z*r0+W<29=HJX$@EAMkgr1|qP?%962P0|5gjAdYUMMsJaGW>*-E{oiw9<%x)sqBZ9W z@)_6jgIi?*QRA|k*Kh9*9E%4pwv~^4kgclT3gtJe(p0W4u6{npKJ{l$g30n89iq9v3g|o^m>zbxV0iSHoOFxP?+G zuU25rkEWbS9N%hs_XZI;ws>Ar3-I$wMhTljTj!7@MA@G7o2nMcy)2a05OORgQ|M_8oB4Jp zm20HwMFf+m+#ERr&}OQ^?VKJ}@qs$>?MjgkeX}U$`Q^)(RLuZDw;J;8-Q2Zu&MM~l zA#22Y6c7Hm9JMAR5&sPn)0l>+o3XE(DJ;sQ&7rl&1;FRP)3$<-yBm$=#Gi>zQvwi$ znB(Jv=>M+%6y<_oR{x)8FsG$Kfl!U7-($orwVo=me}t+ujxBS0Ay!grYt&G;p0Yn| z8?inKFUw;Le;B7B4PlwHIgArWl4tLx90{nlt8IRD>62kLdCK1QX2nn~?BRFw!v+?I z2{atX%{~!22Y8=n3YhDAHPrdJTm5(9=)K3D-LxhMP4~Lnu@M2)C8l}brmA_K0=$W3 zFV)#n4D$J5pLz;HC?*>act7g@xDHqgdSXHlU;{X4R`T}BW$czUBD?AAWNl{eE_;Yb z)G~5W7)SO`^f~DSPPAUF4yF&#E8ea&A)N2M`aq-|QmEspgp4+>h`+-lxe9@~n4z|w z94nhkzksNxA*5PNp57#whpN+)b9HNcpQGqGc=UGaboLe(&breeiUdIRkj(Ru8$Z~* zebtn$;3H){1`}A*+OCAh830JoEXV+3{{T^ZPAum`0VeK1&COxT;oQl)Rxt(ei$J2j zWI1>St+&)yaok@|Ux2r-Gd5`m980)Vc*)kOE94g%89+ShjQnx(Ip|GS>>&&w7C7?g zAeT*j?R%ZN#SDuAT-jgqwtE`gy8}1)x6r2Gl}xDrF2ybQ2p;J$=XdSe)T10w1B1ze zuWi7~I*;X^4`UJRujop|T0E~x|AfeZn@V_6-geiML4O`KAZDA_;O_G+p(f&UTh_kB zY(uU*8ApoF9a`=+?c0gsv+whwT;4BzecOOt5$T_@e=2L}deqvIVHjOGW%now91WZA zi2Gdg>jhz`him>TZc2wFv&RjFXO!Jz9_MqF)z4pI*M%f4?g$&m;(TWdft=$FR*;Yv z7j!M<^1R40`O2}ixdeq0dk9k_{U~5C#b33E^XDmUz#S{yE;^u;|9q1GM7THXwLS*h zhpoo}qO#wKK9SQm;y(*u;CQP`<_KW1cI-t-J-1roevm}4(V0BrXA!5is^+uIbF z#^^BDLl5)TGXTpJ-u2GTOqUaUaH8(}#FGR3M9Gze;B>}N6j{Kk&gcCGnsd$yRLq6V zENh94(uMD!{Da$hPqh+ps)3G|zCGJXxN^5g3O}PS+s{J2XsRN~d4ZgjFVo!&XE*EB zk+!LKn}mE-PwZ};Ywp-F6Lf@Z!OCzr=vGeqwsfbC9msh#IlBLbs(GVH5&bC~b6nZc ze9KW2^jgIpqciQ5S*CtbZ<_Dz&wLtfQ}0!9PpNBiZbgusBz^L?1-`}>Yg zP7Am~X-Tt5<|L>G#xI6%j*pMM!JAXU>EQZ?hK9z*(?BY9RR`75bBPz;SG^eXIBGNQ z?(Y2x8I9pbO30r-eR0nWiJ#;?*Z(Z^9p6ND z=F>b64e-?6+#f-ho>q4xTzw6HLm)zPxKFoa0YlZ7D22pJBsUsOd0F9SAB{Q^h;X!A z1`W|auYOl*W-l>wjl10GTdxI2iQ+9Q&HXZ`qM{*2JCE~F;|VW%VvruY%5nv;D7sM2 z^2Pqi67zkNr!k0`+r23wKB0hZcHor_*56Y3I;bOsQEuVe5koHt{o0-HIdAk|Pb3Ql zRIwTcYDJ)o78C5czhU0G(bXu8Znfnd=(Qbh-a_fulpxGHi4EsrexaZ2E*+x>O%pY* zhJyWJh)jF)rSKoYKqvo8J`S0w_l3a)^P6RVzAihOykex-XmBL*&+Nyk3*CaD4)P1X z(G%l-f^)B=180$zMH1Avzs}sh6CdYAn7TH-Jx*kadN$ku0Ch4Vk%GX2j36oz9e{X6 zZqx|Hri4zin|&fqAYfvlXH0P<5z;@-I^afK|6!N6*si3yMfk1`g1d zjM(eWs#;iCmME~QF0UzakwW$EmUk!vM(dgpP?^0jL@^kVbXm z6jW!3pN1Gws33gIlXx}J2Q|&ep@F|%!e29g-}-+@GcSahkVx?SEdfEI9xAgf2(&3k z6xn5XWK)0|h~(ia*?&8Rf2-kdP6iG*H)+Sy7=p9_aO%3aode+=KLiYuVi$n|3W}tL z!Z^&VY}F)d4+?$z=b!F_XMY$|+`95}Go$aUFMC4#RT^b4&MAx^{8wB5Dd0bg>4bm| z_Vz!9HoPTxMe=m5xCBRSjtuQ)OE9YI^@Z+Ofv?6&j;E%kP&*8$K*AZ`+V<{Mr{LVk zDvcMyce>WHY{INW*Nw^O$t=8xkS|13aCbRXEng_k_Fs*xHy4N=+PFPfv^!=6GFFL0 zL~?Zt zz+oLz_EiTrXSe!AWAT^7d{}$WylB`oeN3CE?=E+KoL}f9=S?Dd0S$z3Cty!yDtS)L`v$5i5uXjlkKJY(n>T^ivp)e#&?^_)R8iy zIF0;|%?kUf6IA4`*iG=-TN;ywTM7cHbn0HzC$ekIeC%D|Z;frct~o!x=pI|t-{Ry! zVKizT)v6%()LViU_Ad{T7N-=1$t_+LTW~YXBBw0 zyB1-gmn;vDEOg*NJMFzX$l}iZWkTWMko*|>jD6ox80l9h4VO4_O_YUm$sjGTfD$Ni ztF=vR$iRr4tr{UBU$##QeljD4T;Ob0{k-s;aUAkSZ*&&=ETw7uR0~{hN@uqiOWEAz zC+#l}XPj>_a?}Np8)E=rAtLYM#-xIQz%11*p@4LGq;Av}^NbHm_S^^V7VSUGAs{F4fOlv;oYUDL5Tc28OiM#DYg5=?gCBKeiDiF;sZs3 zPy=9PlmlXzL*@EjFkWy5XCT5^&^SuN2bJm{zi`<>@QD`C^KBmvC-1SW&!eT^k z7LR|{&+XpjIo~VAskd`E#sAp(Y2Ky#lZmk-9K^Gi^);Db7xZ_#F~bl|1YAI7m;@yy z^1J?hVK5l%xbY7!B_#z>R8%A+BxK~cM$|&}K3^Jz^o08Xg!>m47Yhr`*t_0l9 z&kPQBSm_X))virVO@0Ol;qWabB#Kob-|8TqBj`VP^4ULpAzX@d&ZV^~-5XFiKX`L^ zc<2ON6ewf{mVsVXXT9*XQ?A0tz&7&E#d>7?(Z1eJWTHkK^$U5)3byEA4 zwUJk_5my4a$TM^JPjjKEh(vK|_c#f0v8pq)AqEJ)0?p3ON=Qf)Hpx-5;f#Vze=_X@(T#60t|27>t zm-4v)erB3yB8-&l+@zEx!L0&3s^M>vcc2@sn!aow5uAA2QaH&IM_skS58NW^0E_vg z$q=mCy98xn#3BIcf2+1yxhL9eC}Zk!qihi^esmcTQL%*jeH{CNH;0I0%_ua5e#W&% zj5WYTi;_iGQw<#N7bMZ$kgA4kDXyH}>;_Yd_YV;@6GG<&Foi#Y%}qCJ<~y=Bg^mt) zU~V8h^o!^Q(Kb~m7Mk#Er#_!31)=@?BPf7B32PSKtrAEXc?uyFl0)@>un)-Z8z+iGX=raRQ zFRdK&Dh16`4h`{%*`&6PZ{PUEJBQ~We$AbR@^TR`Q50iBNXU1ZENv@z&wsSCnk2h! zh@7297xgQjl;8qt<8i$E**B=| za5cNQCoX-@h=eL4-_#YZ%AnQ}mk4kuwdoe0@LCmlTv0BF@`hH^5E~aww-L`yi1sg8 zi%@*Yx%C^A2Zi$BVgH8{_g}6B0tZ!NYUgd)1hF~+Mo0?@0I;lzJb6c>cX~^Fzx;pz z_$b(R;y*YO-TU;;zuu`;;Rkk?PVc;RGo-8jNp6KB*k*HB!?IV7QN2^zxy59n7w2ZE zqgC;;VD`UmQ^^Qk7(}~IqTw{z<{`lV0 zED3`?qZ8AQO%76$#v-Dw?LUaU2onml{Z|jnJDEz~N%PR;$-po%JiA4{j2sAZHL!e%=ak{I$)YuL45(6F>QGAJC!+<&(`ENFT zz=X7*uk}Kq!$XZG18F$coX;V;S4M=h%pbk4ZkMueNNzqfuMt5>Zuj78<2EzGg!@Hu zHe5}t_k!P%yQ6R?EuDvx0d}3;G*Z*^6^TIz#ll&|Ztw8ha0l*H0~tLS;&OG4!8X4c zy1JH$A$Q+p;2%(oH%hQL`iw_)hlB`{&q!@wwxH8woJ=jY35p|X(3AJ>bm7z~36FWz zS!A}Htw4F8i1t^@O)-1uzqhARY>aik(jH#DJAHLdeGkib__>1!=w*={t+kd8O&(dn zfst0h<8()Z)4~$Qc3obDqAP|_&LZ5&#};)nzG{RI;u&FGC!hNB;(iu7l+tKCnR?SI z{Y*d)@$Q|G-D~pI8OXYdZ>?fCuDIaw6j=Wkmk4Gz-xUtXNG-aJDPFZtF#_ew1j6WnYPa5&^D=)2YNDso+|9*FH4gR zm`;+j;+v$K9CTws3V77v4R=L$`V9;z0AMW5t9>c_yjo9C9&4aw0~8q53W1ovp%g77 znf}o_rZ@75W%Hu5(Zrnrq~@?_YwqZSlFb)&@}S!4y(x82)ii@8+^jFy8B_PU1L8NB z)r4Nz9@#dkysY6y3u>1XKT`7fRL~Tbxe5?<7^y-i<^0u)d}B3;7*6HKHFz zibdO;pg3(!!eW|@)LbN`0_gRW&|$0u5#P<2r{VlK5ubiI^QSm)5ApIIW4(eA z;tkq>e%vvTtQUN3czoP?C{b9%Y_eK90kJn^JFHrjNdCb)_c@jwjcGo|0b^sg*wQR@ zyW4uLB9;&uiSWEJ?o8N`0sXjk7VUsKU`6k4vjXdG$a3#}_M$y>q0})|Bz5$ZlykP4 z3*6i&S^VZ&Gm%EST@g8iHJtGz)L23d7_la_rHEo^-r1}dazot8(y5wB@f{~( z5WWh0D4YPH%r_efK76I95&z;xP$2;dI_gm`?-yv}is#jMlj~-7-N2gyfudC@EoVx|PIHY%d0oV1NQqUyisFj;ijLJHnOVH3ga@cb7?bd2!{Wm2qR&Zpe$Dtr*oPa&54y-Y)pUc+w`p zrCTJ7A4m~=v6Zk^L`pZW9Iq;wQ51=Y;q#-}xgJ?W^S&+3z59=d7!La7ezvtz?Bjc_ z(0yb2=xXy|lo}QPzkfGNi#Iiqbsx(8x=FCZYofYZ`B>Cs@U!qqzR$ev)om~(*6NT3 zz61WagHRB4*>n@#L6DEAq802u9pSd30o?%B$7%#}iGOI2S_Lf9JP}$i#em{xg$mr# z^XX3FnR!Ooe|ept=gagcC|E@#uqi*@|DKE(iJX#9-kF_sCI8`+q>ilSh&ySCVZ_>6 zj?8}8D-KWH9-BhH7fOU-SQ@jUwujXB<=iJH4eMDchig1J7kc2nQoqLFr^4Ruz+sk1Z-FJLX2Cr;H9 zWh)ioy3fjAdcPt_B|Gx$@c~tOdC{*3KeG=ccLjnTsAM(Q*4&5|;w`N-MPTp1B*5AFJ!?B-w5WqI+&kF{F{jn6$ z3*j_5fCoGnWv zf8AB)woNrxS@wlO(jbKW15`R6*?=W1=*H$@m*#!$PEB!lP=8gKesr=QCSrE9&e&od zskypzvcR{S_Twe3q5JndmW=6kFIJW;(V&PBxr;EGO65F z^K?G*#Lepqr(zR5wH9#*$^_<+=Rw`iq_a%Yp95{k>MakCg&E6V_-?2HvE#~EB}-Hi?T zwGSYMHbBqLWKr#!#LDqq<0PRD4M15!h{5)O%(6K?0*V|kl5kMFyb5+^7j6Eb%wm9I zdh%JgLw924_rCeY%b!xHKFvfmktP0e&o|pOqUyfg1RYt71Mt#v>5 zb2my`AH*z4?_S;c`Q!B^8~1%Z!=F|3t6sg=27*(WWSMs*u}a7=!?8#Gn5f&_aR%3S zu`!=Os=75L>>cFp3Zv<}!q6l4cK0Qzd?kP0J(*9{Z4*?^LpqVXG~oP+9qS=Xgv%WG zMSL^uu|0PUK|mh?biyJ{+W7Pi1|79$EN$M{1YZ>OOp{fYg=tNp_w^k5&5M@g$X_QW z#OGdlrX^ow#Y*ViDi-ATS91b0+yxK9EkewTsKxk*g} zmipaJG~fedHBedLBaHO-1@R-}`nc~rd8X|8WTo+16wU#RQLG0~03YJ-$FfcTdHL@& zKrVkWlcY2LosncP6zBH^D;oLd^5CEI`2R}$w{rYz9;|weh3sP_>>Ep4Ukz{6zNPj$ zIIJ8U?QuP+HXJ+Q{ARbsuF^3$C$`$vhjkjXcd)h;{l#bPiCL-J9)Y950Y&_*5WEtmNs2pul$1L zdgez7a8)`7dtQ3CAsdUX?Awf#uVz`82wivd>uy!@mtCFK$V7|mvI-ar+|Kb8V?d~9 z@;r8c7d*v1-3ucf+B)@769061{=l{Y3jk-@r^pV9;qNuo95;@&4g;JCPIVvxh_|y1 z6rX^7+%vH_WUh+FFvZmZEaOF(!cM|$IAfObXU>BIzP8c5cC!3|`o;p0!m2|<%dUbc z=qS}$rbZfs?BEfBa7e?~I0`WP4NJ{RLz;MZ z<&k=CB63IBX=4ebJ36m_KZ-uHZ+Xoo=$pb1`>%AF`R47|PUwt#p`#WHo%GUiNOZ5)d7AY3B}=wmc8 zDtSDo$i?UOf07#D6|NUfAp|_=8+@Tk#6mv3{9s3pGp}{zBWM zwm@Ax{*C_1!kWD?V~x+r|D@9lSPg;XAuEfT#Cn@YL| z!pCg99yiDeM|t0+Ir`>?%ttugyE-|AtF~Ke^^w8yN?$p~GfbEo#Ctja0;O$>>={4a zG=5_uyaj?$otyZv>TahssJ=J7gb<(q$ft0m>{< zj@q!F;=I)QC#@9Kzw94Hb4@$K@2a%H9Vt>5=`&%cPl1X z?~&uF@kr7)Fj#POv-QRv-0@rLATZkix0vqkyris82J}~_BeRm61TP#`Ed_bC#|Bpw zPR?^3+7F?pPNI^N_@sI--%enC%uHv-NFm>NbeI@BW0N8da?tO-pt`6R?Tx7 zX5}X$T^7)y=I199&ZncrfUSxQ(0QsH=J-=#u7QP_T1$4Kkql^Mh|R>}Wu~tT{5?rB zmQjbV*Xr{Tpt*wJG~y=pc+^V5=D0^PI=?J&o2}|ApFSo<+@i2e=6%~?aNptG_Isd} zufM19k7ioZXZCv5rN+p&iKU#6cC^^*7p`Ki*4LUbamaWZmxzz1`4*kg3{QK|LgQ0= z<(tm#H;=|z56qn#r?~1mOUr&F$DiQ6JYRIhomPeY^vdTCLm@;=vb<|E{2i@KY`?{$ z-qbn#)KVxd)v_(>g5)~vD2bDs>h7cxmzSrzzX+$i3Tc&pqj#w`Jy?+GV02@1Rj_2E zQQ;DEp~|ME5A}t76307r3HN!#f9y-_oW zhE81a#tYN<;ZvmTs10`}XXC?KSCeoww`lUbJ508IPq?@talX3H1D4mtG%yr8ljOO{ z5f9TZtPWn8CFEVe=o+_33{Ugqu4{{f9x@GmGChe)(>zPh@OM{HEOdo+rU6Z)Q|dnR zU22B6Z6j)%{MA6WQqldFSF0+h(X9|VYD8HB?A;k{t5w{}jTwu3j5y@Pe=jKdAbjV@ zd_vGwKeglY@#Dy(oi2<^wM60X2Oq8R*}ywm=D|)p*ZwUfJ!zVm;yR+BBf3l3@gS;~ zRBM9YX`L=#O;%ol9ji#M38K&ZZif1kvgaz)mcdT{drhW3G4Xrwv<&$E*V6w#T*g=8 zkqRpWC6{YwR+8x>?sOt0=|QD)6$!#kWuA@qsMbX1gzXwcqC}$V;dnpEDU94Te{6WR zp~11eo(l+q=-ck^cFif+!3t-4r)TZ+1PG;ZzI1Z2k}HZ`Xe&l~ilWn~)Vo6y-9!5f z*GF}0-^&CLR8-rCj^P^O_!=mebaj`e?1S{vh3=K4yXkL%DOg~`)cDy?Hg@ps?{zDE zVQdr|U+$OMhbqi4{8DWuYvswyR(yF36Ee=ww91Ylf_3?w=Ypf>EB7N94Iy9l3{=)d zT;ey^_m*$Asz04@)xA#5-?jf*+xGS`hHsfF-d(9cDKpnB%C@cpmwFD0(l$~Bhz;L` zj3Q`m6-&EHi#BHa3s^QkILPpDxTwZnWFz)dz<#KRI(%ft3W&vRjaKiVQ=VBCs@Lp^ ztI{dcC0tCHWp~GWEhJ=?Wg67lym{)5)%=SKol+MY~J(Nz5DBLmRdD4U>vkqwrq7(BN9zvf~)P8?F+HI^9)y5eNO0ACGTM^ z&Jb&EFJXc}ON?{VU6E*H*=lJo*E^_wpJyIYjC2my1Yl@uOsw3wpm-U{ofVeg zBg@fM7Ol;*@mP@?c(6$Wzq?FNeUlyWl3NP4N@DM98ci3u0^zmS&8GUAy9I#OaVDu)v zeSr(XE=maldNr3t2O($Y*eUbLYP&2Ai5(c+k)w zG|X73Ooro3CfU5lH3*vRQ{lw8tsiZqt|BYJy^&95Nt18BNtmD8Zo?PV_C0r2p=oN$ z8cm-WbHDk)I}Cd2FedS0G<)L9t*)NJhS4avjrG)Nn~woc3OI(~6!(r%W_*Sg(aMmX zeffF;1q*h@)GvnxSPG)pgj;9wIV_m+hBlm>NzCEvth&+X_Uj`37flW%M=qH0c||Fw zC^RE&i?boEKMz52=iY=4<5zPq|99mH#$ujPfsI)vhxQR8w-@=hLj=#gws_5pykNn) zp`r6P3H84NW`i*VF6n$g2@S|t4JUzB+Todw$LofvF0Rq`K1fBE*UaYkw(Y(nFZVhh zybFB4>k~UZn4>>={mQOrN!eY@MkT*GO+YxC%f_i|NwiJ6g!|^^bC^JvO$sx9u8_?U zbkh}mo`fiAKPEkYfl|ML7UKGx#YH_*oFXlB4;(d8CZW&u2gT}<3q`Kk!LkZeWR6Lk zyD`Fae-S92IsG7zP8{sN9o7OOlyBNMo{8spJ3q^0cJ7Q080uQ9)s>qv&Dm|~6f6tD z^(p4zLEm2Z%{@_+usb5uDEmK9l)sT#{@V}ocjm?af@J>o_+M`S6ZY~Shz+uf5na?# z<1@z!=#d&g?2mK3b0&U!gw7byBS&`f8*xVRLTn-|1VxM~@r$H>Gw`iSj1yMD$m36hg?R{*| zefiAj76=r{4Zb*kby<%-nUYJK;}^_bGEdZ+IX87Lk62lBbP)!$mnbYCuFp6bjPHl_ z?ACCC!#Kfp)mR`<>Jx~)*kKfZZ1HchdFm_3_8oQ~p^W;p9(J+zy0d1e{xrWJN=#WQ zk*)ElCSs>`_AbCMl565fni1i-(lFdeIrn4+{7{#VDgG4$``r)!(&x$y;IJ=U&#lP} z%N6Zd@rpY0aZuVhA}CN<&nK^)v<|Z7zb*cwIZRk0AMwMLQEg@w;h9O;*CRh{KN<;;8s<m1*CKon|`CP zJDC=?7|Zk*Z+9t?Z@nNHaX;V}c5|HMxGSwz9z&F1_->tJd!F9}Pzz+p%vkk^dF&o7 z4P9Y<8{M9)rbQC5L^Z9kGLvrMy0!Sl^EkDD#JSP#!q4&);6vRgHt8^XxM}KnZXB{1 zZ_^%!QOyz@Usr0H|@w95T+h-$o6JcNKm`el{nu^M0yCYl@Uw0+9 z_jl*9GHFD8Ogg|BOMkZ1qwmuDo(~gLtq94msUA4=GnFV2m_Xqpgor|uzL)v4iDOE5{~|4@i5_uV@K=hr%2b*l zmmdXPU!0<^5rb|#YFi1;5qs!SN|H*f=<-a|LEUOss{(N9_kQz8M;_Q3*?5b3&C=Tz zli`3)tyddkp~HZW^LJm%{{t%fA9MTP#@0Wi`t33OhuayO(JNnMJD9{&w-!_yn}6qaY62r&s6C_DSdTub z#yL|I^=(rHgLch^~HBfD&D4lVz zt#@PP9}XTHeD_%BCwvj!>Z0OH36Qryr?xNtFVf%Njpo11MmqEy-ir0?>s+8@26SjG zUnPE(t>>7aCN?;S?KyzX*b7z7i1hiy@=y0*sm!D*u1Gb!xR}k^336SZ?4n0BiVeeAu1Lw$=SXcR9eq1`D){1K+)g6YHX) zLtjm(`}!U0G5Tk{I0)2F4QW7o)+-MYNeZMX8;qT0Ia~xs z?c4)b5Ep))s(M~#GhK)|CKigsZ?GtA?RX2AcYYeQ?b*(&n%6X9+g@HEz&JBO+DLP) z*DKEqQEOlj$T1O1Akqx$wVsL6x|Ez);%;Fsc!8ao6M2q*#p46pm#mGFTt z+d!{_kbQsN9e~LTLf&8lrX9(?yFvX6C?Uv~_B6z?mp->&p**Hfte?Da9J}Y)P3Vi{ z&cJ$d8J5qRE|txPp&hn6Z-rilJ76>2$G!o|BmmiFPkppf_mC(?ocBlM4MLn~xV*%+ zbw(;>KM7ZApx*`6{BDJ+bo5@)NYi=<6PvQ^n$G#qe>UB44rEs7i zGzS4kAsJ1w^vuv;ebI$%?(k6Mq_ zbFYY11NCK_QU_j7q(VGxNbZ6RdBA{T24???T7|`jY=vj#&mgn>V)*k0bq*;<-lA(jxY?~0Rl>8&u=mD@{a_@jDBIurmR@TS7 zzFIcoZnV8zE%Whsjbg6cRKUe3vOBoxo@634Z>b}6bT3SSC2AlT(Bq|LYI-wyJ)T^d z)bs!yy&igZiMMOdEE2ZoPJP&a zleJEzyLM1^l7QX%7eCwoV?Fo>gZ~$EhJD-3Nr0kqYRj|U^)awT5wO{-5l`QmWsLHg zqdZBG_9(g0pLU+6*cL3CC}e3Yy3r~aDO@#ldm!+ecf+r~*>34KeU&V-al>dl=4Wu3 zrdQ0~c;xvN0>t>cbN?Vtxk9*ZlUAuw1EQ+DZfI!v(16TTwVSj>gtSV~!%bnd)G1UD ziI1MGnozmfA9BDLyhkFwLKuW=IIlH*U6lxJ`t5a9rp4fJLi^5YHb>1^?E8M5rB zZQ*+1mg%?>V`haxc4dm91n%Z}CfOl3@iv6S;hTcQF~E0f8if~s`BGanRk>BG{4|1B zgB7l^DP3>r@6^K{Y%!X8YY80|*?utMx$ObT5j~-VkaJ@*gjU)xC386e6UhfxO#@_oOPP|#CVs#YuS*oBu}9nKdL_s6`z#6j*^2MS)}zZY z+cgp_O}RbgAffQ$9k2Vc6bIDQAkernMC;k-k%pJ)z3a&fV~)K6;sM9AwrU*VYk&bQ zetQHjF4`z%<#rZI+djEi-0N3c>|QM_V)7+hNj+)c-@Ji=sWlF z%4&0f7HzVG7jM*dkDnV!awiS&Vgk4LD(?s+APaw+>q7G@EAR^6+r=^@@Ia?I*#X*D zj|ZOvqVhmZ$-dWq!0O**blgi?6-^rW>GnPtC%p5k$cTLvDCJNF4?TsFB6q*mbE3fC zL zh3E$=&a=vaT=-&;&l|IyN|!aVvz59mP)TDGD_ZyXAS(G2spqgl4&#J&>c-NeK!;n( zZ+5-B7wY-M1WRI&KoNGi>8O=bZ#x-57?FgC+X)!@-eiNnJhL{iO5SkAohEwp5RbZN#kCEg z_VQ<1?X+wpY54+0Zmx_;80l_v3agA~KX?X{M3Hcf4zhI7B4lx&CbeNYURqw~tF-8E zk9CU%R|$BXHks_wMd)Pg_6enZ7w7E5zmMJE^h558GkM4E5(oTYmCY-kcbdUh*M!!Y zjkB>&-}&7_a5!T1PQ^B1;477a*gfn3$@#|*Vbyo^ zf;?)5D4de2SENz!_qAd8OmL!~SD!&>lfxxy<=5jKS(c2*=a0nP+k`BStA4~E2YCk8 zOMM`gWMF?sI%wUci>p*#z!QTc&kwwfYmJa%AKb>p%z>+7#7K)38|Nj-Y+9xpv~d=oR+}&t*49kEey}50q z=F8SS4B|(w}w6Lq^LCsODxlcC{gd3yKZrs4nI;L##IpI(wB~} zsAH`sVdv6Yh{f33s^nl7RD&gOsbh$07mO=tJ%2;Mp=Vy>k&JmMP~P^&(wt_U*9tsE zz`@WZ_2otpnwo+6G9pyK!qz*I*0>?@Po}Z7pS;`N~Jzt7?C?mU% z$)lYvaMesNN{n3vQnbSO9&Neu}_0wTiyc$xlyRZR@Osc?JBAHkwV(dO|9+eTtR5OWu< z2I?#4$jYaSsSr(N!sxhHol=1p=!aMN!Cmg#gEL=z?V4uSwpf0g{|9jxZ}1#@uz$)KiXGzDG7BCr@XioO-sTORU+13uq$ma zR)_bxO?^X5&s6CO6`S<>%*}I-*#f~{Mf~7cqD@^yxh$KKvJdsBo<(Q@Ap<`dnB$+nD+XZJ6hy7`A9t@K_45!@Epe)~Ky z(%U=v13tTC2lPdgI4aE4Ert#IUphi=YVB;wt~#UBTzchGcg05q{a`BbrsOiLA1%jx z8=g*-YwKWC+O$UgxU4Ys_Z6=0o!nm)_wVrk9&KK5rp$BA5pi*#zi@W`@$l1A@(k21 zl+=%{hyV$o2KF@IdgJ}E^B^t#&@JgGw)jcuDV#9}mPs9L4OGx>=*m}#qd6E{)gLi8 z)4Pm2zp{;gnX9#|qU(|E_BeK}&Wq?gwsnd?8+^~a;d3CtEeevpa+Lkg^(Spd#6iFM zaBj4z$w%}dZP5?G_z_0AWPRFMN0d=qJ`H=%p7fRB0e#ZcLx*17N7;Tf?L8Tp46jrp z{2p=j#>O(>j^<4o4Vd?IH|V%U(WXsPa?;kX{mq9R*o!*5aK@-~p$w#ru#1(7xH>3g z)YGNB13Fw+2xi$Mq05wk!yR2OYi#n$Rtlsj`Ft8U>uCLi0YWBF;a@Vl*Pp_Cg_N62 z^=fK>@Xv_4Sb%U|%{5t+jC5L#0svKFk59T{3XpYa-V7@_3Caj4R8|7*O4vW<#cFHa z-i?aXfRUOyH8W>!hZfoN+;8RtS7_rr6%}tF_{ITtp_tjAfQXK&>(mb2&m|m)tj+og z#9#18M##I|$Ky&v+LY$+t$ay3n_$kA;T1FL`L-y-0pJH!=bt(Bxs6e5bFV4fS76Ws0(uwh4RusVCA zrZvB6xjG}PU|Hm*EL6XYA(8E> z>h0s>f#U98-vfl$k>gG9Uuw@dJBcZ{WZV p{PiEC^e-g!KYsYPbeHyiU|V}lfm%^@Lm&l6PFnd%k)-k4{{pX)h|~Z8 literal 0 HcmV?d00001 diff --git a/assets/r2/index_rule.png b/assets/r2/index_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..e903a1945f97119eaff59987f36e9333c11c6d1e GIT binary patch literal 27317 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 literal 0 HcmV?d00001 diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md new file mode 100644 index 0000000..9598c23 --- /dev/null +++ b/community/CloudflareR2.md @@ -0,0 +1,144 @@ +--- +layout: page +title: Hosting BlueMap on Cloudflare R2 +parent: Community Guides +nav_order: 15 +--- + +# How to host BlueMap on Cloudflare R2 +{: .no_toc } + +1. TOC +{:toc} + +## What is Cloudflare R2? + +Cloudflare R2 is a service that allows you to host files on Cloudflare's network. With a couple of tweaks you can host static websites such as BlueMap on Cloudflare R2. Please bear in mind, that Cloudflare R2 costs money. + +## What do you need for this? + +- Cloudflare account +- Domain you own & is connected with Cloudflare +- Credit card/prepaid card you have +- a completly rendered BlueMap map (you can use the CLI or the docker container for that) - this is intended as a one-time upload for a map where further changes are unnecessary +- rclone on the system you've rendered the map on + + +## Adding a domain to Cloudflare + +(You can skip this part and go to Setting Zero Trust Dashboard part) + +Go to Websites, click on "Add a site" then write your domain name. + +1. "Select your plan" + - You can choose Free plan at the bottom. + +2. "Review DNS records" + - You can skip it because we don't need to set a dns for this method. + +3. "Change your nameservers" + - Go to the site you bought your domain and change nameservers to Cloudflare's nameservers. + + +## Creating a bucket & uploading files with rclone + +1. Go to R2, click on "Create bucket" then write your bucket name. + +2. In your new bucket go to settings. + +3. Scroll to Public Access / Custom Domains and click on "Connect Domain". Enter the domain you want to use for BlueMap and confirm the changes. + +4. (optional) Scroll down and edit the "Default Multipart Abort Rule" by clicking on the three dots and then "Edit". Set the "Multipart Abort Rule" to 1 day. + +5. Go back to the R2 overview page and click on "Manage R2 Api Tokens". Click on "Create API Token" and give it a name. Give it "Admin Read & Write" permissions & create the token. Keep this page open for the rclone configuration. + +## Uploading files with rclone + +1. Open a terminal and run `rclone config` to configure rclone. + 1. Choose "n" for new remote. + 2. Choose a name for the remote, e.g. `R2`. + 3. Choose `Amazon S3 Compliant Storage Providers` as the storage provider. (As of time of writing option `4`.) + 4. Choose `Cloudflare R2 Storage` as the provider. (As of time of writing option `6`.) + 5. Choose `Enter AWS credentials in the next step.` + 6. Copy the `Access Key ID` and `Secret Access Key` from the R2 API Token page to the terminal. + 7. Choose the only possible region. + 8. Copy the endpoint from the R2 API token page to the terminal. + 9. Do not edit the advanced config. + 10. Check if the configuration is correct & confirm. + +2. Navigate in the terminal to the directory where your BlueMap *web* files are located. You should be in the directory that contains the file `index.html`. + +3. Run the following command to upload the files to your R2 bucket: + ```bash + rclone sync . R2:drehmal-bluemap/ --transfers=60 --checkers=200 -P + ``` + - `rclone` - the program you are calling + - `sync` - the command to synchronize files - files which are not present in the destination will be copied there and files which are not present in the source will be deleted in the destination + - `.` - the current directory + - `R2:bluemap/` - the remote you configured in the rclone configuration plus the name of your bucket + - `--transfers=60` - the number of parallel transfers - BlueMap consists of a lot of small files, so a high number of transfers is beneficial + - `--checkers=200` - the number of parallel checks - BlueMap consists of a lot of small files, so a high number of checks is beneficial + - `-P` - shows you the progress + +4. While the files are uploading you can continue with the next step. + +## Making necessary configurations + +1. Go to your domain inside the Cloudlflare dashboard. Click on "Rules" and then "Transform Rules" - make sure you are in the Rewrite URL tab. Click on "Create Rule". + +2. Give the Rule a name, e.g. `BlueMap: Index`. + 1. Select `Custom filter expression` + 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. + 2. Click on `And` to add another rule. + 3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `/`. + 2. Further down under Path select `Rewrite to...`. + 1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, "index.html")`. + 3. It should look similiar to this: ![Screenshot of the index rule in Cloudflare]({{site.baseurl}}/assets/r2/index_rule.png) + 4. Save the rule. This rule allows you to open the BlueMap without the need to enter `index.html` at the end of the URL. + +3. Create another Transform rule here and give it a name, e.g. `BlueMap: gzip` + 1. Select `Custom filter expression` + 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. + 2. Click on `And` to add another rule. + 3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `textures.json`. + 4. Click on `Or` to add another rule. + 5. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. + 6. Click on `And` to add another rule. + 7. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `.prbm`. + 2. Further down under Path select `Rewrite to...`. + 1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, ".gz")`. + 3. It should look similiar to this: ![Screenshot of the gzip rule in Cloudflare]({{site.baseurl}}/assets/r2/gzip_rule.png) + 4. Save the rule. This rule allows Cloudflare to serve the compressed files when the textures or the .prbm files are requested. + +4. Now click on the `Modify Response Header` tab and create a new rule. + 1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. + 2. Select `Custom filter expression` + 1. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `.gz`. + 2. Click on `Or` to add another rule. + 3. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `textures.json`. + 4. Click on `Or` to add another rule. + 5. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `.prbm`. + 3. Further down under `Modify response header`. + 1. In the first field select `Set static`. In the Header name field enter `Content-Encoding`. In the Header value field enter `gzip`. + 4. It should look similiar to this: ![Screenshot of the Content-Encoding rule in Cloudflare]({{site.baseurl}}/assets/r2/encoding_rule.png) + 5. Save the rule. This rule marks the compressed files as compressed, so your browser knows how to handle them when requested. + + +## Making optional configurations + +Every time a file is requested from your bucket that counts as an operation. Every operation above the free limit induces a cost. To reduce the number of requests to your bucket you can set up a cache policy. This will cache the files on Cloudflare's edge servers and serve them from there. This will reduce the number of requests to your bucket and thus reduce the costs. + +1. Go to your domain inside the Cloudlflare dashboard. Click on "Rules" and then "Cache Rules". Click on "Create Rule". + 1. Give the Rule a name, e.g. `BlueMap: Cache`. + 2. Select `Custom filter expression` + 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. + 3. Further down under `Cache eligibility` select `Eligible for cache`. + 4. Further down under `Edge TTL` click on `Add Setting`. + 1. Now select `Ignore cache-control header and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. + 2. This rule will cache all files for up to 1 year on Cloudflare's edge servers and serve them from there instead of requesting them from your bucket. This will reduce the number of requests to your bucket and thus reduce the costs. + 5. Further down under `Browser TTL` click on `Add Setting`. + 1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. + 2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have a lot of visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map they can do a hard refresh (Ctrl + F5) to force the browser to load the files from the server. + 6. It should look similiar to this: ![Screenshot of the Cache rule in Cloudflare]({{site.baseurl}}/assets/r2/cache_rule.png) + 7. Save the rule. +2. If you have a paid plan you can potentially use "Custom error responses" to change 404 errors to 204 errors as suggested by the [External Webserver documentation]({{site.baseurl}}/wiki/webserver/ExternalWebserversFile). This is however not necessary for BlueMap to work. Since this documentation is about Cloudflare R2 and the free domain plan, I will not go into detail about this. \ No newline at end of file From c314b7cdb2771a34aa8ccaa79016bb4b5dacdd62 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:00:48 +0200 Subject: [PATCH 2/8] typography fixes --- community/CloudflareR2.md | 168 +++++++++++++++++++------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index 9598c23..850ab58 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -13,14 +13,14 @@ nav_order: 15 ## What is Cloudflare R2? -Cloudflare R2 is a service that allows you to host files on Cloudflare's network. With a couple of tweaks you can host static websites such as BlueMap on Cloudflare R2. Please bear in mind, that Cloudflare R2 costs money. +Cloudflare R2 is a service that allows you to host files on Cloudflare's network. With a couple of tweaks, you can host static websites such as BlueMap on Cloudflare R2. Please bear in mind that Cloudflare R2 costs money. ## What do you need for this? - Cloudflare account - Domain you own & is connected with Cloudflare - Credit card/prepaid card you have -- a completly rendered BlueMap map (you can use the CLI or the docker container for that) - this is intended as a one-time upload for a map where further changes are unnecessary +- a completely rendered BlueMap map (you can use the CLI or the docker container for that) — this is intended as a one-time upload for a map where further adjustments are unnecessary - rclone on the system you've rendered the map on @@ -28,117 +28,117 @@ Cloudflare R2 is a service that allows you to host files on Cloudflare's network (You can skip this part and go to Setting Zero Trust Dashboard part) -Go to Websites, click on "Add a site" then write your domain name. +Go to Websites, click on “Add a site” then write your domain name. -1. "Select your plan" - - You can choose Free plan at the bottom. +1. “Select your plan” +    - You can choose Free plan at the bottom. -2. "Review DNS records" - - You can skip it because we don't need to set a dns for this method. +2. “Review DNS records” +    - You can skip it because we don't need to set a DNS for this method. -3. "Change your nameservers" - - Go to the site you bought your domain and change nameservers to Cloudflare's nameservers. +3. “Change your nameservers” +    - Go to the site you bought your domain and change nameservers to Cloudflare's nameservers. ## Creating a bucket & uploading files with rclone -1. Go to R2, click on "Create bucket" then write your bucket name. +1. Go to R2, click on “Create bucket” then write your bucket name. -2. In your new bucket go to settings. +2. In your new bucket, go to settings. -3. Scroll to Public Access / Custom Domains and click on "Connect Domain". Enter the domain you want to use for BlueMap and confirm the changes. +3. Scroll to Public Access / Custom Domains and click on “Connect Domain”. Enter the domain you want to use for BlueMap and confirm the changes. -4. (optional) Scroll down and edit the "Default Multipart Abort Rule" by clicking on the three dots and then "Edit". Set the "Multipart Abort Rule" to 1 day. +4. (optional) Scroll down and edit the “Default Multipart Abort Rule” by clicking on the three dots and then “Edit”. Set the “Multipart Abort Rule” to 1 day. -5. Go back to the R2 overview page and click on "Manage R2 Api Tokens". Click on "Create API Token" and give it a name. Give it "Admin Read & Write" permissions & create the token. Keep this page open for the rclone configuration. +5. Go back to the R2 overview page and click on “Manage R2 API Tokens”. Click on “Create API Token” and give it a name. Give it “Admin Read & Write” permissions & create the token.  Keep this page open for the rclone configuration. ## Uploading files with rclone 1. Open a terminal and run `rclone config` to configure rclone. - 1. Choose "n" for new remote. - 2. Choose a name for the remote, e.g. `R2`. - 3. Choose `Amazon S3 Compliant Storage Providers` as the storage provider. (As of time of writing option `4`.) - 4. Choose `Cloudflare R2 Storage` as the provider. (As of time of writing option `6`.) - 5. Choose `Enter AWS credentials in the next step.` - 6. Copy the `Access Key ID` and `Secret Access Key` from the R2 API Token page to the terminal. - 7. Choose the only possible region. - 8. Copy the endpoint from the R2 API token page to the terminal. - 9. Do not edit the advanced config. - 10. Check if the configuration is correct & confirm. +   1. Choose “n” for new remote. +   2. Choose a name for the remote, e.g. `R2`. +   3. Choose `Amazon S3 Compliant Storage Providers` as the storage provider. (As of the time of writing, option `4`.) +   4. Choose `Cloudflare R2 Storage` as the provider. (As of the time of writing, option `6`.) +   5. Choose `Enter AWS credentials in the next step.` +   6. Copy the `Access Key ID` and `Secret Access Key` from the R2 API Token page to the terminal. +   7. Choose the only possible region. +   8. Copy the endpoint from the R2 API token page to the terminal. +   9. Do not edit the advanced config. +   10. Check if the configuration is correct & confirm. 2. Navigate in the terminal to the directory where your BlueMap *web* files are located. You should be in the directory that contains the file `index.html`. 3. Run the following command to upload the files to your R2 bucket: - ```bash - rclone sync . R2:drehmal-bluemap/ --transfers=60 --checkers=200 -P - ``` - - `rclone` - the program you are calling - - `sync` - the command to synchronize files - files which are not present in the destination will be copied there and files which are not present in the source will be deleted in the destination - - `.` - the current directory - - `R2:bluemap/` - the remote you configured in the rclone configuration plus the name of your bucket - - `--transfers=60` - the number of parallel transfers - BlueMap consists of a lot of small files, so a high number of transfers is beneficial - - `--checkers=200` - the number of parallel checks - BlueMap consists of a lot of small files, so a high number of checks is beneficial - - `-P` - shows you the progress - -4. While the files are uploading you can continue with the next step. +   ```bash +   rclone sync . R2:drehmal-bluemap/ --transfers=60 --checkers=120 -P +   ``` +   - `rclone` — the program you are calling +   - `sync` — the command to synchronize files — files which are not present in the destination will be copied there and files which are not present in the source will be deleted in the destination +   - `.` — the current directory +   - `R2:bluemap/` — the remote you configured in the rclone configuration plus the name of your bucket +   - `--transfers=60` — the number of parallel transfers — BlueMap consists of numerous small files, so a high number of transfers is beneficial +   - `--checkers=120` — the number of parallel checks — BlueMap consists of numerous small files, so a high number of checks is beneficial. Checkers compare your local files to those remote. +   - `-P` — shows you the progress + +4. While the files are uploading, you can continue with the next step. ## Making necessary configurations -1. Go to your domain inside the Cloudlflare dashboard. Click on "Rules" and then "Transform Rules" - make sure you are in the Rewrite URL tab. Click on "Create Rule". +1. Go to your domain inside the Cloudflare dashboard. Click on “Rules” and then “Transform Rules” — make sure you are in the Rewrite URL tab. Click on “Create Rule”. 2. Give the Rule a name, e.g. `BlueMap: Index`. - 1. Select `Custom filter expression` - 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. - 2. Click on `And` to add another rule. - 3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `/`. - 2. Further down under Path select `Rewrite to...`. - 1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, "index.html")`. - 3. It should look similiar to this: ![Screenshot of the index rule in Cloudflare]({{site.baseurl}}/assets/r2/index_rule.png) - 4. Save the rule. This rule allows you to open the BlueMap without the need to enter `index.html` at the end of the URL. +   1. Select `Custom filter expression` +      1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`. +      2. Click on `And` to add another rule. +      3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field, enter `/`. +   2. Further down under Path, select `Rewrite to...`. +      1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, "index.html")`. +   3. It should look similar to this: ![Screenshot of the index rule in Cloudflare]({{site.baseurl}}/assets/r2/index_rule.png) +   4. Save the rule. This rule allows you to open the BlueMap without the need to enter `index.html` at the end of the URL. 3. Create another Transform rule here and give it a name, e.g. `BlueMap: gzip` - 1. Select `Custom filter expression` - 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. - 2. Click on `And` to add another rule. - 3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `textures.json`. - 4. Click on `Or` to add another rule. - 5. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. - 6. Click on `And` to add another rule. - 7. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field enter `.prbm`. - 2. Further down under Path select `Rewrite to...`. - 1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, ".gz")`. - 3. It should look similiar to this: ![Screenshot of the gzip rule in Cloudflare]({{site.baseurl}}/assets/r2/gzip_rule.png) - 4. Save the rule. This rule allows Cloudflare to serve the compressed files when the textures or the .prbm files are requested. +   1. Select `Custom filter expression` +      1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`. +      2. Click on `And` to add another rule. +      3. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field, enter `textures.json`. +      4. Click on `Or` to add another rule. +      5. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`. +      6. Click on `And` to add another rule. +      7. In the first field select `URI Path` and in the Operator field select `ends with`. In the value field, enter `.prbm`. +   2. Further down under Path, select `Rewrite to...`. +      1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, ".gz")`. +   3. It should look similar to this: ![Screenshot of the gzip rule in Cloudflare]({{site.baseurl}}/assets/r2/gzip_rule.png) +   4. Save the rule. This rule allows Cloudflare to serve the compressed files when the textures or the .prbm files are requested. 4. Now click on the `Modify Response Header` tab and create a new rule. - 1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. - 2. Select `Custom filter expression` - 1. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `.gz`. - 2. Click on `Or` to add another rule. - 3. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `textures.json`. - 4. Click on `Or` to add another rule. - 5. In the first field select `URI Path`. In the Operator field select `ends with`. In the value field enter `.prbm`. - 3. Further down under `Modify response header`. - 1. In the first field select `Set static`. In the Header name field enter `Content-Encoding`. In the Header value field enter `gzip`. - 4. It should look similiar to this: ![Screenshot of the Content-Encoding rule in Cloudflare]({{site.baseurl}}/assets/r2/encoding_rule.png) - 5. Save the rule. This rule marks the compressed files as compressed, so your browser knows how to handle them when requested. +   1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. +   2. Select `Custom filter expression` +      1. In the first field, select `URI Path`. In the Operator field, select `ends with`. In the value field, enter `.gz`. +      2. Click on `Or` to add another rule. +      3. In the first field, select `URI Path`. In the Operator field, select `ends with`. In the value field, enter `textures.json`. +      4. Click on `Or` to add another rule. +      5.  In the first field, select `URI Path`. In the Operator field, select `ends with`. In the value field, enter `.prbm`. +   3. Further down under `Modify response header`. +      1. In the first field, select `Set static`. In the Header name field, enter `Content-Encoding`. In the Header value field, enter `gzip`. +   4. It should look similar to this: ![Screenshot of the Content-Encoding rule in Cloudflare]({{site.baseurl}}/assets/r2/encoding_rule.png) +   5. Save the rule. This rule marks the compressed files as compressed, so your browser knows how to handle them when requested. ## Making optional configurations -Every time a file is requested from your bucket that counts as an operation. Every operation above the free limit induces a cost. To reduce the number of requests to your bucket you can set up a cache policy. This will cache the files on Cloudflare's edge servers and serve them from there. This will reduce the number of requests to your bucket and thus reduce the costs. - -1. Go to your domain inside the Cloudlflare dashboard. Click on "Rules" and then "Cache Rules". Click on "Create Rule". - 1. Give the Rule a name, e.g. `BlueMap: Cache`. - 2. Select `Custom filter expression` - 1. In the first field select `Hostname`. In the Operator field select `equals`. In the value field enter the domain you are using for BlueMap, e.g. `map.example.com`. - 3. Further down under `Cache eligibility` select `Eligible for cache`. - 4. Further down under `Edge TTL` click on `Add Setting`. - 1. Now select `Ignore cache-control header and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. - 2. This rule will cache all files for up to 1 year on Cloudflare's edge servers and serve them from there instead of requesting them from your bucket. This will reduce the number of requests to your bucket and thus reduce the costs. - 5. Further down under `Browser TTL` click on `Add Setting`. - 1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. - 2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have a lot of visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map they can do a hard refresh (Ctrl + F5) to force the browser to load the files from the server. - 6. It should look similiar to this: ![Screenshot of the Cache rule in Cloudflare]({{site.baseurl}}/assets/r2/cache_rule.png) - 7. Save the rule. -2. If you have a paid plan you can potentially use "Custom error responses" to change 404 errors to 204 errors as suggested by the [External Webserver documentation]({{site.baseurl}}/wiki/webserver/ExternalWebserversFile). This is however not necessary for BlueMap to work. Since this documentation is about Cloudflare R2 and the free domain plan, I will not go into detail about this. \ No newline at end of file +Every time a file is requested from your bucket, that counts as an operation. Every operation above the free limit induces a cost. To reduce the number of requests to your bucket, you can set up a cache policy. This will cache the files on Cloudflare's edge servers and serve them from there. This will reduce the number of requests to your bucket and thus reduce the costs. + +1. Go to your domain inside the Cloudflare dashboard. Click on “Rules” and then “Cache Rules”. Click on “Create Rule”. +   1. Give the Rule a name, e.g. `BlueMap: Cache`. +   2. Select `Custom filter expression` +      1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`. +   3. Further down under `Cache eligibility` select `Eligible for cache`. +   4. Further down under `Edge TTL` click on `Add Setting`. +      1. Now select `Ignore cache-control header and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. +      2. This rule will cache all files for up to 1 year on Cloudflare's edge servers and serve them from there instead of requesting them from your bucket. This will reduce the number of requests to your bucket and thus reduce the costs. +   5. Further down under `Browser TTL` click on `Add Setting`. +      1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. +      2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have many visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map, they can do a hard refresh (Ctrl + F5) to force the browser to load the files from the server. +   6. It should look similar to this: ![Screenshot of the Cache rule in Cloudflare]({{site.baseurl}}/assets/r2/cache_rule.png) +   7. Save the rule. +2. If you have a paid plan, you can potentially use “Custom error responses” to change 404 errors to 204 errors as suggested by the [External Web server documentation]({{site.baseurl}}/wiki/webserver/ExternalWebserversFile). This is however, not necessary for BlueMap to work. Since this documentation is about Cloudflare R2 and the free domain plan, I will not go into detail about this. \ No newline at end of file From 638def7f7d232df334d2d5ea68a71a74685b7942 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:07:20 +0200 Subject: [PATCH 3/8] fix grammar Co-authored-by: TechnicJelle <22576047+TechnicJelle@users.noreply.github.com> --- community/CloudflareR2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index 850ab58..b352901 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -37,7 +37,7 @@ Go to Websites, click on “Add a site” then write your domain name.     - You can skip it because we don't need to set a DNS for this method. 3. “Change your nameservers” -    - Go to the site you bought your domain and change nameservers to Cloudflare's nameservers. +    - Go to the site where you bought your domain and change nameservers to Cloudflare's nameservers. ## Creating a bucket & uploading files with rclone From 1643fa5347bf638124c8c329655e404e0739946f Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:30:25 +0200 Subject: [PATCH 4/8] clarify storage type Co-authored-by: TechnicJelle <22576047+TechnicJelle@users.noreply.github.com> --- community/CloudflareR2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index b352901..2da0ce7 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -22,7 +22,7 @@ Cloudflare R2 is a service that allows you to host files on Cloudflare's network - Credit card/prepaid card you have - a completely rendered BlueMap map (you can use the CLI or the docker container for that) — this is intended as a one-time upload for a map where further adjustments are unnecessary - rclone on the system you've rendered the map on - +- a rendered bluemap, which uses FILE storage, not SQL storage ## Adding a domain to Cloudflare From 622788ebc5eb666d58ae0683b546349fad356524 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:40:19 +0200 Subject: [PATCH 5/8] address feedback towards information order/clarity --- community/CloudflareR2.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index 2da0ce7..1c9a11f 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -11,18 +11,21 @@ nav_order: 15 1. TOC {:toc} +## For whom is this guide? + +This guide is for people who want a static map, which they rarely if ever want to update. It is not intended for a live map of a server. + ## What is Cloudflare R2? Cloudflare R2 is a service that allows you to host files on Cloudflare's network. With a couple of tweaks, you can host static websites such as BlueMap on Cloudflare R2. Please bear in mind that Cloudflare R2 costs money. ## What do you need for this? -- Cloudflare account -- Domain you own & is connected with Cloudflare -- Credit card/prepaid card you have -- a completely rendered BlueMap map (you can use the CLI or the docker container for that) — this is intended as a one-time upload for a map where further adjustments are unnecessary -- rclone on the system you've rendered the map on -- a rendered bluemap, which uses FILE storage, not SQL storage +- a Cloudflare account +- a Domain you own & is connected with Cloudflare +- a Credit card/prepaid card you have +- a rendered BlueMap, which uses FILE storage, not SQL storage +- rclone installed on the system you've rendered the map on ## Adding a domain to Cloudflare @@ -42,13 +45,13 @@ Go to Websites, click on “Add a site” then write your domain name. ## Creating a bucket & uploading files with rclone -1. Go to R2, click on “Create bucket” then write your bucket name. +1. Go to R2, click on “Create bucket” then write your bucket name, e.g. `bluemap`. 2. In your new bucket, go to settings. 3. Scroll to Public Access / Custom Domains and click on “Connect Domain”. Enter the domain you want to use for BlueMap and confirm the changes. -4. (optional) Scroll down and edit the “Default Multipart Abort Rule” by clicking on the three dots and then “Edit”. Set the “Multipart Abort Rule” to 1 day. +4. (optional) Scroll down and edit the “Default Multipart Abort Rule” by clicking on the three dots and then “Edit”. Set the “Multipart Abort Rule” to 1 day. This will cause multipart uploads to be aborted after 1 day if they are not completed. This is useful if a larger file upload is interrupted. It will remove the incomplete file after 1 day. 5. Go back to the R2 overview page and click on “Manage R2 API Tokens”. Click on “Create API Token” and give it a name. Give it “Admin Read & Write” permissions & create the token.  Keep this page open for the rclone configuration. @@ -70,7 +73,7 @@ Go to Websites, click on “Add a site” then write your domain name. 3. Run the following command to upload the files to your R2 bucket:    ```bash -   rclone sync . R2:drehmal-bluemap/ --transfers=60 --checkers=120 -P +   rclone sync . R2:bluemap/ --transfers=60 --checkers=120 -P    ```    - `rclone` — the program you are calling    - `sync` — the command to synchronize files — files which are not present in the destination will be copied there and files which are not present in the source will be deleted in the destination @@ -86,7 +89,7 @@ Go to Websites, click on “Add a site” then write your domain name. 1. Go to your domain inside the Cloudflare dashboard. Click on “Rules” and then “Transform Rules” — make sure you are in the Rewrite URL tab. Click on “Create Rule”. -2. Give the Rule a name, e.g. `BlueMap: Index`. +2. Give the Rule a name, e.g. `BlueMap: Index`. This rule will allow you to open the BlueMap domain without the need to enter `index.html` at the end of the URL.    1. Select `Custom filter expression`       1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`.       2. Click on `And` to add another rule. @@ -94,9 +97,9 @@ Go to Websites, click on “Add a site” then write your domain name.    2. Further down under Path, select `Rewrite to...`.       1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, "index.html")`.    3. It should look similar to this: ![Screenshot of the index rule in Cloudflare]({{site.baseurl}}/assets/r2/index_rule.png) -   4. Save the rule. This rule allows you to open the BlueMap without the need to enter `index.html` at the end of the URL. +   4. Save the rule. -3. Create another Transform rule here and give it a name, e.g. `BlueMap: gzip` +3. Create another Transform rule here and give it a name, e.g. `BlueMap: gzip`. This rule allows Cloudflare to serve the compressed files when the textures or the .prbm files are requested.    1. Select `Custom filter expression`       1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`.       2. Click on `And` to add another rule. @@ -108,10 +111,10 @@ Go to Websites, click on “Add a site” then write your domain name.    2. Further down under Path, select `Rewrite to...`.       1. In the first field select `Dynamic` and in the second field enter `concat(http.request.uri.path, ".gz")`.    3. It should look similar to this: ![Screenshot of the gzip rule in Cloudflare]({{site.baseurl}}/assets/r2/gzip_rule.png) -   4. Save the rule. This rule allows Cloudflare to serve the compressed files when the textures or the .prbm files are requested. +   4. Save the rule. 4. Now click on the `Modify Response Header` tab and create a new rule. -   1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. +   1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. This rule marks the compressed files as compressed, so your browser knows how to handle them when it requests them.    2. Select `Custom filter expression`       1. In the first field, select `URI Path`. In the Operator field, select `ends with`. In the value field, enter `.gz`.       2. Click on `Or` to add another rule. @@ -121,7 +124,7 @@ Go to Websites, click on “Add a site” then write your domain name.    3. Further down under `Modify response header`.       1. In the first field, select `Set static`. In the Header name field, enter `Content-Encoding`. In the Header value field, enter `gzip`.    4. It should look similar to this: ![Screenshot of the Content-Encoding rule in Cloudflare]({{site.baseurl}}/assets/r2/encoding_rule.png) -   5. Save the rule. This rule marks the compressed files as compressed, so your browser knows how to handle them when requested. +   5. Save the rule. ## Making optional configurations From 13712f27c0698745c977a458c67be43f3fd8a75e Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Tue, 20 Aug 2024 06:14:21 +0000 Subject: [PATCH 6/8] clarify force reload --- community/CloudflareR2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index 1c9a11f..0a2c154 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -141,7 +141,7 @@ Every time a file is requested from your bucket, that counts as an operation. Ev       2. This rule will cache all files for up to 1 year on Cloudflare's edge servers and serve them from there instead of requesting them from your bucket. This will reduce the number of requests to your bucket and thus reduce the costs.    5. Further down under `Browser TTL` click on `Add Setting`.       1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. -      2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have many visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map, they can do a hard refresh (Ctrl + F5) to force the browser to load the files from the server. +      2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have many visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map, they can do a hard refresh (Ctrl + F5) to force the browser to load the static files from the server AND click on the "Update Map" button in the menu to reload the map tiles.    6. It should look similar to this: ![Screenshot of the Cache rule in Cloudflare]({{site.baseurl}}/assets/r2/cache_rule.png)    7. Save the rule. 2. If you have a paid plan, you can potentially use “Custom error responses” to change 404 errors to 204 errors as suggested by the [External Web server documentation]({{site.baseurl}}/wiki/webserver/ExternalWebserversFile). This is however, not necessary for BlueMap to work. Since this documentation is about Cloudflare R2 and the free domain plan, I will not go into detail about this. \ No newline at end of file From 804ca8da1b01ebe9b38bfacaa16480ce47bb0148 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:05:58 +0200 Subject: [PATCH 7/8] move reason explanation Co-authored-by: TechnicJelle <22576047+TechnicJelle@users.noreply.github.com> --- community/CloudflareR2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index 0a2c154..f7de7cd 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -113,8 +113,8 @@ Go to Websites, click on “Add a site” then write your domain name.    3. It should look similar to this: ![Screenshot of the gzip rule in Cloudflare]({{site.baseurl}}/assets/r2/gzip_rule.png)    4. Save the rule. -4. Now click on the `Modify Response Header` tab and create a new rule. -   1. Give the rule a name, e.g. `BlueMap: Content-Encoding`. This rule marks the compressed files as compressed, so your browser knows how to handle them when it requests them. +4. Now click on the `Modify Response Header` tab and create a new rule. This rule marks the compressed files as compressed, so your browser knows how to handle them when it requests them. +   1. Give the rule a name, e.g. `BlueMap: Content-Encoding`.    2. Select `Custom filter expression`       1. In the first field, select `URI Path`. In the Operator field, select `ends with`. In the value field, enter `.gz`.       2. Click on `Or` to add another rule. From 3f819063f590f0864811db23900a420807a8cc51 Mon Sep 17 00:00:00 2001 From: Zottelchen <5148555+Zottelchen@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:14:44 +0200 Subject: [PATCH 8/8] explain optional configuration beforehand --- community/CloudflareR2.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/community/CloudflareR2.md b/community/CloudflareR2.md index f7de7cd..bb197d2 100644 --- a/community/CloudflareR2.md +++ b/community/CloudflareR2.md @@ -129,7 +129,7 @@ Go to Websites, click on “Add a site” then write your domain name. ## Making optional configurations -Every time a file is requested from your bucket, that counts as an operation. Every operation above the free limit induces a cost. To reduce the number of requests to your bucket, you can set up a cache policy. This will cache the files on Cloudflare's edge servers and serve them from there. This will reduce the number of requests to your bucket and thus reduce the costs. +Every time a file is requested from your bucket, that counts as an operation. Every operation above the free limit induces a cost. To reduce the number of requests to your bucket, you can set up a cache policy. This has 2 parts. The first part of the rule (the `Edge TTL`) will cache the files on Cloudflare's edge servers and serve them from there. This will reduce the number of requests to your bucket and thus reduce the costs. The second part of the rule (the `Browser TTL`) will increase the time the files are cached in the browser. This can be beneficial if you have many visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map, they can do a hard refresh (Ctrl + F5) to force the browser to load the static files from the server AND click on the "Update Map" button in the menu to reload the map tiles. 1. Go to your domain inside the Cloudflare dashboard. Click on “Rules” and then “Cache Rules”. Click on “Create Rule”.    1. Give the Rule a name, e.g. `BlueMap: Cache`. @@ -137,11 +137,10 @@ Every time a file is requested from your bucket, that counts as an operation. Ev       1. In the first field, select `Hostname`. In the Operator field, select `equals`. In the value field, enter the domain you are using for BlueMap, e.g. `map.example.com`.    3. Further down under `Cache eligibility` select `Eligible for cache`.    4. Further down under `Edge TTL` click on `Add Setting`. -      1. Now select `Ignore cache-control header and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. -      2. This rule will cache all files for up to 1 year on Cloudflare's edge servers and serve them from there instead of requesting them from your bucket. This will reduce the number of requests to your bucket and thus reduce the costs. +      1. Now select `Ignore cache-control header and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year, this will cache the files on Cloudflare's edge servers for up to 1 year.    5. Further down under `Browser TTL` click on `Add Setting`. -      1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year. -      2. This rule will cache all files for up to 1 year in your browser. This can be beneficial if you have many visitors who visit the map multiple times. They can load the map faster because the files are already in their browser cache. If they want to see the latest version of the map, they can do a hard refresh (Ctrl + F5) to force the browser to load the static files from the server AND click on the "Update Map" button in the menu to reload the map tiles. +      1. Now select `Override origin and use this TTL` and set `Input time-to-live (TTL)` to a value you are comfortable with. I set it to 1 year, this will cache the files in the browser for up to 1 year.    6. It should look similar to this: ![Screenshot of the Cache rule in Cloudflare]({{site.baseurl}}/assets/r2/cache_rule.png)    7. Save the rule. + 2. If you have a paid plan, you can potentially use “Custom error responses” to change 404 errors to 204 errors as suggested by the [External Web server documentation]({{site.baseurl}}/wiki/webserver/ExternalWebserversFile). This is however, not necessary for BlueMap to work. Since this documentation is about Cloudflare R2 and the free domain plan, I will not go into detail about this. \ No newline at end of file