This commit is contained in:
Kiri Stolz 2025-01-26 17:39:48 -07:00
parent bfbe0de3c6
commit 30c2170ae7
1369 changed files with 92622 additions and 16 deletions

View file

@ -0,0 +1,574 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
style="margin:auto;background:rgba(NaN, NaN, NaN, 0);display:block;z-index:1;position:relative"
width="1084" height="322" preserveAspectRatio="xMidYMid" viewBox="0 0 1084 322">
<defs>
<pattern id="pid-0.7735807359934106" x="0" y="0" width="345.6" height="345.6"
patternUnits="userSpaceOnUse">
<g transform="scale(1.35)">
<g>
<line x1="237.6288884328494" x2="201.39714008747956" y1="119.05338354492488"
y2="155.28513189029474" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="237.6288884328494" x2="201.39714008747956" y1="-392.9466164550751"
y2="-356.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="493.6288884328494" x2="457.39714008747956" y1="-392.9466164550751"
y2="-356.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="749.6288884328494" x2="713.3971400874796" y1="-392.9466164550751"
y2="-356.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="237.6288884328494" x2="201.39714008747956" y1="-136.94661645507512"
y2="-100.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="493.6288884328494" x2="457.39714008747956" y1="-136.94661645507512"
y2="-100.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="749.6288884328494" x2="713.3971400874796" y1="-136.94661645507512"
y2="-100.71486810970526" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="237.6288884328494" x2="201.39714008747956" y1="119.05338354492488"
y2="155.28513189029474" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="493.6288884328494" x2="457.39714008747956" y1="119.05338354492488"
y2="155.28513189029474" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="749.6288884328494" x2="713.3971400874796" y1="119.05338354492488"
y2="155.28513189029474" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="244.43797352167968" x2="179.25167385613412" y1="196.21419032492787"
y2="261.40048999047343" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="244.43797352167968" x2="179.25167385613412" y1="-315.78580967507213"
y2="-250.59951000952657" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="500.4379735216797" x2="435.2516738561341" y1="-315.78580967507213"
y2="-250.59951000952657" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="756.4379735216796" x2="691.2516738561342" y1="-315.78580967507213"
y2="-250.59951000952657" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="244.43797352167968" x2="179.25167385613412" y1="-59.78580967507213"
y2="5.400489990473432" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="500.4379735216797" x2="435.2516738561341" y1="-59.78580967507213"
y2="5.400489990473432" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="756.4379735216796" x2="691.2516738561342" y1="-59.78580967507213"
y2="5.400489990473432" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="244.43797352167968" x2="179.25167385613412" y1="196.21419032492787"
y2="261.40048999047343" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="500.4379735216797" x2="435.2516738561341" y1="196.21419032492787"
y2="261.40048999047343" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="756.4379735216796" x2="691.2516738561342" y1="196.21419032492787"
y2="261.40048999047343" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="219.6724359102308" x2="209.2181431749452" y1="92.85808081141191"
y2="103.31237354669749" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="219.6724359102308" x2="209.2181431749452" y1="-419.1419191885881"
y2="-408.6876264533025" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="475.6724359102308" x2="465.2181431749452" y1="-419.1419191885881"
y2="-408.6876264533025" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="731.6724359102308" x2="721.2181431749452" y1="-419.1419191885881"
y2="-408.6876264533025" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="219.6724359102308" x2="209.2181431749452" y1="-163.14191918858808"
y2="-152.68762645330253" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="475.6724359102308" x2="465.2181431749452" y1="-163.14191918858808"
y2="-152.68762645330253" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="731.6724359102308" x2="721.2181431749452" y1="-163.14191918858808"
y2="-152.68762645330253" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="219.6724359102308" x2="209.2181431749452" y1="92.85808081141191"
y2="103.31237354669749" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="475.6724359102308" x2="465.2181431749452" y1="92.85808081141191"
y2="103.31237354669749" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="731.6724359102308" x2="721.2181431749452" y1="92.85808081141191"
y2="103.31237354669749" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="112.00565118011832" x2="71.15817744773324" y1="56.63419812919665"
y2="97.48167186158173" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="112.00565118011832" x2="71.15817744773324" y1="-455.36580187080335"
y2="-414.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="368.0056511801183" x2="327.15817744773324" y1="-455.36580187080335"
y2="-414.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="624.0056511801183" x2="583.1581774477332" y1="-455.36580187080335"
y2="-414.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="112.00565118011832" x2="71.15817744773324" y1="-199.36580187080335"
y2="-158.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="368.0056511801183" x2="327.15817744773324" y1="-199.36580187080335"
y2="-158.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="624.0056511801183" x2="583.1581774477332" y1="-199.36580187080335"
y2="-158.51832813841827" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="112.00565118011832" x2="71.15817744773324" y1="56.63419812919665"
y2="97.48167186158173" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="368.0056511801183" x2="327.15817744773324" y1="56.63419812919665"
y2="97.48167186158173" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="624.0056511801183" x2="583.1581774477332" y1="56.63419812919665"
y2="97.48167186158173" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="60.932966336476014" x2="49.388821076756514" y1="125.65681060957188"
y2="137.20095586929136" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="60.932966336476014" x2="49.388821076756514" y1="-386.3431893904281"
y2="-374.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="316.932966336476" x2="305.3888210767565" y1="-386.3431893904281"
y2="-374.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="572.932966336476" x2="561.3888210767565" y1="-386.3431893904281"
y2="-374.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="60.932966336476014" x2="49.388821076756514" y1="-130.3431893904281"
y2="-118.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="316.932966336476" x2="305.3888210767565" y1="-130.3431893904281"
y2="-118.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="572.932966336476" x2="561.3888210767565" y1="-130.3431893904281"
y2="-118.79904413070864" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="60.932966336476014" x2="49.388821076756514" y1="125.65681060957188"
y2="137.20095586929136" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="316.932966336476" x2="305.3888210767565" y1="125.65681060957188"
y2="137.20095586929136" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="572.932966336476" x2="561.3888210767565" y1="125.65681060957188"
y2="137.20095586929136" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="103.78310212459807" x2="35.08486945593138" y1="-2.328164446496814"
y2="66.37006822216988" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="103.78310212459807" x2="35.08486945593138" y1="-514.3281644464968"
y2="-445.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="359.7831021245981" x2="291.08486945593137" y1="-514.3281644464968"
y2="-445.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="615.783102124598" x2="547.0848694559314" y1="-514.3281644464968"
y2="-445.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="103.78310212459807" x2="35.08486945593138" y1="-258.3281644464968"
y2="-189.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="359.7831021245981" x2="291.08486945593137" y1="-258.3281644464968"
y2="-189.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="615.783102124598" x2="547.0848694559314" y1="-258.3281644464968"
y2="-189.6299317778301" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="103.78310212459807" x2="35.08486945593138" y1="-2.328164446496814"
y2="66.37006822216988" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="359.7831021245981" x2="291.08486945593137" y1="-2.328164446496814"
y2="66.37006822216988" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="615.783102124598" x2="547.0848694559314" y1="-2.328164446496814"
y2="66.37006822216988" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="103.78310212459807" x2="35.08486945593138" y1="253.67183555350317"
y2="322.3700682221699" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="211.69894364075495" x2="194.13528259328754" y1="166.21741462144607"
y2="183.78107566891347" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="211.69894364075495" x2="194.13528259328754" y1="-345.7825853785539"
y2="-328.21892433108655" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="467.6989436407549" x2="450.13528259328757" y1="-345.7825853785539"
y2="-328.21892433108655" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="723.6989436407549" x2="706.1352825932876" y1="-345.7825853785539"
y2="-328.21892433108655" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="211.69894364075495" x2="194.13528259328754" y1="-89.78258537855393"
y2="-72.21892433108653" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="467.6989436407549" x2="450.13528259328757" y1="-89.78258537855393"
y2="-72.21892433108653" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="723.6989436407549" x2="706.1352825932876" y1="-89.78258537855393"
y2="-72.21892433108653" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="211.69894364075495" x2="194.13528259328754" y1="166.21741462144607"
y2="183.78107566891347" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="467.6989436407549" x2="450.13528259328757" y1="166.21741462144607"
y2="183.78107566891347" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="723.6989436407549" x2="706.1352825932876" y1="166.21741462144607"
y2="183.78107566891347" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="44.012515207413756" x2="6.2920050630466875" y1="153.79537767995515"
y2="191.5158878243222" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="44.012515207413756" x2="6.2920050630466875" y1="-358.20462232004485"
y2="-320.4841121756778" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="300.01251520741374" x2="262.2920050630467" y1="-358.20462232004485"
y2="-320.4841121756778" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="556.0125152074138" x2="518.2920050630466" y1="-358.20462232004485"
y2="-320.4841121756778" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="44.012515207413756" x2="6.2920050630466875" y1="-102.20462232004485"
y2="-64.48411217567781" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="300.01251520741374" x2="262.2920050630467" y1="-102.20462232004485"
y2="-64.48411217567781" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="556.0125152074138" x2="518.2920050630466" y1="-102.20462232004485"
y2="-64.48411217567781" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="44.012515207413756" x2="6.2920050630466875" y1="153.79537767995515"
y2="191.5158878243222" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="300.01251520741374" x2="262.2920050630467" y1="153.79537767995515"
y2="191.5158878243222" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="556.0125152074138" x2="518.2920050630466" y1="153.79537767995515"
y2="191.5158878243222" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="105.49237048043514" x2="31.549625942354083" y1="123.41684480916788"
y2="197.35958934724894" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="105.49237048043514" x2="31.549625942354083" y1="-388.58315519083214"
y2="-314.64041065275103" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="361.49237048043517" x2="287.54962594235406" y1="-388.58315519083214"
y2="-314.64041065275103" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="617.4923704804352" x2="543.549625942354" y1="-388.58315519083214"
y2="-314.64041065275103" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="105.49237048043514" x2="31.549625942354083" y1="-132.58315519083212"
y2="-58.64041065275106" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="361.49237048043517" x2="287.54962594235406" y1="-132.58315519083212"
y2="-58.64041065275106" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="617.4923704804352" x2="543.549625942354" y1="-132.58315519083212"
y2="-58.64041065275106" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="105.49237048043514" x2="31.549625942354083" y1="123.41684480916788"
y2="197.35958934724894" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="361.49237048043517" x2="287.54962594235406" y1="123.41684480916788"
y2="197.35958934724894" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="617.4923704804352" x2="543.549625942354" y1="123.41684480916788"
y2="197.35958934724894" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<animateTransform attributeName="transform" type="translate" values="0 0;-256 256"
keyTimes="0;1" repeatCount="indefinite" dur="10s"></animateTransform>
</g>
<g>
<line x1="95.73622575770466" x2="50.085335235319484" y1="20.45659654328417"
y2="66.10748706566935" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="95.73622575770466" x2="50.085335235319484" y1="-491.54340345671585"
y2="-445.8925129343306" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="351.7362257577047" x2="306.08533523531946" y1="-491.54340345671585"
y2="-445.8925129343306" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="607.7362257577047" x2="562.0853352353195" y1="-491.54340345671585"
y2="-445.8925129343306" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="95.73622575770466" x2="50.085335235319484" y1="-235.54340345671582"
y2="-189.89251293433065" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="351.7362257577047" x2="306.08533523531946" y1="-235.54340345671582"
y2="-189.89251293433065" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="607.7362257577047" x2="562.0853352353195" y1="-235.54340345671582"
y2="-189.89251293433065" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="95.73622575770466" x2="50.085335235319484" y1="20.45659654328417"
y2="66.10748706566935" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="351.7362257577047" x2="306.08533523531946" y1="20.45659654328417"
y2="66.10748706566935" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="607.7362257577047" x2="562.0853352353195" y1="20.45659654328417"
y2="66.10748706566935" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="263.34308373797757" x2="226.59561736370148" y1="112.42933995479353"
y2="149.17680632906962" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="263.34308373797757" x2="226.59561736370148" y1="-399.57066004520647"
y2="-362.8231936709304" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="519.3430837379776" x2="482.5956173637015" y1="-399.57066004520647"
y2="-362.8231936709304" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="775.3430837379776" x2="738.5956173637014" y1="-399.57066004520647"
y2="-362.8231936709304" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="263.34308373797757" x2="226.59561736370148" y1="-143.57066004520647"
y2="-106.82319367093038" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="519.3430837379776" x2="482.5956173637015" y1="-143.57066004520647"
y2="-106.82319367093038" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="775.3430837379776" x2="738.5956173637014" y1="-143.57066004520647"
y2="-106.82319367093038" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="263.34308373797757" x2="226.59561736370148" y1="112.42933995479353"
y2="149.17680632906962" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="519.3430837379776" x2="482.5956173637015" y1="112.42933995479353"
y2="149.17680632906962" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="775.3430837379776" x2="738.5956173637014" y1="112.42933995479353"
y2="149.17680632906962" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="7.343083737977565" x2="-29.40438263629852" y1="112.42933995479353"
y2="149.17680632906962" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="29.5343611349199" x2="-26.261040392985034" y1="205.16777076655512"
y2="260.96317229446004" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="29.5343611349199" x2="-26.261040392985034" y1="-306.8322292334449"
y2="-251.03682770553996" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="285.5343611349199" x2="229.73895960701498" y1="-306.8322292334449"
y2="-251.03682770553996" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="541.5343611349199" x2="485.738959607015" y1="-306.8322292334449"
y2="-251.03682770553996" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="29.5343611349199" x2="-26.261040392985034" y1="-50.83222923344488"
y2="4.963172294460037" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="285.5343611349199" x2="229.73895960701498" y1="-50.83222923344488"
y2="4.963172294460037" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="541.5343611349199" x2="485.738959607015" y1="-50.83222923344488"
y2="4.963172294460037" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="29.5343611349199" x2="-26.261040392985034" y1="205.16777076655512"
y2="260.96317229446004" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="285.5343611349199" x2="229.73895960701498" y1="205.16777076655512"
y2="260.96317229446004" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="541.5343611349199" x2="485.738959607015" y1="205.16777076655512"
y2="260.96317229446004" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="235.025028503587" x2="173.48946106938683" y1="23.306929884424335"
y2="84.84249731862451" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="235.025028503587" x2="173.48946106938683" y1="-488.69307011557567"
y2="-427.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="491.025028503587" x2="429.48946106938683" y1="-488.69307011557567"
y2="-427.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="747.025028503587" x2="685.4894610693868" y1="-488.69307011557567"
y2="-427.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="235.025028503587" x2="173.48946106938683" y1="-232.69307011557567"
y2="-171.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="491.025028503587" x2="429.48946106938683" y1="-232.69307011557567"
y2="-171.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="747.025028503587" x2="685.4894610693868" y1="-232.69307011557567"
y2="-171.1575026813755" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="235.025028503587" x2="173.48946106938683" y1="23.306929884424335"
y2="84.84249731862451" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="491.025028503587" x2="429.48946106938683" y1="23.306929884424335"
y2="84.84249731862451" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="747.025028503587" x2="685.4894610693868" y1="23.306929884424335"
y2="84.84249731862451" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="225.00990918130768" x2="200.62370409686488" y1="210.1052181599721"
y2="234.4914232444149" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="225.00990918130768" x2="200.62370409686488" y1="-301.8947818400279"
y2="-277.50857675558507" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="481.00990918130765" x2="456.6237040968649" y1="-301.8947818400279"
y2="-277.50857675558507" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="737.0099091813076" x2="712.6237040968649" y1="-301.8947818400279"
y2="-277.50857675558507" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="225.00990918130768" x2="200.62370409686488" y1="-45.89478184002789"
y2="-21.508576755585096" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="481.00990918130765" x2="456.6237040968649" y1="-45.89478184002789"
y2="-21.508576755585096" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="737.0099091813076" x2="712.6237040968649" y1="-45.89478184002789"
y2="-21.508576755585096" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="225.00990918130768" x2="200.62370409686488" y1="210.1052181599721"
y2="234.4914232444149" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="481.00990918130765" x2="456.6237040968649" y1="210.1052181599721"
y2="234.4914232444149" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="737.0099091813076" x2="712.6237040968649" y1="210.1052181599721"
y2="234.4914232444149" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="171.55017713954658" x2="102.05334080042758" y1="78.55895711807653"
y2="148.05579345719553" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="171.55017713954658" x2="102.05334080042758" y1="-433.44104288192347"
y2="-363.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="427.5501771395466" x2="358.0533408004276" y1="-433.44104288192347"
y2="-363.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="683.5501771395466" x2="614.0533408004276" y1="-433.44104288192347"
y2="-363.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="171.55017713954658" x2="102.05334080042758" y1="-177.44104288192347"
y2="-107.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="427.5501771395466" x2="358.0533408004276" y1="-177.44104288192347"
y2="-107.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="683.5501771395466" x2="614.0533408004276" y1="-177.44104288192347"
y2="-107.94420654280447" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="171.55017713954658" x2="102.05334080042758" y1="78.55895711807653"
y2="148.05579345719553" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="427.5501771395466" x2="358.0533408004276" y1="78.55895711807653"
y2="148.05579345719553" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="683.5501771395466" x2="614.0533408004276" y1="78.55895711807653"
y2="148.05579345719553" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="258.4358284744095" x2="228.09906783279462" y1="10.646186924515469"
y2="40.98294756613034" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="258.4358284744095" x2="228.09906783279462" y1="-501.35381307548454"
y2="-471.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="514.4358284744095" x2="484.0990678327946" y1="-501.35381307548454"
y2="-471.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="770.4358284744095" x2="740.0990678327946" y1="-501.35381307548454"
y2="-471.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="258.4358284744095" x2="228.09906783279462" y1="-245.35381307548454"
y2="-215.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="514.4358284744095" x2="484.0990678327946" y1="-245.35381307548454"
y2="-215.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="770.4358284744095" x2="740.0990678327946" y1="-245.35381307548454"
y2="-215.01705243386965" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="258.4358284744095" x2="228.09906783279462" y1="10.646186924515469"
y2="40.98294756613034" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="514.4358284744095" x2="484.0990678327946" y1="10.646186924515469"
y2="40.98294756613034" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="770.4358284744095" x2="740.0990678327946" y1="10.646186924515469"
y2="40.98294756613034" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="2.4358284744095045" x2="-27.900932167205383" y1="10.646186924515469"
y2="40.98294756613034" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="35.41624886616098" x2="-5.966808810922494" y1="10.151780697595989"
y2="51.53483837467946" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="35.41624886616098" x2="-5.966808810922494" y1="-501.848219302404"
y2="-460.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="291.41624886616097" x2="250.0331911890775" y1="-501.848219302404"
y2="-460.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="547.416248866161" x2="506.0331911890775" y1="-501.848219302404"
y2="-460.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="35.41624886616098" x2="-5.966808810922494" y1="-245.848219302404"
y2="-204.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="291.41624886616097" x2="250.0331911890775" y1="-245.848219302404"
y2="-204.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="547.416248866161" x2="506.0331911890775" y1="-245.848219302404"
y2="-204.46516162532055" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="35.41624886616098" x2="-5.966808810922494" y1="10.151780697595989"
y2="51.53483837467946" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="291.41624886616097" x2="250.0331911890775" y1="10.151780697595989"
y2="51.53483837467946" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="547.416248866161" x2="506.0331911890775" y1="10.151780697595989"
y2="51.53483837467946" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="90.76285286976488" x2="72.92514980496989" y1="79.79001478147771"
y2="97.6277178462727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="90.76285286976488" x2="72.92514980496989" y1="-432.2099852185223"
y2="-414.37228215372727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="346.76285286976486" x2="328.9251498049699" y1="-432.2099852185223"
y2="-414.37228215372727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="602.7628528697649" x2="584.9251498049699" y1="-432.2099852185223"
y2="-414.37228215372727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="90.76285286976488" x2="72.92514980496989" y1="-176.2099852185223"
y2="-158.3722821537273" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="346.76285286976486" x2="328.9251498049699" y1="-176.2099852185223"
y2="-158.3722821537273" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="602.7628528697649" x2="584.9251498049699" y1="-176.2099852185223"
y2="-158.3722821537273" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="90.76285286976488" x2="72.92514980496989" y1="79.79001478147771"
y2="97.6277178462727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="346.76285286976486" x2="328.9251498049699" y1="79.79001478147771"
y2="97.6277178462727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="602.7628528697649" x2="584.9251498049699" y1="79.79001478147771"
y2="97.6277178462727" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<animateTransform attributeName="transform" type="translate" values="0 0;-256 256"
keyTimes="0;1" repeatCount="indefinite" dur="5s"></animateTransform>
</g>
<g>
<line x1="93.6896305353637" x2="75.71575147590588" y1="83.83758835275793"
y2="101.81146741221576" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="93.6896305353637" x2="75.71575147590588" y1="-428.16241164724204"
y2="-410.18853258778427" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="349.6896305353637" x2="331.7157514759059" y1="-428.16241164724204"
y2="-410.18853258778427" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="605.6896305353637" x2="587.7157514759059" y1="-428.16241164724204"
y2="-410.18853258778427" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="93.6896305353637" x2="75.71575147590588" y1="-172.16241164724207"
y2="-154.18853258778424" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="349.6896305353637" x2="331.7157514759059" y1="-172.16241164724207"
y2="-154.18853258778424" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="605.6896305353637" x2="587.7157514759059" y1="-172.16241164724207"
y2="-154.18853258778424" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="93.6896305353637" x2="75.71575147590588" y1="83.83758835275793"
y2="101.81146741221576" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="349.6896305353637" x2="331.7157514759059" y1="83.83758835275793"
y2="101.81146741221576" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="605.6896305353637" x2="587.7157514759059" y1="83.83758835275793"
y2="101.81146741221576" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="207.24941141296466" x2="167.48134532138562" y1="234.55973050121918"
y2="274.3277965927982" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="207.24941141296466" x2="167.48134532138562" y1="-277.4402694987808"
y2="-237.67220340720178" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="463.24941141296466" x2="423.4813453213856" y1="-277.4402694987808"
y2="-237.67220340720178" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="719.2494114129647" x2="679.4813453213856" y1="-277.4402694987808"
y2="-237.67220340720178" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="207.24941141296466" x2="167.48134532138562" y1="-21.440269498780822"
y2="18.327796592798222" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="463.24941141296466" x2="423.4813453213856" y1="-21.440269498780822"
y2="18.327796592798222" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="719.2494114129647" x2="679.4813453213856" y1="-21.440269498780822"
y2="18.327796592798222" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="207.24941141296466" x2="167.48134532138562" y1="234.55973050121918"
y2="274.3277965927982" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="463.24941141296466" x2="423.4813453213856" y1="234.55973050121918"
y2="274.3277965927982" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="719.2494114129647" x2="679.4813453213856" y1="234.55973050121918"
y2="274.3277965927982" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="69.19671201083756" x2="20.15599089926107" y1="61.52941038272999"
y2="110.57013149430648" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="69.19671201083756" x2="20.15599089926107" y1="-450.47058961727"
y2="-401.42986850569355" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="325.1967120108376" x2="276.15599089926104" y1="-450.47058961727"
y2="-401.42986850569355" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="581.1967120108376" x2="532.155990899261" y1="-450.47058961727"
y2="-401.42986850569355" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="69.19671201083756" x2="20.15599089926107" y1="-194.47058961727"
y2="-145.42986850569352" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="325.1967120108376" x2="276.15599089926104" y1="-194.47058961727"
y2="-145.42986850569352" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="581.1967120108376" x2="532.155990899261" y1="-194.47058961727"
y2="-145.42986850569352" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="69.19671201083756" x2="20.15599089926107" y1="61.52941038272999"
y2="110.57013149430648" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="325.1967120108376" x2="276.15599089926104" y1="61.52941038272999"
y2="110.57013149430648" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="581.1967120108376" x2="532.155990899261" y1="61.52941038272999"
y2="110.57013149430648" stroke-width="15" stroke="#93dbe9" stroke-linecap="round"></line>
<line x1="153.36870174443493" x2="103.52218176454608" y1="129.93915864820679"
y2="179.78567862809564" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="153.36870174443493" x2="103.52218176454608" y1="-382.0608413517932"
y2="-332.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="409.36870174443493" x2="359.5221817645461" y1="-382.0608413517932"
y2="-332.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="665.3687017444349" x2="615.5221817645461" y1="-382.0608413517932"
y2="-332.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="153.36870174443493" x2="103.52218176454608" y1="-126.06084135179321"
y2="-76.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="409.36870174443493" x2="359.5221817645461" y1="-126.06084135179321"
y2="-76.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="665.3687017444349" x2="615.5221817645461" y1="-126.06084135179321"
y2="-76.21432137190436" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="153.36870174443493" x2="103.52218176454608" y1="129.93915864820679"
y2="179.78567862809564" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="409.36870174443493" x2="359.5221817645461" y1="129.93915864820679"
y2="179.78567862809564" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="665.3687017444349" x2="615.5221817645461" y1="129.93915864820679"
y2="179.78567862809564" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="49.20494471467643" x2="2.7142059537850685" y1="141.75997600855746"
y2="188.25071476944882" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="49.20494471467643" x2="2.7142059537850685" y1="-370.2400239914425"
y2="-323.7492852305512" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="305.20494471467646" x2="258.71420595378504" y1="-370.2400239914425"
y2="-323.7492852305512" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="561.2049447146765" x2="514.714205953785" y1="-370.2400239914425"
y2="-323.7492852305512" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="49.20494471467643" x2="2.7142059537850685" y1="-114.24002399144254"
y2="-67.74928523055118" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="305.20494471467646" x2="258.71420595378504" y1="-114.24002399144254"
y2="-67.74928523055118" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="561.2049447146765" x2="514.714205953785" y1="-114.24002399144254"
y2="-67.74928523055118" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="49.20494471467643" x2="2.7142059537850685" y1="141.75997600855746"
y2="188.25071476944882" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="305.20494471467646" x2="258.71420595378504" y1="141.75997600855746"
y2="188.25071476944882" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="561.2049447146765" x2="514.714205953785" y1="141.75997600855746"
y2="188.25071476944882" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="84.6808460539986" x2="32.68305955000314" y1="-7.711036017440037"
y2="44.28675048655542" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="84.6808460539986" x2="32.68305955000314" y1="-519.71103601744"
y2="-467.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="340.6808460539986" x2="288.6830595500031" y1="-519.71103601744"
y2="-467.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="596.6808460539986" x2="544.6830595500031" y1="-519.71103601744"
y2="-467.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="84.6808460539986" x2="32.68305955000314" y1="-263.71103601744005"
y2="-211.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="340.6808460539986" x2="288.6830595500031" y1="-263.71103601744005"
y2="-211.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="596.6808460539986" x2="544.6830595500031" y1="-263.71103601744005"
y2="-211.71324951344457" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="84.6808460539986" x2="32.68305955000314" y1="-7.711036017440037"
y2="44.28675048655542" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="340.6808460539986" x2="288.6830595500031" y1="-7.711036017440037"
y2="44.28675048655542" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="596.6808460539986" x2="544.6830595500031" y1="-7.711036017440037"
y2="44.28675048655542" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="84.6808460539986" x2="32.68305955000314" y1="248.28896398255995"
y2="300.28675048655543" stroke-width="15" stroke="#689cc5" stroke-linecap="round"></line>
<line x1="225.38342310559023" x2="185.66602314192056" y1="109.68961591653738"
y2="149.40701588020704" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="225.38342310559023" x2="185.66602314192056" y1="-402.3103840834626"
y2="-362.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="481.3834231055902" x2="441.66602314192056" y1="-402.3103840834626"
y2="-362.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="737.3834231055903" x2="697.6660231419205" y1="-402.3103840834626"
y2="-362.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="225.38342310559023" x2="185.66602314192056" y1="-146.31038408346262"
y2="-106.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="481.3834231055902" x2="441.66602314192056" y1="-146.31038408346262"
y2="-106.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="737.3834231055903" x2="697.6660231419205" y1="-146.31038408346262"
y2="-106.59298411979296" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="225.38342310559023" x2="185.66602314192056" y1="109.68961591653738"
y2="149.40701588020704" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="481.3834231055902" x2="441.66602314192056" y1="109.68961591653738"
y2="149.40701588020704" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="737.3834231055903" x2="697.6660231419205" y1="109.68961591653738"
y2="149.40701588020704" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="172.83662370669697" x2="103.52581079778793" y1="164.45975635392284"
y2="233.77056926283188" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="172.83662370669697" x2="103.52581079778793" y1="-347.54024364607716"
y2="-278.2294307371681" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="428.83662370669697" x2="359.5258107977879" y1="-347.54024364607716"
y2="-278.2294307371681" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="684.836623706697" x2="615.5258107977879" y1="-347.54024364607716"
y2="-278.2294307371681" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="172.83662370669697" x2="103.52581079778793" y1="-91.54024364607716"
y2="-22.229430737168116" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="428.83662370669697" x2="359.5258107977879" y1="-91.54024364607716"
y2="-22.229430737168116" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="684.836623706697" x2="615.5258107977879" y1="-91.54024364607716"
y2="-22.229430737168116" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="172.83662370669697" x2="103.52581079778793" y1="164.45975635392284"
y2="233.77056926283188" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="428.83662370669697" x2="359.5258107977879" y1="164.45975635392284"
y2="233.77056926283188" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="684.836623706697" x2="615.5258107977879" y1="164.45975635392284"
y2="233.77056926283188" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="254.85435949520382" x2="240.10841684705935" y1="-1.209429949430282"
y2="13.536512698714214" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="254.85435949520382" x2="240.10841684705935" y1="-513.2094299494303"
y2="-498.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="510.8543594952038" x2="496.10841684705935" y1="-513.2094299494303"
y2="-498.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="766.8543594952039" x2="752.1084168470593" y1="-513.2094299494303"
y2="-498.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="254.85435949520382" x2="240.10841684705935" y1="-257.2094299494303"
y2="-242.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="510.8543594952038" x2="496.10841684705935" y1="-257.2094299494303"
y2="-242.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="766.8543594952039" x2="752.1084168470593" y1="-257.2094299494303"
y2="-242.4634873012858" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="254.85435949520382" x2="240.10841684705935" y1="-1.209429949430282"
y2="13.536512698714214" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="510.8543594952038" x2="496.10841684705935" y1="-1.209429949430282"
y2="13.536512698714214" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="766.8543594952039" x2="752.1084168470593" y1="-1.209429949430282"
y2="13.536512698714214" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<line x1="254.85435949520382" x2="240.10841684705935" y1="254.79057005056973"
y2="269.5365126987142" stroke-width="15" stroke="#5e6fa3" stroke-linecap="round"></line>
<animateTransform attributeName="transform" type="translate" values="0 0;-256 256"
keyTimes="0;1" repeatCount="indefinite" dur="10.3333333333333335s"></animateTransform>
</g>
</g>
</pattern>
</defs>
<rect x="0" y="0" width="1084" height="322" fill="url(#pid-0.7735807359934106)"></rect>
</svg>

View file

@ -0,0 +1,827 @@
<svg id="canvas" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs"
viewBox="0 0 600 600">
<rect width="600" height="600" fill="transparent"></rect>
<mask id="mask" mask-type="alpha" maskUnits="userSpaceOnUse">
<rect transform="translate(0, 0)" width="600" height="600" fill="white"></rect>
</mask>
<svg>
<path transform="translate(0, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(0, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(0, 60) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 60) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(0, 60) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(0, 120)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(0, 120)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(0, 180) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 180) translate(30,30) rotate(0) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(0, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="#0096c7" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(0, 300) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 300) translate(30,30) rotate(270) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#023e8a"></path>
<path transform="translate(0, 300) translate(30,30) rotate(270) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(0, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="#0096c7" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(0, 420) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(0, 420) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(0, 420) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(0, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(0, 480)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(0, 540)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(60, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(60, 0) translate(30,30) rotate(270) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#00b4d8"></path>
<path transform="translate(60, 0) translate(30,30) rotate(270) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(60, 60)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<rect transform="translate(60, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" x="0" y="0" width="60" height="60" stroke="#48cae4" stroke-width="2"></rect>
<path transform="translate(60, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" d="M0 0L60 60" stroke="#48cae4" stroke-width="2"></path>
</svg>
<svg>
<path transform="translate(60, 180) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(60, 180) translate(30,30) rotate(0) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(60, 240)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(60, 300)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(60, 300)" cx="30" cy="30" r="30" fill="#48cae4"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(60, 360)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(60, 420)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(60, 420)" cx="30" cy="30" r="30" fill="#48cae4"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(60, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(60, 480)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(60, 540)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(60, 540)" cx="30" cy="30" r="30" fill="#48cae4"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(120, 0)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(120, 0)" cx="30" cy="30" r="30" fill="#023e8a" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(120, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(120, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<rect transform="translate(120, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" x="0" y="0" width="60" height="60" stroke="#48cae4" stroke-width="2"></rect>
<path transform="translate(120, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" d="M0 0L60 60" stroke="#48cae4" stroke-width="2"></path>
</svg>
<svg>
<path transform="translate(120, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(120, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(120, 240) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 240) translate(30,30) rotate(180) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#ade8f4"></path>
<path transform="translate(120, 240) translate(30,30) rotate(180) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(120, 300) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 300) translate(30,30) rotate(270) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
<path transform="translate(120, 300) translate(30,30) rotate(270) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(120, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="#48cae4" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(120, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(120, 420)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(120, 420)" cx="30" cy="30" r="30" fill="#90e0ef"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(120, 480) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 480) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(120, 480) translate(30,30) rotate(180) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(120, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(120, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(120, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(180, 0) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 0) translate(30,30) rotate(180) translate(-30,-30)"
fill="#caf0f8" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(180, 60) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 60) translate(30,30) rotate(0) translate(-30,-30)"
fill="#023e8a" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(180, 120) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 120) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(180, 120) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(180, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(180, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(180, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(180, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(180, 300) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 300) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
<path transform="translate(180, 300) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(180, 360)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<rect transform="translate(180, 420) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" x="0" y="0" width="60" height="60" stroke="#48cae4" stroke-width="2"></rect>
<path transform="translate(180, 420) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" d="M0 0L60 60" stroke="#48cae4" stroke-width="2"></path>
</svg>
<svg>
<path transform="translate(180, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(180, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(180, 540) translate(30,30) rotate(180) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0077b6"></path>
<path transform="translate(180, 540) translate(30,30) rotate(180) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<rect transform="translate(240, 0) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" x="0" y="0" width="60" height="60" stroke="#48cae4" stroke-width="2"></rect>
<path transform="translate(240, 0) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" d="M0 0L60 60" stroke="#48cae4" stroke-width="2"></path>
</svg>
<svg>
<path transform="translate(240, 60)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(240, 60)" cx="30" cy="30" r="30" fill="#0096c7"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(240, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(240, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(240, 180) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 180) translate(30,30) rotate(270) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#48cae4"></path>
<path transform="translate(240, 180) translate(30,30) rotate(270) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(240, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="#03045e" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(240, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(240, 300) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 300) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(240, 300) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(240, 360) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 360) translate(30,30) rotate(180) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#00b4d8"></path>
<path transform="translate(240, 360) translate(30,30) rotate(180) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(240, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(240, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(240, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(240, 480)" cx="30" cy="30" r="30" fill="#48cae4"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(240, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(240, 540) translate(30,30) rotate(180) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#00b4d8"></path>
<path transform="translate(240, 540) translate(30,30) rotate(180) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(300, 0) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 0) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#00b4d8"></path>
<path transform="translate(300, 0) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(300, 60)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(300, 60)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(300, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 120) translate(30,30) rotate(90) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#023e8a"></path>
<path transform="translate(300, 120) translate(30,30) rotate(90) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(300, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(300, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(300, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 240) translate(30,30) rotate(270) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0077b6"></path>
<path transform="translate(300, 240) translate(30,30) rotate(270) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(300, 300) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 300) translate(30,30) rotate(90) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#48cae4"></path>
<path transform="translate(300, 300) translate(30,30) rotate(90) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(300, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(300, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(300, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(300, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(300, 480) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 480) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(300, 480) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(300, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(300, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(300, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="#0096c7" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(360, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="#03045e" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(360, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(360, 60) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 60) translate(30,30) rotate(0) translate(-30,-30)"
fill="#48cae4" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(360, 120)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(360, 120)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(360, 180) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 180) translate(30,30) rotate(180) translate(-30,-30)"
fill="#caf0f8" stroke="#48cae4" stroke-width="2" d="M30 0h30v60h-30z"></path>
<path transform="translate(360, 180) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(360, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(360, 300) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 300) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(360, 300) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(360, 360) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 360) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(360, 360) translate(30,30) rotate(180) translate(-30,-30)"
fill="#0096c7" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(360, 420)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(360, 420)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(360, 480) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 480) translate(30,30) rotate(90) translate(-30,-30)"
fill="#0096c7" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(360, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(360, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(360, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(420, 0) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 0) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#00b4d8"></path>
<path transform="translate(420, 0) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(420, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(420, 60) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(420, 120)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(420, 120)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(420, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(420, 180) translate(30,30) rotate(90) translate(-30,-30)"
fill="#90e0ef" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(420, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(420, 300)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(420, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(420, 360) translate(30,30) rotate(90) translate(-30,-30)"
fill="#caf0f8" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(420, 420)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(420, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(420, 480)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(420, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(420, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(420, 540) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(480, 0) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 0) translate(30,30) rotate(90) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
<path transform="translate(480, 0) translate(30,30) rotate(90) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(480, 60)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(480, 60)" cx="30" cy="30" r="30" fill="#03045e"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(480, 120) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 120) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0077b6"></path>
<path transform="translate(480, 120) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(480, 180) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 180) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(480, 180) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(480, 240) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 240) translate(30,30) rotate(90) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0096c7"></path>
<path transform="translate(480, 240) translate(30,30) rotate(90) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(480, 300)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
</svg>
<svg>
<path transform="translate(480, 360)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(480, 360)" cx="30" cy="30" r="30" fill="#caf0f8"
stroke="#48cae4" stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(480, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(480, 420) translate(30,30) rotate(270) translate(-30,-30)"
fill="#03045e" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(480, 480) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 480) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(480, 480) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(480, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(480, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(480, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(540, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(540, 0) translate(30,30) rotate(270) translate(-30,-30)"
fill="#0077b6" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(540, 60) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 60) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0096c7"></path>
<path transform="translate(540, 60) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(540, 120) translate(30,30) rotate(90) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 120) translate(30,30) rotate(90) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0096c7"></path>
<path transform="translate(540, 120) translate(30,30) rotate(90) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(540, 180) translate(30,30) rotate(0) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 180) translate(30,30) rotate(0) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
<path transform="translate(540, 180) translate(30,30) rotate(0) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(540, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(540, 240) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(540, 300) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 300) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(540, 300) translate(30,30) rotate(270) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
<svg>
<path transform="translate(540, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 360) translate(30,30) rotate(270) translate(-30,-30)"
fill="#ade8f4" stroke="#48cae4" stroke-width="2"
d="M0 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
</svg>
<svg>
<path transform="translate(540, 420) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 420) translate(30,30) rotate(180) translate(-30,-30)"
d="M0 30C0 48.05 15.3348 60 30 60V0C15.3348 0 0 14.9129 0 30Z" stroke="#48cae4"
stroke-width="2" fill="#0077b6"></path>
<path transform="translate(540, 420) translate(30,30) rotate(180) translate(-30,-30)"
d="M60 30C60 14.9129 48.4719 0 30 0L30 60C48.4719 60 60 48.05 60 30Z" stroke="#48cae4"
stroke-width="2" fill="none"></path>
</svg>
<svg>
<path transform="translate(540, 480)" fill="none" stroke="#48cae4" stroke-width="2"
d="M0 0h60v60h-60z"></path>
<circle transform="translate(540, 480)" cx="30" cy="30" r="30" fill="none" stroke="#48cae4"
stroke-width="2"></circle>
</svg>
<svg>
<path transform="translate(540, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2" d="M0 0h60v60h-60z"></path>
<path transform="translate(540, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0 16.569 13.432 30 30 30v-60c-16.568 0-30 13.432-30 30z"></path>
<path transform="translate(540, 540) translate(30,30) rotate(180) translate(-30,-30)"
fill="none" stroke="#48cae4" stroke-width="2"
d="M30 30c0-16.57-13.431-30-30-30v60c16.569 0 30-13.432 30-30z"></path>
</svg>
</svg>

After

Width:  |  Height:  |  Size: 51 KiB

View file

@ -0,0 +1,374 @@
---
date: 2020-08-14
title: "Configurazione"
weight: 4
draft: false
description: "Tutte le configurazioni disponibili in Blowfish."
slug: "configurazioni"
tags: ["config", "docs"]
series: ["Documentazione"]
series_order: 4
---
Blowfish è un tema altamente personalizzabile e utilizza alcune delle più recenti funzionalità di Hugo per semplificarne la configurazione.
Il tema viene fornito con una configurazione predefinita che ti consente di essere operativo con un blog di base o un sito Web statico.
{{< alert "fire" >}}
We just launched a CLI tool to help you get started with Blowfish. It will help you with installation and configuration. Install the CLI tool globally using:
```bash
npx blowfish-tools
```
{{< /alert >}}
> I file di configurazione forniti con il tema sono forniti in formato TOML dato che questa è la sintassi predefinita di Hugo. Sentiti libero di convertire la tua configurazione in YAML o JSON se lo desideri.
La configurazione predefinita del tema è documentata in ogni file in modo da poter regolare liberamente le impostazioni per soddisfare le proprie esigenze.
{{< alert >}}
As outlined in the [installation instructions]({{< ref "/docs/installation#set-up-theme-configuration-files" >}}), you should adjust your theme configuration by modifying the files in the `config/_default/` folder of your Hugo project and delete the `config.toml` file in your project root.
{{< /alert >}}
## Configurazioni del sito
Standard Hugo configuration variables are respected throughout the theme, however there are some specific things that should be configured for the best experience.
La configurazione del sito viene gestita tramite il file `config/_default/config.toml`. La tabella seguente descrive tutte le impostazioni di cui si avvale Blowfish.
Tieni presente che i nomi delle variabili forniti in questa tabella utilizzano il punto per semplificare la struttura dei dati TOML (ad esempio, "outputs.home" si riferisce a "[outputs] home").
<!-- prettier-ignore-start -->
| Name | Default | Description |
| ------------------------ | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `theme` | `"blowfish"` | Quando si utilizzano i moduli Hugo, questo valore di configurazione deve essere rimosso. Per tutti gli altri tipi di installazione, questo deve essere impostato su "blowfish" affinché il tema funzioni. |
| `baseURL` | _Not set_ | The URL to the root of the website. |
| `defaultContentLanguage` | `"en"` | This value determines the default language of theme components and content. Refer to the [language and i18n](#language-and-i18n) section below for supported language codes. |
| `enableRobotsTXT` | `true` | Se abilitato, verrà creato un file "robots.txt" nella radice del sito che consentirà ai motori di ricerca di eseguire la scansione dell'intero sito. Se preferisci fornire il tuo file `robots.txt` predefinito, impostalo su `false` e posiziona il file nella directory `static`. Per un controllo completo, puoi fornire un [layout personalizzato]({{< ref "content-examples#custom-layouts" >}}) per generare questo file. |
| `pagination.pagerSize` | `10` | Il numero di articoli elencati in ciascuna pagina dell'elenco degli articoli. |
| `summaryLength` | `0` | Il numero di parole utilizzate per generare il riepilogo dell'articolo quando non ne viene fornita una nella [front matter]({{< ref "front-matter" >}}). Un valore pari a "0" utilizzerà la prima frase. Questo valore non ha effetto quando i riepiloghi sono nascosti. |
| `outputs.home` | `["HTML", "RSS", "JSON"]` | I formati di output generati per il sito. Blowfish richiede HTML, RSS e JSON affinché tutti i componenti del tema funzionino correttamente. |
| `permalinks` | _Not set_ | Fare riferimento alla [documentazione di Hugo](https://gohugo.io/content-management/urls/#permalinks) per la configurazione del permalink. |
| `taxonomies` | _Not set_ | Fare riferimento alla sezione [Organizzazione dei contenuti]({{< ref "getting-started#organising-content" >}}) per la configurazione della tassonomia. |
<!-- prettier-ignore-end -->
## Thumbnails
Blowfish è stato creato in modo che sia facile aggiungere supporto visivo ai tuoi articoli. Se hai familiarità con la struttura degli articoli di Hugo, devi solo inserire un file immagine (quasi tutti i formati sono supportati ma consigliamo `.png` o `.jpg`) che inizi con `feature*` all'interno della cartella dell'articolo. E questo è tutto, Blowfish sarà quindi in grado di utilizzare l'immagine sia come miniatura all'interno del tuo sito web sia per le schede <a target="_blank" href="https://oembed.com/">oEmbed</a> su piattaforme sociali.
[Qui]({{< ref "thumbnails" >}}) c'è anche una guida con maggiori informazioni e un [esempio]({{< ref "thumbnail_sample" >}}) se vuoi vedere come puoi farlo.
## Lingua e i18n
Blowfish è ottimizzato per siti Web multilingue completi e le risorse tematiche sono tradotte in diverse lingue immediatamente. La configurazione della lingua ti consente di generare più versioni dei tuoi contenuti per fornire un'esperienza personalizzata ai tuoi visitatori nella loro lingua madre.
Il tema attualmente supporta le seguenti lingue per impostazione predefinita:
| Language | Code |
| ---------------------------- | ------- |
| Arabic | `ar` |
| Bulgarian | `bg` |
| Bengali | `bn` |
| Catalan | `ca` |
| Czech | `cs` |
| German | `de` |
| English | `en` |
| Esperanto | `eo` |
| Spanish (Spain) | `es` |
| Finnish | `fi` |
| French | `fr` |
| Hebrew | `he` |
| Croatian | `hr` |
| Hungarian | `hu` |
| Indonesian | `id` |
| Italian | `it` |
| Japanese | `ja` |
| Korean | `ko` |
| Dutch | `nl` |
| Polish | `pl` |
| Portuguese (Brazil) | `pt-br` |
| Portuguese (Portugal) | `pt-pt` |
| Romanian | `ro` |
| Russian | `ru` |
| Turkish | `tr` |
| Vietnamese | `vi` |
| Ukrainian | `uk` |
| Simplified Chinese (China) | `zh-cn` |
| Traditional Chinese (Taiwan) | `zh-tw` |
Le traduzioni predefinite possono essere sovrascritte creando un file personalizzato in "i18n/[code].yaml" che contiene le stringhe di traduzione. Puoi anche utilizzare questo metodo per aggiungere nuove lingue. Se desideri condividere una nuova traduzione con la community, [apri una richiesta pull](https://github.com/nunocoracao/blowfish/pulls).
### Configurazione
Per essere il più flessibili possibile, è necessario creare un file di configurazione lingua per ciascuna lingua sul sito web. Per impostazione predefinita Blowfish include una configurazione della lingua inglese in `config/_default/linguals.en.toml`.
Il file predefinito può essere utilizzato come modello per creare lingue aggiuntive o rinominato se desideri creare il tuo sito web in una lingua diversa dall'inglese. Basta nominare il file utilizzando il formato "lingue.[language-code].toml".
{{< alert >}}
**Nota:** assicurati che il parametro `defaultContentLanguage` nella [configurazione del sito](#site-configuration) corrisponda al codice della lingua nel nome del file di configurazione della lingua.
{{< /alert >}}
#### Globale
<!-- prettier-ignore-start -->
| Name | Default | Description |
| -------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `languageCode` | `"en"` | Il codice della lingua Hugo per questo file. Può essere una lingua di livello superiore (ad esempio "en") o una variante secondaria (ad esempio "en-au") e deve corrispondere al codice della lingua nel nome del file. Hugo si aspetta che questo valore sia sempre in minuscolo. Per una corretta conformità HTML, imposta il parametro "isoCode" che fa distinzione tra maiuscole e minuscole. |
| `languageName` | `"English"` | Il nome della lingua. |
| `weight` | `1` | Il peso determina l'ordine delle lingue durante la creazione di siti multilingue. |
| `title` | `"Blowfish"` | Il titolo del sito web. Questo verrà visualizzato nell'intestazione e nel piè di pagina del sito. |
<!-- prettier-ignore-end -->
#### Parametri
<!-- prettier-ignore-start -->
| Name | Default | Description |
| ---------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `params.displayName` | `"EN"` | Il nome utilizzato quando la lingua appare sul sito web. |
| `params.isoCode` | `"en"` | Il codice della lingua ISO per scopi di metadati HTML. Può essere una lingua di livello superiore (es. `en`) o una sottovariante (es. `en-AU`). |
| `params.rtl` | `false` | Se si tratta o meno di un linguaggio RTL. Imposta su "true" per ridisporre il contenuto da destra a sinistra. Blowfish supporta pienamente l'uso simultaneo dei linguaggi RTL e LTR e si adatterà dinamicamente ad entrambi. |
| `params.dateFormat` | `"2 January 2006"` | Come vengono formattate le date in questa lingua. Fare riferimento alla [documentazione di Hugo](https://gohugo.io/functions/format/#gos-layout-string) per i formati accettabili. |
| `params.logo` | _Not set_ | Il percorso relativo al file del logo del sito all'interno della cartella "assets/". Il file del logo deve essere fornito con una risoluzione 2x e supporta qualsiasi dimensione dell'immagine. |
| `params.secondaryLogo` | _Not set_ | The relative path to the secondary site logo file within the `assets/` folder. The logo file should be provided at 2x resolution and supports any image dimensions. This should have an inverted/contrasting colour scheme to `logo`. If set, this logo will be shown when users toggle from the `defaultAppearance` mode. |
| `params.description` | _Not set_ | The website description. This will be used in the site metadata. |
| `params.copyright` | _Not set_ | A Markdown string for the site footer copyright message can include the placeholder { year } to dynamically insert the current year. If none is provided, Blowfish will automatically generate a copyright string using the site `title`. |
<!-- prettier-ignore-end -->
#### Author
| Name | Default | Description |
| ----------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `author.name` | _Not set_ | The author's name. This will be displayed in article footers, and on the homepage when the profile layout is used. |
| `author.image` | _Not set_ | Path to the image file of the author. The image should be a 1:1 aspect ratio. The image can be placed in the site's `assets/` folder or can be external url. |
| `author.headline` | _Not set_ | A Markdown string containing the author's headline. It will be displayed on the profile homepage under the author's name. |
| `author.bio` | _Not set_ | A Markdown string containing the author's bio. It will be displayed in article footers. |
| `author.links` | _Not set_ | The links to display alongside the author's details. The config file contains example links which can simply be uncommented to enable. The order that the links are displayed is determined by the order they appear in the array. Custom links can be added by providing corresponding SVG icon assets in `assets/icons/`. |
<!-- prettier-ignore-end -->
### Menus
Blowfish also supports language-specific menu configurations. Menu config files follow the same naming format as the languages file. Simply provide the language code in the file name to tell Hugo which language the file relates to.
Menu config files are named with the format `menus.[language-code].toml`. Always ensure that the language code used in the menus configuration matches the languages configuration.
The [Getting Started]({{< ref "getting-started#menus" >}}) section explains more about the structure of this file. You can also refer to the [Hugo menu docs](https://gohugo.io/content-management/menus/) for more configuration examples.
## Theme parameters
Blowfish provides a large number of configuration parameters that control how the theme functions. The table below outlines every available parameter in the `config/_default/params.toml` file.
Many of the article defaults here can be overridden on a per article basis by specifying it in the front matter. Refer to the [Front Matter]({{< ref "front-matter" >}}) section for further details.
<!-- prettier-ignore-start -->
### Global
| Name | Default | Description |
| ------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `colorScheme` | `"blowfish"` | The theme colour scheme to use. Valid values are `blowfish` (default), `avocado`, `fire`, `ocean`, `forest`, `princess`, `neon`, `bloody`, `terminal`, `marvel`, `noir`, `autumn`, `congo`, and`slate`. Refer to the [Colour Schemes]({{< ref "getting-started#colour-schemes" >}}) section for more details. |
| `defaultAppearance` | `"light"` | The default theme appearance, either `light` or `dark`. |
| `autoSwitchAppearance` | `true` | Whether the theme appearance automatically switches based upon the visitor's operating system preference. Set to `false` to force the site to always use the `defaultAppearance`. |
| `enableSearch` | `false` | Whether site search is enabled. Set to `true` to enable search functionality. Note that the search feature depends on the `outputs.home` setting in the [site configuration](#site-configuration) being set correctly. |
| `enableCodeCopy` | `false` | Whether copy-to-clipboard buttons are enabled for `<code>` blocks. The `highlight.noClasses` parameter must be set to `false` for code copy to function correctly. Read more about [other configuration files](#other-configuration-files) below. |
| `mainSections` | _Not set_ | The sections that should be displayed in the recent articles list. If not provided the section with the greatest number of articles is used. |
| `showViews` | _Not set_ | Whether or not articles and list views are displayed. This requires firebase integrations to be enabled, look below. |
| `showLikes` | _Not set_ | Whether or not articles and list likes are displayed. This requires firebase integrations to be enabled, look below. |
| `robots` | _Not set_ | String that indicates how robots should handle your site. If set, it will be output in the page head. Refer to [Google's docs](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives) for valid values. |
| `disableImageZoom` | `false` | Disables image zoom feature across all the images in the site. |
| `disableImageOptimization` | `false` | Disables image resize and optimization features across all the images in the site. |
| `disableTextInHeader` | `false` | Disables text in header, useful for logo based headers. |
| `defaultBackgroundImage` | _Not set_ | Default background image for both `background` homepage layout and `background` hero style |
| `defaultFeaturedImage` | _Not set_ | Default background image for all `featured` images across articles, will be overridden by a local `featured` image. |
| `highlightCurrentMenuArea` | _Not set_ | Marks menu entries in the main menu when selected |
| `smartTOC` | _Not set_ | Activate smart Table of Contents, items in view will be highlighted. |
| `smartTOCHideUnfocusedChildren` | _Not set_ | When smart Table of Contents is turned on, this will hide deeper levels of the table when they are not in focus. |
### Header
| Name | Default | Description |
| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------- |
| `header.layout` | `"basic"` | Defines the header for the entire site, supported values are `basic`, `fixed`, `fixed-fill`, and `fixed-fill-blur`. |
### Footer
| Name | Default | Description |
| ------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `footer.showMenu` | `true` | Show/hide the footer menu, which can be configured in the `[[footer]]` section of the `config/_default/menus.en.toml` file. |
| `footer.showCopyright` | `true` | Whether or not to show the copyright string in the site footer. Note that the string itself can be customised using the `copyright` parameter in the [languages configuration](#language-and-i18n). |
| `footer.showThemeAttribution` | `true` | Whether or not to show the "powered by" theme attribution in the site footer. If you choose to disable this message, please consider attributing the theme somewhere else on your site (for example, on your about page). |
| `footer.showAppearanceSwitcher` | `false` | Whether or not to show the appearance switcher in the site footer. The browser's local storage is used to persist the visitor's preference. |
| `footer.showScrollToTop` | `true` | When set to `true` the scroll to top arrow is displayed. |
### Homepage
| Name | Default | Description |
| ------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `homepage.layout` | `"profile"` | The layout of the homepage. Valid values are `page`, `profile`, `hero`, `card`, `background`, or `custom`. When set to `custom`, you must provide your own layout by creating a `/layouts/partials/home/custom.html` file. Refer to the [Homepage Layout]({{< ref "homepage-layout" >}}) section for more details. |
| `homepage.homepageImage` | _Not set_ | Image to be used in `hero` and `card` layouts. Can be set as local image from asset directory or external image url. Refer to the [Homepage Layout]({{< ref "homepage-layout" >}}) section for more details. |
| `homepage.showRecent` | `false` | Whether or not to display the recent articles list on the homepage. |
| `homepage.showRecentItems` | 5 | How many articles to display if showRecent is true. If variable is set to 0 or if it isn't defined the system will default to 5 articles. |
| `homepage.showMoreLink` | `false` | Whether or not to display a show more link at the end of your posts that takes the user to a predefined place. |
| `homepage.showMoreLinkDest` | `/posts` | The destination of the show more button. |
| `homepage.cardView` | `false` | Display recent articles as a gallery of cards. |
| `homepage.cardViewScreenWidth` | `false` | Enhance the width of the recent articles card gallery to take the full width available. |
| `homepage.layoutBackgroundBlur` | `false` | Makes the background image in the homepage layout blur with the scroll |
### Article
| Name | Default | Description |
| ------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `article.showDate` | `true` | Whether or not article dates are displayed. |
| `article.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `article.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `article.showDateOnlyInArticle` | `false` | Show date within article even if not displayed in article listings/cards. |
| `article.showDateUpdated` | `false` | Whether or not the dates articles were updated are displayed. |
| `article.showAuthor` | `true` | Whether or not the author box is displayed in the article footer. |
| `article.showAuthorBottom` | `false` | Author boxes are displayed at the bottom of each page instead of the top. |
| `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. |
| `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll |
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. |
| `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. |
| `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. |
| `article.editURL` | _Not set_ | When `article.showEdit` is active, the URL for the edit link. |
| `article.editAppendPath` | `true` | When `article.showEdit` is active, whether or not the path to the current article should be appended to the URL set at `article.editURL`. |
| `article.seriesOpened` | `false` | Whether or not the series module will be displayed open by default or not. |
| `article.showHeadingAnchors` | `true` | Whether or not heading anchor links are displayed alongside headings within articles. |
| `article.showPagination` | `true` | Whether or not the next/previous article links are displayed in the article footer. |
| `article.invertPagination` | `false` | Whether or not to flip the direction of the next/previous article links. |
| `article.showReadingTime` | `true` | Whether or not article reading times are displayed. |
| `article.showTableOfContents` | `false` | Whether or not the table of contents is displayed on articles. |
| `article.showRelatedContent` | `false` | Display related content for each post. Might required additional configuration to your `config.toml`. Please check the theme `config.toml` if you want to enable this feature and copy all the relevant _related_ entries. Also check [Hugo's docs](https://gohugo.io/content-management/related/) on related content. |
| `article.relatedContentLimit` | `3` | Limit of related articles to display if `showRelatedContent` is turned on. |
| `article.showTaxonomies` | `false` | Whether or not the taxonomies related to this article are displayed. |
| `article.showAuthorsBadges` | `false` | Whether the `authors` taxonomies are are displayed in the article or list header. This requires the setup of `multiple authors` and the `authors` taxonomy. Check [this page]({{< ref "multi-author" >}}) for more details on how to configure that feature. |
| `article.showWordCount` | `false` | Whether or not article word counts are displayed. |
| `article.showComments` | `false` | Whether or not the [comments partial]({{< ref "partials#comments" >}}) is included after the article footer. |
| `article.sharingLinks` | _Not set_ | Which sharing links to display at the end of each article. When not provided, or set to `false` no links will be displayed. Available values are: "linkedin", "bluesky", "mastodon", "twitter", "reddit", "pinterest", "facebook", "email", "whatsapp", and "telegram" |
| `article.showZenMode` | `false` | Flag to activate Zen Mode reading feature for articles. |
### List
| Name | Default | Description |
| ---------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. |
| `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. |
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll |
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. |
| `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). |
| `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. |
| `list.showLikes` | `false` | Whether or not list likes are displayed. This requires firebase integrations to be enabled, look below. |
| `list.showCards` | `false` | Whether or not each article is displayed as a card or as simple inline text. |
| `list.orderByWeight` | `false` | Whether or not articles are sorted by [weights](https://gohugo.io/methods/page/weight/). |
| `list.groupByYear` | `true` | Whether or not articles are grouped by year on list pages. |
| `list.cardView` | `false` | Display lists as a gallery of cards. |
| `list.cardViewScreenWidth` | `false` | Enhance the width of card galleries in lists to take the full width available. |
| `list.constrainItemsWidth` | `false` | Limit item width to `prose` to increase readability. Useful when no feature images are available. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on articles. |
### Sitemap
| Name | Default | Description |
| ----------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sitemap.excludedKinds` | `["taxonomy", "term"]` | Kinds of content that should be excluded from the generated `/sitemap.xml` file. Refer to the [Hugo docs](https://gohugo.io/templates/section-templates/#page-kinds) for acceptable values. |
### Taxonomy
| Name | Default | Description |
| ------------------------------ | --------- | ---------------------------------------------------------------------------------------------------------- |
| `taxonomy.showTermCount` | `true` | Whether or not the number of articles within a taxonomy term is displayed on the taxonomy listing. |
| `taxonomy.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each taxonomy page. |
| `taxonomy.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `taxonomy.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the taxonomy header. |
| `taxonomy.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `taxonomy.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `taxonomy.showTableOfContents` | `false` | Whether or not the table of contents is displayed on taxonomies. |
| `taxonomy.cardView` | `false` | Display lists as a gallery of cards. |
### Term
| Name | Default | Description |
| -------------------------- | --------- | ---------------------------------------------------------------------------------------------------------- |
| `term.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each term page. |
| `term.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `term.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the term header. |
| `term.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `term.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `term.showTableOfContents` | `false` | Whether or not the table of contents is displayed on terms. |
| `term.groupByYear` | `false` | Whether or not articles are grouped by year on term pages. |
| `term.cardView` | `false` | Display lists as a gallery of cards. |
| `term.cardViewScreenWidth` | `false` | Enhance the width of card galleries in lists to take the full width available. |
### Firebase
| Name | Default | Description |
| ---------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `firebase.apiKey` | _Not set_ | Firebase apiKey, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.authDomain` | _Not set_ | Firebase authDomain, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.projectId` | _Not set_ | Firebase projectId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.storageBucket` | _Not set_ | Firebase storageBucket, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.messagingSenderId` | _Not set_ | Firebase messagingSenderId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.appId` | _Not set_ | Firebase appId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.measurementId` | _Not set_ | Firebase measurementId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
### Fathom Analytics
| Name | Default | Description |
| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `fathomAnalytics.site` | _Not set_ | The site code generated by Fathom Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `fathomAnalytics.domain` | _Not set_ | If using a custom domain with Fathom Analytics, provide it here to serve `script.js` from the custom domain. |
### Umami Analytics
| Name | Default | Description |
| -------------------------- | --------- |----------------------------------------------------------------------------------------------------------------------------------------------------|
| `umamiAnalytics.websiteid` | _Not set_ | The site code generated by Umami Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `umamiAnalytics.domain` | _Not set_ | If using a custom domain with Umami Analytics, provide it here to serve `script.js` from the custom domain. |
| `umamiAnalytics.dataDomains` | _Not set_ | If you want the tracker to only run on specific domains, provide it for your tracker script. This is a comma delimited list of domain names. Such as "yoursite.com,yoursite2.com". |
| `umamiAnalytics.scriptName` | script.js | The name of the `script.js` used for anti-ad-blocking is configured by the environment variable `TRACKER_SCRIPT_NAME` |
| `umamiAnalytics.enableTrackEvent` | true | When set to `true` track event will add automatically. If you do not want to add track event, set it to `false`. |
### Seline Analytics
| Name | Default | Description |
|-----------------------------------|-----------|-------------------------------------------------------------------------------------------------------------------------------------------|
| `selineAnalytics.token` | _Not set_ | The token generated by Seline Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `selineAnalytics.enableTrackEvent` | true | When set to `true` track event will add automatically. If you do not want to add track event, set it to `false`. |
### BuyMeACoffee
| Name | Default | Description |
| ----------------------------------- | --------- | --------------------------------------------------------------------------- |
| `buymeacoffee.identifier` | _Not set_ | The identifier to the target buymeacoffee account. |
| `buymeacoffee.globalWidget` | _Not set_ | Activate the global buymeacoffee widget. |
| `buymeacoffee.globalWidgetMessage` | _Not set_ | Message what will be displayed the first time a new user lands on the site. |
| `buymeacoffee.globalWidgetColor` | _Not set_ | Widget color in hex format. |
| `buymeacoffee.globalWidgetPosition` | _Not set_ | Position of the widget, i.e. "Left" or "Right" |
### Verifications
| Name | Default | Description |
| ------------------------ | --------- | --------------------------------------------------------------------------------------- |
| `verification.google` | _Not set_ | The site verification string provided by Google to be included in the site metadata. |
| `verification.bing` | _Not set_ | The site verification string provided by Bing to be included in the site metadata. |
| `verification.pinterest` | _Not set_ | The site verification string provided by Pinterest to be included in the site metadata. |
| `verification.yandex` | _Not set_ | The site verification string provided by Yandex to be included in the site metadata. |
<!-- prettier-ignore-end -->
## RSSNext
| Name | Default | Description |
| ------------------------ | --------- |--------------------------------------------------------------------------------------------------------------------------------------|
| `rssnext.feedId` | _Not set_ | The rss `feedId` string provided by [RSSNext/Follow](https://follow.is/) to be included in the `rss.xml`, which can helps to claim rss feed as your own. |
| `rssnext.userId` | _Not set_ | The rss `userId` string provided by [RSSNext/Follow](https://follow.is/) to be included in the `rss.xml`, which can helps to claim rss feed as your own. |
## Other configuration files
The theme also includes a `markup.toml` configuration file. This file contains some important parameters that ensure that Hugo is correctly configured to generate sites built with Blowfish.
Always ensure this file is present in the config directory and that the required values are set. Failure to do so may cause certain features to function incorrectly and could result in unintended behaviour.

View file

@ -0,0 +1,374 @@
---
title: "設定"
weight: 4
draft: false
description: "Blowfish で使えるすべての設定変数"
slug: "configuration"
tags: ["config", "docs"]
series: ["Documentation"]
series_order: 4
---
Blowfish は高度にカスタマイズ可能なテーマであり、最新の Hugo 機能を使用して設定方法をシンプルにしています。
このテーマには、基本的なブログまたは静的サイトをすぐに立ち上げて実行できるデフォルト設定が付属しています。
{{< alert "fire" >}}
Blowfish を簡単に使い始められるように、新しい CLI ツールをリリースしました。インストールと設定に役立ちます。 グローバルに CLI ツールをインストールするには、以下を使用します。
```bash
npx blowfish-tools
```
{{< /alert >}}
> テーマにバンドルされている設定ファイルは、デフォルトの Hugo 構文である TOML 形式で提供されています。必要に応じて、設定を YAML または JSON に変換できます。
デフォルトのテーマ設定は各ファイルに記載されているため、必要に応じて設定を自由に調整できます。
{{< alert >}}
[インストール手順]({{< ref "/docs/installation#set-up-theme-configuration-files" >}})で概説されているように、Hugo プロジェクトの `config/_default/` フォルダ内のファイルを修正し、プロジェクトルートの `config.toml` ファイルを削除することで、テーマ設定を調整する必要があります。
{{< /alert >}}
## サイト設定
テーマ全体で標準の Hugo 設定変数が適用されますが、最適なエクスペリエンスを得るために設定する必要がある特定の事項があります。
サイト設定は `config/_default/config.toml` ファイルで管理されます。 下の表は、Blowfish が活用するすべての設定の概要を示しています。
この表で提供されている変数名は、TOML データ構造を簡素化するためにドット表記を使用していることに注意してください(つまり、 `outputs.home``[outputs] home` を指します)。
<!-- prettier-ignore-start -->
| 名前 | デフォルト | 説明 |
|---|---|---|
| `theme` | `"blowfish"` | Hugo Modules を使用している場合は、この設定値を削除する必要があります。 他のすべてのインストールタイプでは、テーマが機能するためにこれを `blowfish` に設定する必要があります。 |
| `baseURL` | _未設定_ | ウェブサイトのルートへの URL です。 |
| `defaultContentLanguage` | `"en"` | この値は、テーマコンポーネントとコンテンツのデフォルト言語を決定します。 サポートされている言語コードについては、以下の[言語と i18n](#言語と-i18n) セクションを参照してください。 |
| `enableRobotsTXT` | `true` | 有効にすると、検索エンジンがサイト全体をクロールできるようにする `robots.txt` ファイルがサイトルートに作成されます。 あらかじめ作成した独自の `robots.txt` を提供する場合は、`false` に設定し、ファイルを `static` ディレクトリに配置します。 完全に制御するには、このファイルを生成するための[カスタムレイアウト]({{< ref "content-examples#カスタムレイアウト" >}})を提供できます。 |
| `pagination.pagerSize` | `10` | 記事リストの各ページにリストされる記事の数です。 |
| `summaryLength` | `0` | [フロントマター]({{< ref "front-matter" >}})で提供されていない場合に、記事の概要を生成するために使用される単語の数です。 値 `0` は最初の文を使用します。 概要が非表示になっている場合、この値は効果がありません。 |
| `outputs.home` | `["HTML", "RSS", "JSON"]` | サイト用に生成される出力形式です。 Blowfish では、すべてのテーマコンポーネントが正しく機能するために HTML、RSS、JSON が必要です。 |
| `permalinks` | _未設定_ | パーマリンクの設定については、[Hugo ドキュメント](https://gohugo.io/content-management/urls/#permalinks)を参照してください。 |
| `taxonomies` | _未設定_ | 分類の設定については、[コンテンツの整理]({{< ref "getting-started#コンテンツの整理" >}})セクションを参照してください。 |
<!-- prettier-ignore-end -->
## サムネイル
Blowfish は、記事に視覚的なサポートを簡単に追加できるように構築されています。Hugo の記事構造に慣れている場合は、記事フォルダ内に `feature*` で始まる画像ファイル(ほとんどすべての形式がサポートされていますが、`.png` または `.jpg` をお勧めしますを配置するだけです。これで、Blowfish はサイト内でサムネイルとして画像を使用したり、ソーシャルプラットフォーム全体で <a target="_blank" href="https://oembed.com/">oEmbed</a> カードに使用したりできます。
[こちら]({{< ref "thumbnails" >}})には、より詳細な情報と、どのように設定できるかを確認したい場合の[サンプル]({{< ref "thumbnail_sample" >}})を含むガイドもあります。
## 言語と i18n
Blowfish は多言語ウェブサイト向けに最適化されており、テーマアセットはすぐに使えるように複数の言語に翻訳されています。 言語設定を使用すると、コンテンツの複数のバージョンを生成して、訪問者に母国語でカスタマイズされたエクスペリエンスを提供できます。
このテーマは現在、デフォルトで次の言語をサポートしています:
| 言語 | コード |
|---|---|
| アラビア語 | `ar` |
| ブルガリア語 | `bg` |
| ベンガル語 | `bn` |
| カタロニア語 | `ca` |
| チェコ語 | `cs` |
| ドイツ語 | `de` |
| 英語 | `en` |
| エスペラント語 | `eo` |
| スペイン語(スペイン) | `es` |
| フィンランド語 | `fi` |
| フランス語 | `fr` |
| ヘブライ語 | `he` |
| クロアチア語 | `hr` |
| ハンガリー語 | `hu` |
| インドネシア語 | `id` |
| イタリア語 | `it` |
| 日本語 | `ja` |
| 韓国語 | `ko` |
| オランダ語 | `nl` |
| ポーランド語 | `pl` |
| ポルトガル語(ブラジル) | `pt-br` |
| ポルトガル語(ポルトガル) | `pt-pt` |
| ルーマニア語 | `ro` |
| ロシア語 | `ru` |
| トルコ語 | `tr` |
| ベトナム語 | `vi` |
| 中国語(簡体字) | `zh-cn` |
| 中国語(繁体字) | `zh-tw` |
デフォルトの翻訳は、翻訳文字列を含むカスタムファイル `i18n/[言語コード].yaml` を作成することでオーバーライドできます。 この方法を使用して新しい言語を追加することもできます。 新しい翻訳をコミュニティと共有したい場合は、[プルリクエストを開いて](https://github.com/nunocoracao/blowfish/pulls)ください。
### 設定
可能な限り柔軟に対応するために、ウェブサイトの各言語の言語設定ファイルを作成する必要があります。デフォルトでは、Blowfish には `config/_default/languages.en.toml` に英語の言語設定が含まれています。
デフォルトのファイルは、追加の言語を作成するためのテンプレートとして使用することも、英語以外の言語でウェブサイトを作成する場合は名前を変更することもできます。`languages.[言語コード].toml` 形式を使用してファイルに名前を付けるだけです。
{{< alert >}}
**注:** [サイト設定](#サイト設定)の `defaultContentLanguage` パラメータが、言語設定ファイル名の言語コードと一致していることを確認してください。
{{< /alert >}}
#### グローバル
<!-- prettier-ignore-start -->
| 名前 | デフォルト | 説明 |
|---|---|---|
| `languageCode` | `"en"` | このファイルの Hugo 言語コードです。トップレベル言語(例: `en`)またはサブバリアント(例: `en-au`にすることができ、ファイル名の言語コードと一致する必要があります。Hugo はこの値が常に小文字であることを想定しています。適切な HTML 準拠のために、大文字と小文字を区別する `isoCode` パラメータを設定します。 |
| `languageName` | `"English"` | 言語の名前です。 |
| `weight` | `1` | 重みは、多言語サイトを構築するときの言語の順序を決定します。 |
| `title` | `"Blowfish"` | ウェブサイトのタイトルです。これは、サイトのヘッダーとフッターに表示されます。 |
<!-- prettier-ignore-end -->
#### パラメーター
<!-- prettier-ignore-start -->
| 名前 | デフォルト | 説明 |
|---|---|---|
| `params.displayName` | `"EN"` | ウェブサイトに言語が表示されるときに使用される名前です。 |
| `params.isoCode` | `"en"` | HTML メタデータ用の ISO 言語コードです。トップレベル言語(例: `en`)またはサブバリアント(例: `en-AU`)にすることができます。 |
| `params.rtl` | `false` | これが RTL 言語かどうかです。`true` に設定すると、コンテンツが右から左に並べ替えられます。 Blowfish は RTL 言語と LTR 言語の同時使用を完全にサポートしており、両方に動的に調整されます。 |
| `params.dateFormat` | `"2 January 2006"` | この言語での日付のフォーマット方法です。使用できる形式については、[Hugo ドキュメント](https://gohugo.io/functions/format/#gos-layout-string)を参照してください。 |
| `params.logo` | _未設定_ | `assets/` フォルダ内のサイトロゴファイルへの相対パスです。ロゴファイルは2倍の解像度で提供する必要があり、あらゆる画像サイズをサポートしています。 |
| `params.secondaryLogo` | _未設定_ | `assets/` フォルダ内のセカンダリサイトロゴファイルへの相対パスです。 ロゴファイルは2倍の解像度で提供する必要があり、あらゆる画像サイズをサポートしています。 これは、`logo` とは反転/対照的なカラースキームである必要があります。設定されている場合、このロゴは、ユーザーが `defaultAppearance` モードから切り替えたときに表示されます。 |
| `params.description` | _未設定_ | ウェブサイトの説明です。これはサイトのメタデータで使用されます。 |
| `params.copyright` | _未設定_ | サイトフッターの著作権メッセージの Markdown 文字列には、プレースホルダ { year } を含めて現在の年を動的に挿入できます。指定されていない場合、Blowfish はサイト `title` を使用して著作権文字列を自動的に生成します。 |
<!-- prettier-ignore-end -->
#### 著者(Author)
<!-- prettier-ignore-start -->
| 名前 | デフォルト    | 説明 |
|---|---|---|
| `author.name` | _未設定_ | 著者の名前です。これは、記事のフッターと、プロフィールレイアウトが使用されている場合はホームページに表示されます。 |
| `author.image` | _未設定_ | 著者の画像ファイルへのパスです。画像は縦横比 1:1 である必要があります。画像は、サイトの `assets/` フォルダに配置することも、外部 URL にすることもできます。 |
| `author.headline` | _未設定_ | 著者の見出しを含む Markdown 文字列です。プロフィールホームページの著者の名前に下に表示されます。 |
| `author.bio` | _未設定_ | 著者の略歴を含む Markdown 文字列です。記事のフッターに表示されます。 |
| `author.links` | _未設定_ | 著者の詳細と一緒に表示するリンクです。設定ファイルには、コメントを外すだけで有効になるリンクの例が含まれています。リンクが表示される順序は、配列に表示される順序によって決まります。`assets/icons/` に対応する SVG アイコンアセットを提供することで、カスタムリンクを追加できます。 |
<!-- prettier-ignore-end -->
### メニュー(Menus)
Blowfish は、言語固有のメニュー設定もサポートしています。メニュー設定ファイルは、言語ファイルと同じ命名形式に従います。ファイル名に言語コードを指定するだけで、Hugo はファイルがどの言語に関連しているかを認識します。
メニュー設定ファイルの名前は、 `menus.[language-code].toml` 形式です。メニュー設定で使用される言語コードが言語設定と一致していることを常に確認してください。
[はじめに]({{< ref "getting-started#menus" >}})セクションでは、このファイルの構造について詳しく説明しています。詳細な設定例については、[Hugo メニュー ドキュメント](https://gohugo.io/content-management/menus/)も参照できます。
## テーマパラメーター(Theme parameters)
Blowfish は、テーマの機能を制御する多数の設定パラメータを提供します。下の表は、`config/_default/params.toml` ファイルで使用可能なすべてのパラメータの概要を示しています。
ここにある記事のデフォルトの多くは、フロントマターで指定することで、記事ごとにオーバーライドできます。詳細については、[フロントマター]({{< ref "front-matter" >}})セクションを参照してください。
<!-- prettier-ignore-start -->
### グローバル
| 名前 | デフォルト | 説明 |
|---|---|---|
| `colorScheme` | `"blowfish"` | 使用するテーマのカラースキームです。有効な値は、`blowfish`(デフォルト)、`avocado``fire``ocean``forest``princess``neon``bloody``terminal``marvel``noir``autumn``congo``slate` です。詳細については、[カラースキーム]({{< ref "getting-started#カラースキーム" >}})セクションを参照してください。 |
| `defaultAppearance` | `"light"` | デフォルトのテーマの外観です。`light` または `dark` のいずれかです。 |
| `autoSwitchAppearance` | `true` | 訪問者のオペレーティングシステムの設定に基づいてテーマの外観を自動的に切り替えるかどうかです。`false` に設定すると、サイトは常に `defaultAppearance` を使用します。 |
| `enableSearch` | `false` | サイト内検索が有効かどうかです。`true` に設定すると、検索機能が有効になります。検索機能は、[サイト設定](#サイト設定)の `outputs.home` 設定が正しく設定されているかどうかに依存することに注意してください。 |
| `enableCodeCopy` | `false` | `<code>` ブロックのクリップボードへのコピーボタンを有効にするかどうかです。コードコピーが正しく機能するには、`highlight.noClasses` パラメータを `false` に設定する必要があります。以下の[その他の設定ファイル](#その他の設定ファイル)について読んでください。 |
| `mainSections` | _未設定_ | 最近の記事リストに表示するセクションです。指定しない場合は、記事数が最も多いセクションが使用されます。 |
| `showViews` | _未設定_ | 記事とリストの表示回数を表示するかどうかです。これには Firebase 統合を有効にする必要があります。以下をご覧ください。 |
| `showLikes` | _未設定_ | 記事とリストのいいねを表示するかどうかです。これには Firebase 統合を有効にする必要があります。以下をご覧ください。 |
| `robots` | _未設定_ | ロボットがサイトをどのように処理するかを示す文字列です。設定されている場合、ページヘッダーに出力されます。有効な値については、[Google のドキュメント](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives)を参照してください。 |
| `disableImageZoom` | `false` | サイト内のすべての画像の画像ズーム機能を無効にします。 |
| `disableImageOptimization` | `false` | サイト内のすべての画像の画像サイズ変更と最適化機能を無効にします。 |
| `disableTextInHeader` | `false` | ヘッダーのテキストを無効にします。ロゴベースのヘッダーに役立ちます。 |
| `defaultBackgroundImage` | _未設定_ | `background` ホームページレイアウトと `background` ヒーロースタイルの両方のデフォルトの背景画像です。 |
| `defaultFeaturedImage` | _未設定_ | 記事全体のすべての `featured` 画像のデフォルトの背景画像です。ローカルの `featured` 画像によってオーバーライドされます。 |
| `highlightCurrentMenuArea` | _未設定_ | メインメニューのメニュー項目が選択されているときにマークを付けます。 |
| `smartTOC` | _未設定_ | スマート目次をアクティブにします。表示されている項目が強調表示されます。 |
| `smartTOCHideUnfocusedChildren` | _未設定_ | スマート目次がオンになっている場合、フォーカスされていないときに、テーブルのより深いレベルが非表示になります。 |
### ヘッダー(Header)
| 名前 | デフォルト | 説明 |
|---|---|---|
| `header.layout` | `"basic"` | サイト全体のヘッダーを定義します。サポートされている値は、`basic``fixed``fixed-fill``fixed-fill-blur` です。 |
### フッター(Footer)
| 名前 | デフォルト    | 説明 |
|---|---|---|
| `footer.showMenu` | `true` | フッターメニューを表示/非表示にします。これは、`config/_default/menus.en.toml` ファイルの `[[footer]]` セクションで設定できます。 |
| `footer.showCopyright` | `true` | サイトのフッターに著作権文字列を表示するかどうかです。文字列自体は、[言語設定](#言語と-i18n) の `copyright` パラメータを使用してカスタマイズできることに注意してください。 |
| `footer.showThemeAttribution` | `true` | サイトのフッターに「powered by」というテーマの帰属を表示するかどうかです。このメッセージを無効にする場合は、サイトの他の場所たとえば、about ページ)でテーマの帰属を検討してください。 |
| `footer.showAppearanceSwitcher` | `false` | サイトのフッターに外観スイッチャーを表示するかどうかです。 ブラウザのローカルストレージを使用して、訪問者の設定が保持されます。 |
| `footer.showScrollToTop` | `true` | `true` に設定すると、トップへスクロールの矢印が表示されます。 |
### ホームページ(Homepage)
| 名前 | デフォルト | 説明 |
|---|---|---|
| `homepage.layout` | `"profile"` | ホームページのレイアウトです。有効な値は、`page``profile``hero``card``background``custom` です。`custom` に設定した場合、`/layouts/partials/home/custom.html` ファイルを作成して独自のレイアウトを提供する必要があります。詳細については、[ホームページレイアウト]({{< ref "homepage-layout" >}}) セクションを参照してください。 |
| `homepage.homepageImage` | _未設定_ | `hero` レイアウトと `card` レイアウトで使用される画像です。アセットディレクトリからのローカル画像または外部画像 URL として設定できます。詳細については、[ホームページレイアウト]({{< ref "homepage-layout" >}}) セクションを参照してください。 |
| `homepage.showRecent` | `false` | ホームページに最近の記事リストを表示するかどうかです。 |
| `homepage.showRecentItems` | 5 | showRecent が true の場合に表示する記事の数です。変数が0に設定されている場合、または定義されていない場合は、システムはデフォルトで5つの記事に設定されます。 |
| `homepage.showMoreLink` | `false` | ユーザーを事前に定義された場所に移動する「もっと見る」リンクを投稿の最後に表示するかどうかです。 |
| `homepage.showMoreLinkDest` | `/posts` | 「もっと見る」ボタンの移動先です。 |
| `homepage.cardView` | `false` | 最近の記事をカードのギャラリーとして表示します。 |
| `homepage.cardViewScreenWidth` | `false` | 最近の記事カードギャラリーの幅を拡張して、利用可能な幅全体を使用します。 |
| `homepage.layoutBackgroundBlur` | `false` | ホームページレイアウトの背景画像をスクロールに合わせてぼかします。 |
### 記事(Article)
| 名前 | デフォルト     | 説明 |
|---|---|---|
| `article.showDate` | `true` | 記事の日付を表示するかどうかです。 |
| `article.showViews` | `false` | 記事の表示回数を表示するかどうかです。これには Firebase 統合を有効にする必要があります。以下をご覧ください。 |
| `article.showLikes` | `false` | 記事のいいねを表示するかどうかです。これには Firebase 統合を有効にする必要があります。以下をご覧ください。 |
| `article.showDateOnlyInArticle` | `false` | 記事リスト/カードに表示されていない場合でも、記事内に日付を表示します。 |
| `article.showDateUpdated` | `false` | 記事が更新された日付を表示するかどうかです。 |
| `article.showAuthor` | `true` | 記事のフッターに著者ボックスを表示するかどうかです。 |
| `article.showAuthorBottom` | `false` | 著者ボックスは、各ページの上部ではなく下部に表示されます。 |
| `article.showHero` | `false` | サムネイル画像を各記事ページ内でヒーロー画像として表示するかどうかです。 |
| `article.heroStyle` | _未設定_ | ヒーロー画像を表示するスタイルです。有効なオプションは、`basic``big``background``thumbAndBackground` です。 |
| `article.layoutBackgroundBlur` | `true` | 背景記事 heroStyle の背景画像をスクロールに合わせてぼかします。 |
| `article.layoutBackgroundHeaderSpace` | `true` | ヘッダーと本文の間にスペースを追加します。 |
| `article.showBreadcrumbs` | `false` | 記事のヘッダーにパンくずリストを表示するかどうかです。 |
| `article.showDraftLabel` | `true` | サイトが `--buildDrafts` でビルドされたときに、記事の横にドラフトインジケータを表示するかどうかです。 |
| `article.showEdit` | `false` | 記事コンテンツを編集するためのリンクを表示するかどうかです。 |
| `article.editURL` | _未設定_ | `article.showEdit` がアクティブな場合、編集リンクの URL です。 |
| `article.editAppendPath` | `true` | `article.showEdit` がアクティブな場合、現在の記事へのパスを `article.editURL` で設定された URL に追加するかどうかです。 |
| `article.seriesOpened` | `false` | シリーズモジュールがデフォルトで開いた状態で表示されるかどうかです。 |
| `article.showHeadingAnchors` | `true` | 記事内の見出しの横にアンカーリンク見出しを表示するかどうかです。 |
| `article.showPagination` | `true` | 記事のフッターに次/前の記事リンクを表示するかどうかです。 |
| `article.invertPagination` | `false` | 次/前の記事リンクの方向を反転するかどうかです。 |
| `article.showReadingTime` | `true` | 記事の読了時間を表示するかどうかです。 |
| `article.showTableOfContents` | `false` | 記事に目次を表示するかどうかです。 |
| `article.showRelatedContent` | `false` | 各投稿の関連記事を表示します。`config.toml` に追加の設定が必要になる場合があります。この機能を有効にする場合は、テーマの `config.toml` を確認し、関連するすべての _related_ エントリをコピーしてください。また、関連記事については [Hugo のドキュメント](https://gohugo.io/content-management/related/) も確認してください。 |
| `article.relatedContentLimit` | `3` | `showRelatedContent` がオンになっている場合に表示する関連記事の上限です。 |
| `article.showTaxonomies` | `false` | この記事に関連するタクソノミーを表示するかどうかです。 |
| `article.showAuthorsBadges` | `false` | `authors` タクソノミーを記事またはリストのヘッダーに表示するかどうかです。これには、「複数の著者」と `authors` タクソノミーの設定が必要です。この機能の設定方法の詳細については、[このページ]({{< ref "multi-author" >}}) を確認してください。 |
| `article.showWordCount` | `false` | 記事の単語数を表示するかどうかです。 |
| `article.showComments` | `false` | 記事のフッターの後に [コメントパーシャル]({{< ref "partials#コメント" >}}) を含めるかどうかです。 |
| `article.sharingLinks` | _未設定_ | 各記事の最後に表示する共有リンクです。指定されていないか、`false` に設定されている場合、リンクは表示されません。使用可能な値は、<br>"linkedin"、"bluesky"、<br>"mastodon"、"twitter"、"reddit"、<br>"pinterest"、"facebook"、"email"、<br>"whatsapp"、"telegram" です。 |
| `article.showZenMode` | `false` | 記事のZenモードリーダー機能を有効にするフラグです。 |
### リスト(List)
| 名前 | デフォルト    | 説明 |
| ---------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list.showHero` | `false` | 各リストページ内でサムネイル画像をヒーロー画像として表示するかどうか。 |
| `list.heroStyle` | _未設定_ | ヒーロー画像の表示スタイル。有効なオプションは `basic``big``background``thumbAndBackground` です。 |
| `list.showBreadcrumbs` | `false` | リストページのヘッダーにパンくずリストを表示するかどうか。 |
| `list.layoutBackgroundBlur` | `true` | `background` リストの heroStyle の背景画像をスクロールでぼかします。 |
| `list.layoutBackgroundHeaderSpace` | `true` | ヘッダーと本文の間にスペースを追加します。 |
| `list.showTableOfContents` | `false` | リストページに目次を表示するかどうか。 |
| `list.showSummary` | `false` | リストページに記事の要約を表示するかどうか。[フロントマター]({{< ref "front-matter" >}}) で要約が提供されていない場合、[サイト設定](#site-configuration) の `summaryLength` パラメータを使用して自動的に生成されます。 |
| `list.showViews` | `false` | リストの閲覧数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `list.showLikes` | `false` | リストのいいね数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `list.showCards` | `false` | 各記事をカードとして表示するか、シンプルなインラインテキストとして表示するかどうか。 |
| `list.orderByWeight` | `false` | 記事を[重み](https://gohugo.io/methods/page/weight/)で並べ替えるかどうか。 |
| `list.groupByYear` | `true` | リストページで記事を年別にグループ化するかどうか。 |
| `list.cardView` | `false` | リストをカードのギャラリーとして表示します。 |
| `list.cardViewScreenWidth` | `false` | リスト内のカードギャラリーの幅を、利用可能な全幅を使用するように拡張します。 |
| `list.constrainItemsWidth` | `false` | 読みやすくするために、アイテムの幅を `prose` に制限します。フィーチャー画像が利用できない場合に役立ちます。 |
| `list.showTableOfContents` | `false` | 記事に目次を表示するかどうか。 |
### サイトマップ(Sitemap)
| 名前 | デフォルト | 説明 |
| ----------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sitemap.excludedKinds` | `["taxonomy", "term"]` | 生成された `/sitemap.xml` ファイルから除外するコンテンツの種類。許容される値については、[Hugo のドキュメント](https://gohugo.io/templates/section-templates/#page-kinds)を参照してください。 |
### タクソノミー(Taxonomy)
| 名前 | デフォルト   | 説明 |
| ------------------------------ | --------- | ----------------------------------------------------------------------------------------------------------------- |
| `taxonomy.showTermCount` | `true` | タクソノミーリストにタクソノミー用語内の記事数を表示するかどうか。 |
| `taxonomy.showHero` | `false` | 各タクソノミーページ内でサムネイル画像をヒーロー画像として表示するかどうか。 |
| `taxonomy.heroStyle` | _未設定_ | ヒーロー画像の表示スタイル。有効なオプションは `basic``big``background``thumbAndBackground` です。 |
| `taxonomy.showBreadcrumbs` | `false` | タクソノミーのヘッダーにパンくずリストを表示するかどうか。 |
| `taxonomy.showViews` | `false` | 記事の閲覧数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `taxonomy.showLikes` | `false` | 記事のいいね数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `taxonomy.showTableOfContents` | `false` | タクソノミーに目次を表示するかどうか。 |
| `taxonomy.cardView` | `false` | リストをカードのギャラリーとして表示します。 |
### ターム(Term)
| 名前 | デフォルト   | 説明 |
| -------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------- |
| `term.showHero` | `false` | 各タームページ内でサムネイル画像をヒーロー画像として表示するかどうか。 |
| `term.heroStyle` | _未設定_ | ヒーロー画像の表示スタイル。有効なオプションは `basic``big``background``thumbAndBackground` です。 |
| `term.showBreadcrumbs` | `false` | タームのヘッダーにパンくずリストを表示するかどうか。 |
| `term.showViews` | `false` | 記事の閲覧数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `term.showLikes` | `false` | 記事のいいね数を表示するかどうか。これを有効にするには、Firebase の統合を有効にする必要があります。以下をご覧ください。 |
| `term.showTableOfContents` | `false` | タームに目次を表示するかどうか。 |
| `term.groupByYear` | `false` | タームページで記事を年別にグループ化するかどうか。 |
| `term.cardView` | `false` | リストをカードのギャラリーとして表示します。 |
| `term.cardViewScreenWidth` | `false` | リスト内のカードギャラリーの幅を、利用可能な全幅を使用するように拡張します。 |
### Firebase
| 名前 | デフォルト    | 説明 |
| ---------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `firebase.apiKey` | _未設定_ | Firebase との統合に必要な Firebase API キー。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.authDomain` | _未設定_ | Firebase との統合に必要な Firebase 認証ドメイン。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.projectId` | _未設定_ | Firebase との統合に必要な Firebase プロジェクト ID。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.storageBucket` | _未設定_ | Firebase との統合に必要な Firebase ストレージバケット。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.messagingSenderId` | _未設定_ | Firebase との統合に必要な Firebase メッセージング送信者 ID。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.appId` | _未設定_ | Firebase との統合に必要な Firebase アプリ ID。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
| `firebase.measurementId` | _未設定_ | Firebase との統合に必要な Firebase 測定 ID。Firebase を Blowfish に統合する方法については、[このページ]({{< ref "firebase-views" >}})を参照してください。 |
### Fathom Analytics
| 名前 | デフォルト    | 説明 |
| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fathomAnalytics.site` | _未設定_ | ウェブサイト用に Fathom Analytics によって生成されたサイトコード。詳細については、[Analytics のドキュメント]({{< ref "partials#アナリティクス" >}})を参照してください。 |
| `fathomAnalytics.domain` | _未設定_ | Fathom Analytics でカスタムドメインを使用している場合、ここに指定して、`script.js` をカスタムドメインから配信します。 |
### Umami Analytics
| 名前 | デフォルト    | 説明 |
|---|---|---|
| `umamiAnalytics.websiteid` | _未設定_ | ウェブサイト用に Umami Analytics によって生成されたサイトコード。詳細については、[Analytics のドキュメント]({{< ref "partials#アナリティクス" >}})を参照してください。 |
| `umamiAnalytics.domain` | _未設定_ | Umami Analytics でカスタムドメインを使用している場合、ここに指定して、`script.js` をカスタムドメインから配信します。 |
| `umamiAnalytics.dataDomains` | _未設定_ | トラッカーを特定のドメインでのみ実行したい場合は、トラッカースクリプトに指定します。これは、ドメイン名のカンマ区切りリストです。例えば "yoursite.com,yoursite2.com" のようになります。 |
| `umamiAnalytics.scriptName` | script.js | アンチ広告ブロックに使用される `script.js` の名前は、環境変数 `TRACKER_SCRIPT_NAME` で設定されます。 |
| `umamiAnalytics.enableTrackEvent` | `true` | `true` に設定すると、トラックイベントが自動的に追加されます。トラックイベントを追加したくない場合は、`false` に設定してください。 |
### Seline Analytics
| 名前 | デフォルト    | 説明 |
|-----------------------------------|-----------|-------------------------------------------------------------------------------------------------------------------------------------------|
| `selineAnalytics.token` | _未設定_ | ウェブサイト用に Seline Analytics によって生成されたトークン。詳細については、[Analytics のドキュメント]({{< ref "partials#アナリティクス" >}})を参照してください。 |
| `selineAnalytics.enableTrackEvent` | `true` | `true` に設定すると、トラックイベントが自動的に追加されます。トラックイベントを追加したくない場合は、`false` に設定してください。 |
### BuyMeACoffee
| 名前 | デフォルト   | 説明 |
| ----------------------------------- | --------- | -------------------------------------------------------------------------------------- |
| `buymeacoffee.identifier` | _未設定_ | ターゲットの buymeacoffee アカウントの識別子。 |
| `buymeacoffee.globalWidget` | _未設定_ | グローバル buymeacoffee ウィジェットを有効にします。 |
| `buymeacoffee.globalWidgetMessage` | _未設定_ | 新しいユーザーが初めてサイトにアクセスしたときに表示されるメッセージ。 |
| `buymeacoffee.globalWidgetColor` | _未設定_ | ウィジェットの色16進数形式。 |
| `buymeacoffee.globalWidgetPosition` | _未設定_ | ウィジェットの位置。例えば "Left" または "Right" |
### verification
| 名前 | デフォルト  | 説明 |
| ------------------------ | --------- | ------------------------------------------------------------------------------------------------------- |
| `verification.google` | _未設定_ | サイトメタデータに含まれる、Google が提供するサイト確認文字列。 |
| `verification.bing` | _未設定_ | サイトメタデータに含まれる、Bing が提供するサイト確認文字列。 |
| `verification.pinterest` | _未設定_ | サイトメタデータに含まれる、Pinterest が提供するサイト確認文字列。 |
| `verification.yandex` | _未設定_ | サイトメタデータに含まれる、Yandex が提供するサイト確認文字列。 |
<!-- prettier-ignore-end -->
## RSSNext
| 名前 | デフォルト    | 説明 |
| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rssnext.feedId` | _未設定_ | [RSSNext/Follow](https://follow.is/) によって提供される rss `feedId` 文字列。`rss.xml` に含まれ、rss フィードを自身のものとしてクレームするのに役立ちます。 |
| `rssnext.userId` | _未設定_ | [RSSNext/Follow](https://follow.is/) によって提供される rss `userId` 文字列。`rss.xml` に含まれ、rss フィードを自身のものとしてクレームするのに役立ちます。 |
## その他の設定ファイル
このテーマには `markup.toml` 設定ファイルも含まれています。このファイルには、Hugo が Blowfish で構築されたサイトを正しく生成するために重要なパラメータがいくつか含まれています。
このファイルが常に config ディレクトリに存在し、必要な値が設定されていることを確認してください。そうしないと、特定の機能が正しく機能せず、意図しない動作を引き起こす可能性があります。

View file

@ -0,0 +1,382 @@
---
title: "Configuration"
weight: 4
draft: false
description: "All the configuration variables available in Blowfish."
slug: "configuration"
tags: ["config", "docs"]
series: ["Documentation"]
series_order: 4
---
Blowfish is a highly customisable theme and uses some of the latest Hugo features to simplify how it is configured.
The theme ships with a default configuration that gets you up and running with a basic blog or static website.
{{< alert "fire" >}}
We just launched a CLI tool to help you get started with Blowfish. It will help you with installation and configuration. Install the CLI tool globally using:
```bash
npx blowfish-tools
```
{{< /alert >}}
> Configuration files bundled with the theme are provided in TOML format as this is the default Hugo syntax. Feel free to convert your config to YAML or JSON if you wish.
The default theme configuration is documented in each file so you can freely adjust the settings to meet your needs.
{{< alert >}}
As outlined in the [installation instructions]({{< ref "/docs/installation#set-up-theme-configuration-files" >}}), you should adjust your theme configuration by modifying the files in the `config/_default/` folder of your Hugo project and delete the `config.toml` file in your project root.
{{< /alert >}}
## Site configuration
Standard Hugo configuration variables are respected throughout the theme, however there are some specific things that should be configured for the best experience.
The site configuration is managed through the `config/_default/config.toml` file. The table below outlines all the settings that the Blowfish takes advantage of.
Note that the variable names provided in this table use dot notation to simplify the TOML data structure (ie. `outputs.home` refers to `[outputs] home`).
<!-- prettier-ignore-start -->
| Name | Default | Description |
| ------------------------ | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `theme` | `"blowfish"` | When using Hugo Modules this config value should be removed. For all other installation types, this must be set to `blowfish` for the theme to function. |
| `baseURL` | _Not set_ | The URL to the root of the website. |
| `defaultContentLanguage` | `"en"` | This value determines the default language of theme components and content. Refer to the [language and i18n](#language-and-i18n) section below for supported language codes. |
| `enableRobotsTXT` | `true` | When enabled, a `robots.txt` file will be created in the site root that allows search engines to crawl the entire site. If you prefer to provide your own pre-made `robots.txt`, set to `false` and place your file in the `static` directory. For complete control, you may provide a [custom layout]({{< ref "content-examples#custom-layouts" >}}) to generate this file. |
| `pagination.pagerSize` | `10` | The number of articles listed on each page of the article listing. |
| `summaryLength` | `0` | The number of words that are used to generate the article summary when one is not provided in the [front matter]({{< ref "front-matter" >}}). A value of `0` will use the first sentence. This value has no effect when summaries are hidden. |
| `outputs.home` | `["HTML", "RSS", "JSON"]` | The output formats that are generated for the site. Blowfish requires HTML, RSS and JSON for all theme components to work correctly. |
| `permalinks` | _Not set_ | Refer to the [Hugo docs](https://gohugo.io/content-management/urls/#permalinks) for permalink configuration. |
| `taxonomies` | _Not set_ | Refer to the [Organising content]({{< ref "getting-started#organising-content" >}}) section for taxonomy configuration. |
<!-- prettier-ignore-end -->
## Thumbnails
Blowfish was built so it would be easy to add visual support to your articles. If your familiar with Hugo article structure, you just need to place an image file (almost all formats are supported but we recommend `.png` or `.jpg`) that starts with `feature*` inside your article folder. And that's it, Blowfish will then able to both use the image as a thumbnail within your website as well as for <a target="_blank" href="https://oembed.com/">oEmbed</a> cards across social platforms.
[Here]({{< ref "thumbnails" >}}) is also a guide with more info and a [sample]({{< ref "thumbnail_sample" >}}) if you want to see how you can do it.
## Language and i18n
Blowfish is optimised for full multilingual websites and theme assets are translated into several languages out of the box. The language configuration allows you to generate multiple versions of your content to provide a customised experience to your visitors in their native language.
The theme currently supports the following languages by default:
| Language | Code |
| ---------------------------- | ------- |
| Arabic | `ar` |
| Bulgarian | `bg` |
| Bengali | `bn` |
| Catalan | `ca` |
| Czech | `cs` |
| German | `de` |
| English | `en` |
| Esperanto | `eo` |
| Spanish (Spain) | `es` |
| Finnish | `fi` |
| French | `fr` |
| Galician | `gl` |
| Hebrew | `he` |
| Croatian | `hr` |
| Hungarian | `hu` |
| Indonesian | `id` |
| Italian | `it` |
| Japanese | `ja` |
| Korean | `ko` |
| Dutch | `nl` |
| Persian | `fa` |
| Polish | `pl` |
| Portuguese (Brazil) | `pt-br` |
| Portuguese (Portugal) | `pt-pt` |
| Romanian | `ro` |
| Russian | `ru` |
| Turkish | `tr` |
| Vietnamese | `vi` |
| Simplified Chinese (China) | `zh-cn` |
| Traditional Chinese (Taiwan) | `zh-tw` |
The default translations can be overridden by creating a custom file in `i18n/[code].yaml` that contains the translation strings. You can also use this method to add new languages. If you'd like to share a new translation with the community, please [open a pull request](https://github.com/nunocoracao/blowfish/pulls).
### Configuration
In order to be as flexible as possible, a language configuration file needs to be created for each language on the website. By default Blowfish includes an English language configuration at `config/_default/languages.en.toml`.
The default file can be used as a template to create additional languages, or renamed if you wish to author your website in a language other than English. Simply name the file using the format `languages.[language-code].toml`.
{{< alert >}}
**Note:** Ensure the `defaultContentLanguage` parameter in the [site configuration](#site-configuration) matches the language code in your language config filename.
{{< /alert >}}
#### Global
<!-- prettier-ignore-start -->
| Name | Default | Description |
| -------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `languageCode` | `"en"` | The Hugo language code for this file. It can be a top-level language (ie. `en`) or a sub-variant (ie. `en-au`) and should match the language code in the filename. Hugo expects this value to always be in lowercase. For proper HTML compliance, set the `isoCode` parameter which is case-sensitive. |
| `languageName` | `"English"` | The name of the language. |
| `weight` | `1` | The weight determines the order of languages when building multilingual sites. |
| `title` | `"Blowfish"` | The title of the website. This will be displayed in the site header and footer. |
<!-- prettier-ignore-end -->
#### Params
<!-- prettier-ignore-start -->
| Name | Default | Description |
| ---------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `params.displayName` | `"EN"` | The name used when the language appears on the website. |
| `params.isoCode` | `"en"` | The ISO language code for HTML metadata purposes. It can be a top-level language (ie. `en`) or a sub-variant (ie. `en-AU`). |
| `params.rtl` | `false` | Whether or not this is a RTL language. Set to `true` to reflow content from right-to-left. Blowfish fully supports using RTL and LTR languages at the same time and will dynamically adjust to both. |
| `params.dateFormat` | `"2 January 2006"` | How dates are formatted in this language. Refer to the [Hugo docs](https://gohugo.io/functions/format/#gos-layout-string) for acceptable formats. |
| `params.logo` | _Not set_ | The relative path to the site logo file within the `assets/` folder. The logo file should be provided at 2x resolution and supports any image dimensions. |
| `params.secondaryLogo` | _Not set_ | The relative path to the secondary site logo file within the `assets/` folder. The logo file should be provided at 2x resolution and supports any image dimensions. This should have an inverted/contrasting colour scheme to `logo`. If set, this logo will be shown when users toggle from the `defaultAppearance` mode. |
| `params.description` | _Not set_ | The website description. This will be used in the site metadata. |
| `params.copyright` | _Not set_ | A Markdown string for the site footer copyright message can include the placeholder { year } to dynamically insert the current year. If none is provided, Blowfish will automatically generate a copyright string using the site `title`. |
<!-- prettier-ignore-end -->
##### Author
| Name | Default | Description |
| ---------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `params.author.name` | _Not set_ | The author's name. This will be displayed in article footers, and on the homepage when the profile layout is used. |
| `params.author.email` | _Not set_ | The author's email. This will be used if the reply-via-email functionality is enabled. |
| `params.author.image` | _Not set_ | Path to the image file of the author. The image should be a 1:1 aspect ratio. The image can be placed in the site's `assets/` folder or can be external url. |
| `params.author.imageQuality` | `96` | The author's image file will be treated as a "high quality" image to minimize artifacts on the front page. Value range 1-100. |
| `params.author.headline` | _Not set_ | A Markdown string containing the author's headline. It will be displayed on the profile homepage under the author's name. |
| `params.author.bio` | _Not set_ | A Markdown string containing the author's bio. It will be displayed in article footers. |
| `params.author.links` | _Not set_ | The links to display alongside the author's details. The config file contains example links which can simply be uncommented to enable. The order that the links are displayed is determined by the order they appear in the array. Custom links can be added by providing corresponding SVG icon assets in `assets/icons/`. |
<!-- prettier-ignore-end -->
### Menus
Blowfish also supports language-specific menu configurations. Menu config files follow the same naming format as the languages file. Simply provide the language code in the file name to tell Hugo which language the file relates to.
Menu config files are named with the format `menus.[language-code].toml`. Always ensure that the language code used in the menus configuration matches the languages configuration.
The [Getting Started]({{< ref "getting-started#menus" >}}) section explains more about the structure of this file. You can also refer to the [Hugo menu docs](https://gohugo.io/content-management/menus/) for more configuration examples.
## Theme parameters
Blowfish provides a large number of configuration parameters that control how the theme functions. The table below outlines every available parameter in the `config/_default/params.toml` file.
Many of the article defaults here can be overridden on a per article basis by specifying it in the front matter. Refer to the [Front Matter]({{< ref "front-matter" >}}) section for further details.
<!-- prettier-ignore-start -->
### Global
| Name | Default | Description |
| ------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `colorScheme` | `"blowfish"` | The theme colour scheme to use. Valid values are `blowfish` (default), `avocado`, `fire`, `ocean`, `forest`, `princess`, `neon`, `bloody`, `terminal`, `marvel`, `noir`, `autumn`, `congo`, and`slate`. Refer to the [Colour Schemes]({{< ref "getting-started#colour-schemes" >}}) section for more details. |
| `defaultAppearance` | `"light"` | The default theme appearance, either `light` or `dark`. |
| `autoSwitchAppearance` | `true` | Whether the theme appearance automatically switches based upon the visitor's operating system preference. Set to `false` to force the site to always use the `defaultAppearance`. |
| `enableSearch` | `false` | Whether site search is enabled. Set to `true` to enable search functionality. Note that the search feature depends on the `outputs.home` setting in the [site configuration](#site-configuration) being set correctly. |
| `enableCodeCopy` | `false` | Whether copy-to-clipboard buttons are enabled for `<code>` blocks. The `highlight.noClasses` parameter must be set to `false` for code copy to function correctly. Read more about [other configuration files](#other-configuration-files) below. |
| `replyByEmail` | `false` | Whether the reply-by-email link is enabled after post. The `author.email` parameter in `config/_default/languages.en.toml` must be set. |
| `forgejoDefaultServer` | _Not set_ | The default `server` parameter for the `forgejo` shortcode. |
| `giteaDefaultServer` | _Not set_ | The default `server` parameter for the `gitea` shortcode. |
| `mainSections` | _Not set_ | The sections that should be displayed in the recent articles list. If not provided the section with the greatest number of articles is used. |
| `showViews` | _Not set_ | Whether or not articles and list views are displayed. This requires firebase integrations to be enabled, look below. |
| `showLikes` | _Not set_ | Whether or not articles and list likes are displayed. This requires firebase integrations to be enabled, look below. |
| `robots` | _Not set_ | String that indicates how robots should handle your site. If set, it will be output in the page head. Refer to [Google's docs](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives) for valid values. |
| `disableImageZoom` | `false` | Disables image zoom feature across all the images in the site. |
| `disableImageOptimization` | `false` | Disables image resize and optimization features across all the images in the site. |
| `backgroundImageWidth` | `1200` | Width (in pixels) to scale background images to. |
| `disableTextInHeader` | `false` | Disables text in header, useful for logo based headers. |
| `defaultBackgroundImage` | _Not set_ | Default background image for both `background` homepage layout and `background` hero style |
| `defaultFeaturedImage` | _Not set_ | Default background image for all `featured` images across articles, will be overridden by a local `featured` image. |
| `highlightCurrentMenuArea` | _Not set_ | Marks menu entries in the main menu when selected |
| `smartTOC` | _Not set_ | Activate smart Table of Contents, items in view will be highlighted. |
| `smartTOCHideUnfocusedChildren` | _Not set_ | When smart Table of Contents is turned on, this will hide deeper levels of the table when they are not in focus. |
### Header
| Name | Default | Description |
| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------- |
| `header.layout` | `"basic"` | Defines the header for the entire site, supported values are `basic`, `fixed`, `fixed-fill`, and `fixed-fill-blur`. |
### Footer
| Name | Default | Description |
| ------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `footer.showMenu` | `true` | Show/hide the footer menu, which can be configured in the `[[footer]]` section of the `config/_default/menus.en.toml` file. |
| `footer.showCopyright` | `true` | Whether or not to show the copyright string in the site footer. Note that the string itself can be customised using the `copyright` parameter in the [languages configuration](#language-and-i18n). |
| `footer.showThemeAttribution` | `true` | Whether or not to show the "powered by" theme attribution in the site footer. If you choose to disable this message, please consider attributing the theme somewhere else on your site (for example, on your about page). |
| `footer.showAppearanceSwitcher` | `false` | Whether or not to show the appearance switcher in the site footer. The browser's local storage is used to persist the visitor's preference. |
| `footer.showScrollToTop` | `true` | When set to `true` the scroll to top arrow is displayed. |
### Homepage
| Name | Default | Description |
| ------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `homepage.layout` | `"profile"` | The layout of the homepage. Valid values are `page`, `profile`, `hero`, `card`, `background`, or `custom`. When set to `custom`, you must provide your own layout by creating a `/layouts/partials/home/custom.html` file. Refer to the [Homepage Layout]({{< ref "homepage-layout" >}}) section for more details. |
| `homepage.homepageImage` | _Not set_ | Image to be used in `hero` and `card` layouts. Can be set as local image from asset directory or external image url. Refer to the [Homepage Layout]({{< ref "homepage-layout" >}}) section for more details. |
| `homepage.showRecent` | `false` | Whether or not to display the recent articles list on the homepage. |
| `homepage.showRecentItems` | 5 | How many articles to display if showRecent is true. If variable is set to 0 or if it isn't defined the system will default to 5 articles. |
| `homepage.showMoreLink` | `false` | Whether or not to display a show more link at the end of your posts that takes the user to a predefined place. |
| `homepage.showMoreLinkDest` | `/posts` | The destination of the show more button. |
| `homepage.cardView` | `false` | Display recent articles as a gallery of cards. |
| `homepage.cardViewScreenWidth` | `false` | Enhance the width of the recent articles card gallery to take the full width available. |
| `homepage.layoutBackgroundBlur` | `false` | Makes the background image in the homepage layout blur with the scroll |
### Article
| Name | Default | Description |
| ------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `article.showDate` | `true` | Whether or not article dates are displayed. |
| `article.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `article.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `article.showDateOnlyInArticle` | `false` | Show date within article even if not displayed in article listings/cards. |
| `article.showDateUpdated` | `false` | Whether or not the dates articles were updated are displayed. |
| `article.showAuthor` | `true` | Whether or not the author box is displayed in the article footer. |
| `article.showAuthorBottom` | `false` | Author boxes are displayed at the bottom of each page instead of the top. |
| `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. |
| `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll |
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. |
| `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. |
| `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. |
| `article.editURL` | _Not set_ | When `article.showEdit` is active, the URL for the edit link. |
| `article.editAppendPath` | `true` | When `article.showEdit` is active, whether or not the path to the current article should be appended to the URL set at `article.editURL`. |
| `article.seriesOpened` | `false` | Whether or not the series module will be displayed open by default or not. |
| `article.showHeadingAnchors` | `true` | Whether or not heading anchor links are displayed alongside headings within articles. |
| `article.showPagination` | `true` | Whether or not the next/previous article links are displayed in the article footer. |
| `article.invertPagination` | `false` | Whether or not to flip the direction of the next/previous article links. |
| `article.showReadingTime` | `true` | Whether or not article reading times are displayed. |
| `article.showTableOfContents` | `false` | Whether or not the table of contents is displayed on articles. |
| `article.showRelatedContent` | `false` | Display related content for each post. Might required additional configuration to your `config.toml`. Please check the theme `config.toml` if you want to enable this feature and copy all the relevant _related_ entries. Also check [Hugo's docs](https://gohugo.io/content-management/related/) on related content. |
| `article.relatedContentLimit` | `3` | Limit of related articles to display if `showRelatedContent` is turned on. |
| `article.showTaxonomies` | `false` | Whether or not the taxonomies related to this article are displayed. |
| `article.showAuthorsBadges` | `false` | Whether the `authors` taxonomies are are displayed in the article or list header. This requires the setup of `multiple authors` and the `authors` taxonomy. Check [this page]({{< ref "multi-author" >}}) for more details on how to configure that feature. |
| `article.showWordCount` | `false` | Whether or not article word counts are displayed. |
| `article.showComments` | `false` | Whether or not the [comments partial]({{< ref "partials#comments" >}}) is included after the article footer. |
| `article.sharingLinks` | _Not set_ | Which sharing links to display at the end of each article. When not provided, or set to `false` no links will be displayed. Available values are: "linkedin", "bluesky", "mastodon", "twitter", "reddit", "pinterest", "facebook", "email", "whatsapp", and "telegram" |
| `article.showZenMode` | `false` | Flag to activate Zen Mode reading feature for articles. |
### List
| Name | Default | Description |
| ---------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. |
| `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. |
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll |
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. |
| `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). |
| `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. |
| `list.showLikes` | `false` | Whether or not list likes are displayed. This requires firebase integrations to be enabled, look below. |
| `list.showCards` | `false` | Whether or not each article is displayed as a card or as simple inline text. |
| `list.orderByWeight` | `false` | Whether or not articles are sorted by [weights](https://gohugo.io/methods/page/weight/). |
| `list.groupByYear` | `true` | Whether or not articles are grouped by year on list pages. |
| `list.cardView` | `false` | Display lists as a gallery of cards. |
| `list.cardViewScreenWidth` | `false` | Enhance the width of card galleries in lists to take the full width available. |
| `list.constrainItemsWidth` | `false` | Limit item width to `prose` to increase readability. Useful when no feature images are available. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on articles. |
### Sitemap
| Name | Default | Description |
| ----------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sitemap.excludedKinds` | `["taxonomy", "term"]` | Kinds of content that should be excluded from the generated `/sitemap.xml` file. Refer to the [Hugo docs](https://gohugo.io/templates/section-templates/#page-kinds) for acceptable values. |
### Taxonomy
| Name | Default | Description |
| ------------------------------ | --------- | ---------------------------------------------------------------------------------------------------------- |
| `taxonomy.showTermCount` | `true` | Whether or not the number of articles within a taxonomy term is displayed on the taxonomy listing. |
| `taxonomy.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each taxonomy page. |
| `taxonomy.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `taxonomy.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the taxonomy header. |
| `taxonomy.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `taxonomy.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `taxonomy.showTableOfContents` | `false` | Whether or not the table of contents is displayed on taxonomies. |
| `taxonomy.cardView` | `false` | Display lists as a gallery of cards. |
### Term
| Name | Default | Description |
| -------------------------- | --------- | ---------------------------------------------------------------------------------------------------------- |
| `term.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each term page. |
| `term.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. |
| `term.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the term header. |
| `term.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `term.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
| `term.showTableOfContents` | `false` | Whether or not the table of contents is displayed on terms. |
| `term.groupByYear` | `false` | Whether or not articles are grouped by year on term pages. |
| `term.cardView` | `false` | Display lists as a gallery of cards. |
| `term.cardViewScreenWidth` | `false` | Enhance the width of card galleries in lists to take the full width available. |
### Firebase
| Name | Default | Description |
| ---------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `firebase.apiKey` | _Not set_ | Firebase apiKey, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.authDomain` | _Not set_ | Firebase authDomain, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.projectId` | _Not set_ | Firebase projectId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.storageBucket` | _Not set_ | Firebase storageBucket, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.messagingSenderId` | _Not set_ | Firebase messagingSenderId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.appId` | _Not set_ | Firebase appId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
| `firebase.measurementId` | _Not set_ | Firebase measurementId, required to integrate against Firebase. Check [this page]({{< ref "firebase-views" >}}) for a guide on how to integrate Firebase into Blowfish. |
### Fathom Analytics
| Name | Default | Description |
| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `fathomAnalytics.site` | _Not set_ | The site code generated by Fathom Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `fathomAnalytics.domain` | _Not set_ | If using a custom domain with Fathom Analytics, provide it here to serve `script.js` from the custom domain. |
### Umami Analytics
| Name | Default | Description |
| --------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `umamiAnalytics.websiteid` | _Not set_ | The site code generated by Umami Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `umamiAnalytics.domain` | _Not set_ | If using a custom domain with Umami Analytics, provide it here to serve `script.js` from the custom domain. |
| `umamiAnalytics.dataDomains` | _Not set_ | If you want the tracker to only run on specific domains, provide it for your tracker script. This is a comma delimited list of domain names. Such as "yoursite.com,yoursite2.com". |
| `umamiAnalytics.scriptName` | script.js | The name of the `script.js` used for anti-ad-blocking is configured by the environment variable `TRACKER_SCRIPT_NAME` |
| `umamiAnalytics.enableTrackEvent` | true | When set to `true` track event will add automatically. If you do not want to add track event, set it to `false`. |
### Seline Analytics
| Name | Default | Description |
| ---------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `selineAnalytics.token` | _Not set_ | The token generated by Seline Analytics for the website. Refer to the [Analytics docs]({{< ref "partials#analytics" >}}) for more details. |
| `selineAnalytics.enableTrackEvent` | true | When set to `true` track event will add automatically. If you do not want to add track event, set it to `false`. |
### BuyMeACoffee
| Name | Default | Description |
| ----------------------------------- | --------- | --------------------------------------------------------------------------- |
| `buymeacoffee.identifier` | _Not set_ | The identifier to the target buymeacoffee account. |
| `buymeacoffee.globalWidget` | _Not set_ | Activate the global buymeacoffee widget. |
| `buymeacoffee.globalWidgetMessage` | _Not set_ | Message what will be displayed the first time a new user lands on the site. |
| `buymeacoffee.globalWidgetColor` | _Not set_ | Widget color in hex format. |
| `buymeacoffee.globalWidgetPosition` | _Not set_ | Position of the widget, i.e. "Left" or "Right" |
### Verifications
| Name | Default | Description |
| ------------------------ | --------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `verification.google` | _Not set_ | The site verification string provided by Google to be included in the site metadata. |
| `verification.bing` | _Not set_ | The site verification string provided by Bing to be included in the site metadata. |
| `verification.pinterest` | _Not set_ | The site verification string provided by Pinterest to be included in the site metadata. |
| `verification.yandex` | _Not set_ | The site verification string provided by Yandex to be included in the site metadata. |
| `verification.fediverse` | _Not set_ | The fediverse handle to include in the site metadata. Include the server domain in the username, e.g. `@you@instanceaddress.tld`. |
<!-- prettier-ignore-end -->
## RSSNext
| Name | Default | Description |
| ------------------------ | --------- |--------------------------------------------------------------------------------------------------------------------------------------|
| `rssnext.feedId` | _Not set_ | The rss `feedId` string provided by [RSSNext/Follow](https://follow.is/) to be included in the `rss.xml`, which can helps to claim rss feed as your own. |
| `rssnext.userId` | _Not set_ | The rss `userId` string provided by [RSSNext/Follow](https://follow.is/) to be included in the `rss.xml`, which can helps to claim rss feed as your own. |
## Other configuration files
The theme also includes a `markup.toml` configuration file. This file contains some important parameters that ensure that Hugo is correctly configured to generate sites built with Blowfish.
Always ensure this file is present in the config directory and that the required values are set. Failure to do so may cause certain features to function incorrectly and could result in unintended behaviour.

View file

@ -0,0 +1,371 @@
---
title: "配置"
weight: 4
draft: false
description: "介绍 Blowfish 中所有可用的的配置变量。"
slug: "configuration"
tags: ["配置", "文档"]
series: ["部署教程"]
series_order: 4
---
Blowfish 适宜个高度定制化的主题,使用到了一些 Hugo 中最新的特性来简化配置方式。
主题附带了默认配置,可以让你快速启动一个基本的博客或静态网站。
{{< alert "fire" >}}
我们刚刚推出了 CLI 工具,来帮助你快速上手 Blowfish。它将帮助你进行安装和配置。使用以下命令可以全局范围安装 CLI 工具:
```bash
npx blowfish-tools
```
{{< /alert >}}
> 配置文件是基于 TOML 格式的,这也是 Hugo 默认支持的语法。当然如果你愿意,也可以将配置转换成 YAML 或 JSON 格式。
默认情况下,在每个文件中都定义了主题中的可用参数,因此你可以自由调整设置来满足你的需求。
{{< alert >}}
正如[安装说明]({{< ref "/docs/installation#set-up-theme-configuration-files" >}})中的内容,如果你想调整主题配置,可以修改 Hugo 项目中 `config/_default/` 文件夹下的文件,并删除项目根目录中的 `config.toml` 文件。
{{< /alert >}}
## 网站配置
Blowfish 主题支持了 Hugo 框架中定义的所有标准配置变量。但如果希望有更好的体验,需要设置一些特定的配置。
网站配置是通过 `config/_default/config.toml` 文件管理的。下面的表格展示了 Blowfish 中的所有设置.
值得注意的是,表格中提供的变量名可以使用点表示法来简化 TOML 数据结构,例如 `outputs.home` 指的是 `[outputs] home`
<!-- prettier-ignore-start -->
| 名称 | 默认值 | 描述 |
| ------------------------ | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `theme` | `"blowfish"` | 当你使用 Hugo 模块安装时,应该移除这个配置项。但对 Git 子模块或本地文件复制的安装方式,必须将其设置为 blowfish 才能正常工作。 |
| `baseURL` | 无 | 网站 URL 根地址。 |
| `defaultContentLanguage` | `"en"` | 这个值决定了主题中组件和内容所使用的默认语言。 参考 [语言和 i18n](#language-and-i18n) 部分来了解 blowfish 支持的所有语言代码。 |
| `enableRobotsTXT` | `true` | 当开启这个值,`robots.txt` 文件将会被创建在站点根目录, 这将允许搜索引擎抓取整个网站。如果你想要自己提供 `robots.txt`,那么设置这个值为 `false` 并把你的文件放置到 `static` 目录下。 为了实现完全控制,你可以需要提供一个 [自定义布局]({{< ref "content-examples#custom-layouts" >}}) 来生成此文件。 |
| `pagination.pagerSize` | `10` | 定义文章列表中,每页展示的文章数量。 |
| `summaryLength` | `0` | 当[扉页参数]({{< ref "front-matter" >}}) 中没有提供文章摘要时,此参数定义了自动生成文章摘要的单词数量。如果值为`0`,则默认使用第一句话作为摘要。当摘要被隐藏,这个值没有任何效果。 |
| `outputs.home` | `["HTML", "RSS", "JSON"]` | 为站点自动生成输出格式。Blowfish 要求 HTML、RSS 和 JSON 都需要有,以保证主题组件可以正常运作。 |
| `permalinks` | 无 | 参考 [Hugo 文档](https://gohugo.io/content-management/urls/#permalinks) 中的自定义文章的固定链接配置。 |
| `taxonomies` | 无 | 参考 [整理内容]({{< ref "getting-started#organising-content" >}}) 中的分类器配置。 |
<!-- prettier-ignore-end -->
## 缩略图
Blowfish 的创立开端旨在便于为文章添加视觉效果。如果你熟悉 Hugo 的文章结构,只需要在你文章所在的文件夹中,放置一个以`feature*`开头的图像文件Blowfish支持所有格式的文件但更推荐使用 `.png``.jpg`。就这样Blowfish 就能够将图像文件作为文章的缩略图,而且能够在社交平台的 `<a target="_blank" href="https://oembed.com/">oEmbed</a>` 卡片中使用。
[这里]({{< ref "thumbnails" >}}) 可以看到更多内容,同时我们提供了一个[示例]({{< ref "thumbnail_sample" >}}),以便你具体看看如何操作。
## 语言和i18n
Blowfish 针对多语言网站进行了优化,主题的资源素材目前已经翻译成了多个语言版本。语言配置允许你生成多个版本的内容介绍,为网站的访问者提供他们母语的定制化体验。
Blowfish 主题目前默认支持了以下语言:
| 语言 | 代码 |
| ---------------------------- | ------- |
| Arabic | `ar` |
| Bulgarian | `bg` |
| Bengali | `bn` |
| Catalan | `ca` |
| Czech | `cs` |
| German | `de` |
| English | `en` |
| Esperanto | `eo` |
| Spanish (Spain) | `es` |
| Finnish | `fi` |
| French | `fr` |
| Hebrew | `he` |
| Croatian | `hr` |
| Hungarian | `hu` |
| Indonesian | `id` |
| Italian | `it` |
| Japanese | `ja` |
| Korean | `ko` |
| Dutch | `nl` |
| Polish | `pl` |
| Portuguese (Brazil) | `pt-br` |
| Portuguese (Portugal) | `pt-pt` |
| Romanian | `ro` |
| Russian | `ru` |
| Turkish | `tr` |
| Vietnamese | `vi` |
| Simplified Chinese (China) | `zh-cn` |
| Traditional Chinese (Taiwan) | `zh-tw` |
组件和静态资源的默认翻译在 `i18n/[code].yaml` 文件中,当然如果你想自定义,覆盖对应的文件即可。你也可以使用这种方法添加新的语言。如果你想与社区分享心得翻译,请[提交PR](https://github.com/nunocoracao/blowfish/pulls)。
### 配置
为了让 Blowfish 尽可能的灵活每个网站都至少语言创建一个语言配置文件。默认情况下Blowfish 提供了 `config/_default/languages.en.toml` 文件以默认支持英语。
默认的文件可以用来作为创建其他语言的一个模板,如果你希望用英语以外的语言撰写网站,也可以对其重命名。只需要格式遵循 `languages.[language-code].toml` 的命名即可。
{{< alert >}}
**注意:** 保证 [网站设置](#site-configuration) 中的 `defaultContentLanguage`参数和你提供的语言配置文件相匹配。
{{< /alert >}}
#### 全局
<!-- prettier-ignore-start -->
| 名称 | 默认值 | 描述 |
| -------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `languageCode` | `"en"` | Hugo 中的默认语言代码。他可以是一个高层级语言(例如 `en`),也可以是一个变体子语言(例如 `en-au`),但一定需要和语言配置文件中的语言代码相匹配。为了符合 HTML 的规范并设置设置大小写敏感的 `isoCode`Hugo希望这个值最好是小写。 |
| `languageName` | `"English"` | 语言名称。 |
| `weight` | `1` | 权重决定了在构建多语言时的语言顺序。 |
| `title` | `"Blowfish"` | 网站的标题。它将在网站头部和底部进行展示。 |
<!-- prettier-ignore-end -->
#### 参数
<!-- prettier-ignore-start -->
| 名称 | 默认值 | 描述 |
| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `params.displayName` | `"EN"` | 语言在网站中的展示名。 |
| `params.isoCode` | `"en"` | 用于 HTML 元数据的 ISO 语言代码。他可以是一个高层级语言(例如 `en`),也可以是一个变体子语言(例如 `en-au`)。 |
| `params.rtl` | `false` | 用于指定是否是 RTL 语言。设置为 `true` 则网站会从右向左重拍内容。Blowfish 完全支持同时使用 RTL 和 LTR 语言,并将动态调整。 |
| `params.dateFormat` | `"2 January 2006"` | 用于指定如何日期格式化。参考 [Hugo 文档](https://gohugo.io/functions/format/#gos-layout-string) 了解可以支持的格式。 |
| `params.logo` | 无 | `assets/` 文件夹中站点 logo 的相对路径。该 logo 文件需要提供 2x 分辨率并支持任何图像尺寸。 |
| `params.secondaryLogo` | 无 | `assets/` 文件夹中站点次要 logo 的相对路径。该 logo 文件需要提供 2x 分辨率并支持任何图像尺寸。这个 logo 的颜色方案应该是和上面的是相反或对比的。如果设置了这个值,当用户从 `defaultAppearance` 模式切换时,将会显示这个 logo。 |
| `params.description` | 无 | 网站表述。此参数将会被用作站点元数据。 |
| `params.copyright` | 无 | 此参数是一个 Markdown用于网站页脚的版权声明。此参数可以包含占位符 { year } ,以此动态插入当前年份。 如果没有提供Blowfish 将会使用网站 `title` 自动生成版权信息。 |
<!-- prettier-ignore-end -->
#### 作者
| 名称 | 默认值 | 描述 |
| ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `author.name` | 无 | 作者名。此参数将展示在文章页脚。并且如果主页使用了个人资料布局,也会展示此值。 |
| `author.image` | 无 | 作者头像的文件路径。图像应该是 1:1 的宽高比。可以放在网站的 `assets/` 文件夹中,也可以是外部 URL。 |
| `author.headline` | 无 | 包含作者头衔的 Markdown。它将展示在主页中作者姓名打分下方。 |
| `author.bio` | 无 | 包含作者简介的 Markdown。它将展示在文章页脚。 |
| `author.links` | 无 | 与作者详细信息一起显示的链接。配置文件中包含示例链接,取消注释即可启用。链接展示的顺序由他们在数组中定义的顺序决定。如果你想自定义链接,可以在 `assets/icons/` 中提供相应的SVG图片。 |
<!-- prettier-ignore-end -->
### 菜单
Blowfish 还支持针对特定语言的菜单配置。菜单配置文件的命名规则和语言配置文件的格式类似。只需要在文件名中提供语言代码Hugo 就可以知道这是针对哪种语言的菜单。
菜单配置文件的命名格式是 `menus.[language-code].toml`。请始终确保菜单配置项中使用的语言代码和语言配置相匹配。
[入门指南]({{< ref "getting-started#menus" >}})部分更详细地介绍了这个文件的结构。你还可以参考 [Hugo 菜单文档](https://gohugo.io/content-management/menus/),以获取更多配置示例。
## 主题参数
Blowfish 提供了大量控制主题功能的配置参数,下面的表格中列举了 `config/_default/params.toml` 文件中所有的可用参数。
下面列举的文章参数是全局默认值,都可以在每个文章中的前置元数据内容中进行覆盖。详细可以参考 [扉页参数]({{< ref "front-matter" >}})。
<!-- prettier-ignore-start -->
### 全局
| 名称 | 默认值 | 描述 |
| ------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `colorScheme` | `"blowfish"` | 主题使用的颜色方案。合法的值有: `blowfish` (默认)、`avocado``fire``ocean``forest``princess``neon``bloody``terminal``marvel``noir``autumn``congo``slate`。 具体参考[颜色方案]({{< ref "getting-started#colour-schemes" >}})以获取更多信息。 |
| `defaultAppearance` | `"light"` | 默认的主题外观,可以是 `light` 或者 `dark`。 |
| `autoSwitchAppearance` | `true` | 主题外观是否根据访问者操作系统的偏好自动切换。设置为 `false` 会强制网站始终使用 `defaultAppearance`。 |
| `enableSearch` | `false` | 是否开启网站的搜索功能,设为 `true` 即为启用。注意,搜索功能依赖于[站点设置](#site-configuration)中的 `outputs.home` 设置,请确保此值配置正确。 |
| `enableCodeCopy` | `false` | 是否可以将`<code>`代码块复制到剪贴板。想要使用代码复制功能,需要将 `highlight.noClasses` 参数设置为 `false`。 阅读 [其他配置文件](#other-configuration-files) 以获取更多信息。 |
| `mainSections` | 无 | 指定最近文章中应该展示的模块。 如果没有指定,则使用文章数量最多的板块。 |
| `showViews` | 无 | 是否显示文章和列表页面的阅读量。这需要集成 firebase ,具体可以看下面。 |
| `showLikes` | 无 | 是否显示文章和列表页面的点赞量。这需要集成 firebase ,具体可以看下面。 |
| `robots` | 无 | 用于支持搜索引擎爬虫如何处理你的网站。如果设置了该值,它将被输出在页面头部。具体的参数值请参考 [Google 文档](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives)。 |
| `disableImageZoom` | `false` | 禁用网站上所有图片缩放功能。 |
| `disableImageOptimization` | `false` | 禁用图片上所有图片的调整大小和优化功能。 |
| `disableTextInHeader` | `false` | 禁用文本类型的标题,对基于 logo 的标题很有用。 |
| `defaultBackgroundImage` | 无 | 设置默认背景图,用于 `background``hero` 布局下的主页。 |
| `defaultFeaturedImage` | 无 | 设置默认背景图片,用于所有文章的`featured`图片,可以通过文章目录中的 `featured` 图片替换。 |
| `highlightCurrentMenuArea` | 无 | 当菜单被选择时,标记主菜单中的菜单项。 |
| `smartTOC` | 无 | 开启智能目录,视图中的项目将会被高亮显示。 |
| `smartTOCHideUnfocusedChildren` | 无 | 当开启智能目录,如果目录级别不再被聚焦时,将会隐藏更深层次的目录。 |
### 页头
| 名称 | 默认值 | 描述 |
| --------------- | --------- | --------------------------------------------------------------------------------------------- |
| `header.layout` | `"basic"` | 定义整个站点的页头的布局,支持的参数有 `basic``fixed``fixed-fill`、and `fixed-fill-blur`. |
### 页脚
| 名称 | 默认值 | 描述 |
| ------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
| `footer.showMenu` | `true` | 显示/隐藏页面底部菜单,该菜单可以在 `config/_default/menus.en.toml` 文件中的 `[[footer]]` 部分进行配置。 |
| `footer.showCopyright` | `true` | 是否在底部显示 copyright 版权信息。请注意,如果你想定制,可以在[语言配置](#language-and-i18n)中使用 `copyright` 参数。 |
| `footer.showThemeAttribution` | `true` | 是否在网站底部中显示"powered by" 的主题归属信息。如果禁用此参数,请考虑在你网站的其他位置设置主题归属信息,例如在关于页面。 |
| `footer.showAppearanceSwitcher` | `false` | 是否在也页面底部显示外观切换器。浏览器的本地存储会缓存访问者的偏好设置。 |
| `footer.showScrollToTop` | `true` | 当设置为 `true` 时,显示返回顶部的箭头按钮。 |
### 主页
| 名称 | 默认值 | 描述 |
| ------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `homepage.layout` | `"profile"` | 首页布局参数。合法的参数值有: `page``profile``hero``card``background``custom`。当你设置为 `custom` 时,你必须创建 `/layouts/partials/home/custom.html` 文件以定制自己的布局。参考[主页布局]({{< ref "homepage-layout" >}})来获取更多信息。 |
| `homepage.homepageImage` | 无 | 在 `hero``card` 布局中使用的图像。图片可以来自于本地的资源目录,也可以是外部图像 URL。参考 [主页布局]({{< ref "homepage-layout" >}}) 来获取更多信息。 |
| `homepage.showRecent` | `false` | 是否在主页展示最新文章列表。 |
| `homepage.showRecentItems` | 5 | 如果将 `showRecent` 设置为 `true`此参数用于显示多少篇文章。如果没有设置或者为0则默认显示5篇文章。 |
| `homepage.showMoreLink` | `false` | 是否在主页底部添加“显示更多”,该链接会降会用带到一个预定义位置。 |
| `homepage.showMoreLinkDest` | `/posts` | 更多按钮所指向的位置。 |
| `homepage.cardView` | `false` | 将列表展示为卡片容器。 |
| `homepage.cardViewScreenWidth` | `false` | 增强列表中卡片的宽度,使其可以占据可用的全部宽度。 |
| `homepage.layoutBackgroundBlur` | `false` | 向下滚动主页时,是否模糊背景图。 |
### 文章页
| 名称 | 默认值 | 描述 |
| ------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `article.showDate` | `true` | 是否显示日期。 |
| `article.showViews` | `false` | 是否显示文章阅读量。这需要集成 firebase ,具体可以看下面。 |
| `article.showLikes` | `false` | 是否显示文章点赞量。这需要集成 firebase ,具体可以看下面。 |
| `article.showDateOnlyInArticle` | `false` | 是否在文章内显示日期,不影响文章列表或卡片页面的日期显示。 |
| `article.showDateUpdated` | `false` | 是否展示文章的更新日期。 |
| `article.showAuthor` | `true` | 是否在文章底部显示作者框。 |
| `article.showAuthorBottom` | `false` | 作者框显示在每页的底部而不是顶部。 |
| `article.showHero` | `false` | 缩略图是否会在每个页面中作为 hero 图像显示。 |
| `article.heroStyle` | 无 | hero 图像的展示样式,可选的参数值有:`basic``big``background``thumbAndBackground`。 |
| `article.layoutBackgroundBlur` | `true` | 向下滚动文章页时,是否模糊背景图。 |
| `article.layoutBackgroundHeaderSpace` | `true` | 在标题和正文之间添加空白区域间隔。 |
| `article.showBreadcrumbs` | `false` | 是否在标题栏显示面包屑导航。 |
| `article.showDraftLabel` | `true` | 当使用 `--buildDrafts` 构建网站时,是否在文章旁边显示草稿。 |
| `article.showEdit` | `false` | 是否展示编辑文章的链接。 |
| `article.editURL` | 无 | 当激活 `article.showEdit` 参数,此参数用于设置文章的编辑链接。 |
| `article.editAppendPath` | `true` | 当激活 `article.showEdit` 参数,是否将文章的路径附加到 `article.editURL` 参数所设置的 URL 后面。 |
| `article.seriesOpened` | `false` | 是否默认显示打开系列模块、 |
| `article.showHeadingAnchors` | `true` | 是否在文章标题旁添加锚点。 |
| `article.showPagination` | `true` | 是否在文章末尾展示上一篇/下一篇的文章链接。 |
| `article.invertPagination` | `false` | 是否翻转下一篇/上一篇文章链接的方向。 |
| `article.showReadingTime` | `true` | 是否展示文章的阅读时间。如果你的语言包含 CJK 语言,需要在 `config.toml` 中开启 `hasCJKLanguage` 参数。 |
| `article.showTableOfContents` | `false` | 是否展示文章的目录。 |
| `article.showRelatedContent` | `false` | 为文章显示相关内容。如果你想要启用此功能,请检查 `config.toml` 文件并复制所有 *related* 相关的参数,如果你想自定义,也可以对 `config.toml` 添加额外配置。更多内容请参考 [Hugo 文档](https://gohugo.io/content-management/related/) 中关于 *related* 的内容。 |
| `article.relatedContentLimit` | `3` | 如果启用`showRelatedContent`,则限制显示相关文章的数量。 |
| `article.showTaxonomies` | `false` | 是否显示文章的分类或标签信息。 |
| `article.showAuthorsBadges` | `false` | 是否在文章或列表中显示 `authors` 分类。这需要开启多个作者 `multiple authors``authors` 分类法。 请阅读 [这个网页]({{< ref "multi-author" >}}) 来获取更多内容。 |
| `article.showWordCount` | `false` | 是否显示文章的字数。 如果你的语言属于 CJK 语言,需要在 `config.toml` 中开启 `hasCJKLanguage` 参数。 |
| `article.showComments` | `false` | 是否在文章末尾添加 [评论部分]({{< ref "partials#comments" >}})。 |
| `article.sharingLinks` | 无 | 在文章末尾显示的分享链接。如果没有提供或设置为 `false`,则不会显示任何分享链接。可用的值包括:"linkedin"、"bluesky"、"mastodon"、"twitter"、"reddit"、"pinterest"、"facebook"、"email"、"whatsapp" 和 "telegram" |
| `article.showZenMode` | `false` | 指定是否激活文章阅读的禅模式,即隐藏常规的界面元素。 |
### 列表页
| 名称 | 默认值 | 描述 |
| ---------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list.showHero` | `false` | 缩略图是否会在每个页面中作为 hero 图像显示。 |
| `list.heroStyle` | 无 | hero 图像的展示样式,可选的参数值有:`basic``big``background``thumbAndBackground`。 |
| `list.showBreadcrumbs` | `false` | 是否在标题栏显示面包屑导航。 |
| `list.layoutBackgroundBlur` | `true` | 向下滚动列表页时,是否模糊背景图。 |
| `list.layoutBackgroundHeaderSpace` | `true` | 在标题和正文之间添加空白区域间隔。 |
| `list.showTableOfContents` | `false` | 是否展示目录。 |
| `list.showSummary` | `false` | 是否在列表页显示文章摘要。如果在[扉页参数]({{< ref "front-matter" >}})中没有提供摘要,那么将会使用[站点配置](#site-configuration) 中的 `summaryLength` 参数自动生成一个。 |
| `list.showViews` | `false` | 是否显示文章阅读量。这需要集成 firebase ,具体可以看下面。 |
| `list.showLikes` | `false` | 是否显示文章点赞量。这需要集成 firebase ,具体可以看下面。 |
| `list.showCards` | `false` | 是否将每个文章显示为卡片或简单的内联文本。 |
| `list.groupByYear` | `true` | 是否根据年做聚合。 |
| `list.cardView` | `false` | 将列表展示为卡片容器。 |
| `list.cardViewScreenWidth` | `false` | 增强列表中卡片的宽度,使其可以占据可用的全部宽度。 |
| `list.constrainItemsWidth` | `false` | 将项目宽度限制为 `prose` 以提高可读性。在没有 featurn 图片的时候非常有用。 |
### 网站地图
| 名称 | 默认值 | 描述 |
| ----------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `sitemap.excludedKinds` | `["taxonomy", "term"]` | 从生成的 `/sitemap.xml` 文件中排除的内容。 具体的配置请参考[Hugo 文档](https://gohugo.io/templates/section-templates/#page-kinds)。 |
### 分类法
| 名称 | 默认值 | 描述 |
| ------------------------------ | ------- | ----------------------------------------------------------------------------------------- |
| `taxonomy.showTermCount` | `true` | 是否在分类列表总显示对应的数量。 |
| `taxonomy.showHero` | `false` | 缩略图是否会在每个页面中作为 hero 图像显示。 |
| `taxonomy.heroStyle` | 无 | hero 图像的展示样式,可选的参数值有:`basic``big``background``thumbAndBackground`。 |
| `taxonomy.showBreadcrumbs` | `false` | 是否在标题栏显示面包屑导航。 |
| `taxonomy.showViews` | `false` | 是否显示文章阅读量。这需要集成 firebase ,具体可以看下面。 |
| `taxonomy.showLikes` | `false` | 是否显示文章点赞量。这需要集成 firebase ,具体可以看下面。 |
| `taxonomy.showTableOfContents` | `false` | 是否显示目录。 |
| `taxonomy.cardView` | `false` | 将列表展示为卡片容器。 |
### 术语
| 名称 | 默认值 | 描述 |
| -------------------------- | ------- | ------------------------------------------------------------------------------------------ |
| `term.showHero` | `false` | 缩略图是否会在每个页面中作为 hero 图像显示。 |
| `term.heroStyle` | 无 | hero 图像的展示样式,可选的参数值有: `basic``big``background``thumbAndBackground`。 |
| `term.showBreadcrumbs` | `false` | 是否在标题栏显示面包屑导航。 |
| `term.showViews` | `false` | 是否显示文章阅读量。这需要集成 firebase ,具体可以看下面。 |
| `term.showLikes` | `false` | 是否显示文章点赞量。这需要集成 firebase ,具体可以看下面。 |
| `term.showTableOfContents` | `false` | 是否显示目录。 |
| `term.groupByYear` | `false` | 是否根据年做聚合。 |
| `term.cardView` | `false` | 将列表展示为卡片容器。 |
| `term.cardViewScreenWidth` | `false` | 增强列表中卡片的宽度,使其可以占据可用的全部宽度。 |
### Firebase(Firebase 平台)
| 名称 | 默认值 | 描述 |
| ---------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `firebase.apiKey` | 无 | Firebase apiKey 与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.authDomain` | 无 | Firebase authDomain与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.projectId` | 无 | Firebase projectId与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.storageBucket` | 无 | Firebase storageBucket与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.messagingSenderId` | 无 | Firebase messagingSenderId与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.appId` | 无 | Firebase appId与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
| `firebase.measurementId` | 无 | Firebase measurementId与 Firebase 集成的必填参数。了解如何将 Firebase 集成进 Blowfish 请参考 [这个页面]({{< ref "firebase-views" >}})。 |
### Fathom Analytics(一种网站分析工具)
| 名称 | 默认值 | 描述 |
| ------------------------ | ------ | ------------------------------------------------------------------------------------------- |
| `fathomAnalytics.site` | 无 | 支持 Fathom 站点分析平台。更多详细内容请参考 [分析文档]({{< ref "partials#analytics" >}})。 |
| `fathomAnalytics.domain` | 无 | 如果使用自定义域名的 Fathom Analytics请在此提供以便从自定义域名获取 `script.js`。 |
### Umami Analytics(一种网站分析工具)
| Name | Default | Description |
|------------------------------|-----------|-------------------------------------------------------------------------------------|
| `umamiAnalytics.websiteid` | 无 | 支持 Umami 站点分析平台。更多详细内容请参考 [分析文档]({{< ref "partials#analytics" >}})。 |
| `umamiAnalytics.domain` | 无 | 如果使用自定义域名的 Umami Analytics请在此提供以便从自定义域名获取 `script.js`。 |
| `umamiAnalytics.dataDomains` | 无 | 如果你只想在特别的数个域名中使用 tracker 功能那么你需要设置它。这个参数的值是逗号分隔的域名列表yoursite.com,yoursite2.com。 |
| `umamiAnalytics.scriptName` | script.js | 用于反广告屏蔽的 script.js 名称,由环境变量 `TRACKER_SCRIPT_NAME` 配置。 |
| `umamiAnalytics.enableTrackEvent` | true | 默认会自动添加 Umami Track Event。如果你不想添加 Event那学需要设置为 `false`。 |
### Seline Analytics
| Name | Default | Description |
|-----------------------------------|---------|--------------------------------------------------------------------------|
| `selineAnalytics.token` | 无 | Seline 站点分析平台的 token。更多详细内容请参考 [分析文档]({{< ref "partials#analytics" >}})。 |
| `selineAnalytics.enableTrackEvent` | true | 默认会自动添加 Umami Track Event。如果你不想添加 Event那学需要设置为 `false`。 |
### BuyMeACoffee(赞助平台)
| 名称 | 默认值 | 描述 |
| ----------------------------------- | ------ | ---------------------------------- |
| `buymeacoffee.identifier` | 无 | buymeacoffee 账号的用户名。 |
| `buymeacoffee.globalWidget` | 无 | 激活位于全局的 buymeacoffee 组件。 |
| `buymeacoffee.globalWidgetMessage` | 无 | 新用户首次访问网站时显示的消息。 |
| `buymeacoffee.globalWidgetColor` | 无 | 组件颜色,使用 HEX 格式。 |
| `buymeacoffee.globalWidgetPosition` | 无 | 组件位置,例如 "Left" 或 "Right"。 |
### 验证
| 名称 | 默认值 | 描述 |
| ------------------------ | ------ | -------------------------------------------------------- |
| `verification.google` | 无 | Google 提供的网站验证字符串,用于在网站元数据中包含。 |
| `verification.bing` | 无 | Bing 提供的网站验证字符串,用于在网站元数据中包含。 |
| `verification.pinterest` | 无 | Pinterest 提供的网站验证字符串,用于在网站元数据中包含。 |
| `verification.yandex` | 无 | Yandex 提供的网站验证字符串,用于在网站元数据中包含。 |
<!-- prettier-ignore-end -->
## RSSNext
| Name | Default | Description |
| ------------------------ | --------- |---------------------------------------------------------------------------------------------|
| `rssnext.feedId` | _Not set_ | [RSSNext/Follow](https://follow.is) 提供的 `feeId`,这将被自动添加在 `rss.xml` 中以便完成订阅源所有权验证,证明该源属于你自己。 |
| `rssnext.userId` | _Not set_ | [RSSNext/Follow](https://follow.is) 提供的 `userId`,这将被自动添加在 `rss.xml` 中以便完成订阅源所有权验证,证明该源属于你自己 |
## 别的配置文件
Blowfish 主题还包括 `markup.toml` 配置文件。这个文件包含了一些重要参数,来确保 Hugo 正确配置以生成使用 Blowfish 创建的网站。
需要确保次文件在 `config` 目录中,并设置所需要的值。否则某些功能可能无法正确启用,并可能导致意外行为。

View file

@ -0,0 +1,257 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:rgba(NaN, NaN, NaN, 0);display:block;z-index:1;position:relative" width="1084" height="322" preserveAspectRatio="xMidYMid" viewBox="0 0 1084 322">
<defs>
<pattern id="pid-0.2950529742247572" x="0" y="0" width="711.6800000000001" height="711.6800000000001" patternUnits="userSpaceOnUse">
<g transform="scale(2.7800000000000002)"><circle cx="180.39755796770348" cy="144.2104368598822" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;17.85434406280291" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-44.622752456562516s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-44.622752456562516s"></animate>
</circle><circle cx="16.825168708189995" cy="32.834595161139454" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.39487920677064" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
</circle><circle cx="272.82516870819" cy="32.834595161139454" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.39487920677064" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
</circle><circle cx="16.825168708189995" cy="288.8345951611395" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.39487920677064" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
</circle><circle cx="272.82516870819" cy="288.8345951611395" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.39487920677064" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.52246651250024s"></animate>
</circle><circle cx="133.7281341523537" cy="37.557212373233874" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;24.44944303845901" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-33.76558939460953s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-33.76558939460953s"></animate>
</circle><circle cx="9.311746119524932" cy="139.87259197506899" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;42.09217911991696" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.268240533907207s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.268240533907207s"></animate>
</circle><circle cx="265.3117461195249" cy="139.87259197506899" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;42.09217911991696" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.268240533907207s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.268240533907207s"></animate>
</circle><circle cx="228.8288862878399" cy="50.59785782429598" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;19.868262625397918" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-23.68489264848651s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-23.68489264848651s"></animate>
</circle><circle cx="77.20196271561525" cy="31.611804700405518" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;45.28258812229561" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.661787725688292s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.661787725688292s"></animate>
</circle><circle cx="77.20196271561525" cy="287.6118047004055" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;45.28258812229561" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.661787725688292s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.661787725688292s"></animate>
</circle><circle cx="153.86297348533364" cy="53.13721410068965" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;56.59657006893606" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-26.846959941207736s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-26.846959941207736s"></animate>
</circle><circle cx="153.86297348533364" cy="309.1372141006897" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;56.59657006893606" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-26.846959941207736s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-26.846959941207736s"></animate>
</circle><circle cx="238.25141956589107" cy="242.3948925366868" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;7.110432319564012" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.8377648779141s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.8377648779141s"></animate>
</circle><circle cx="171.29587360943597" cy="93.62941553592991" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;64.80517552507085" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-41.081630071778505s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-41.081630071778505s"></animate>
</circle><circle cx="33.7803997203791" cy="200.65918731382288" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;23.874060138252702" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.74940953893833s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.74940953893833s"></animate>
</circle><circle cx="171.68455092137125" cy="208.29640936292603" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;10.804694032911527" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-46.827942545330814s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-46.827942545330814s"></animate>
</circle><circle cx="79.4759072969399" cy="14.760241106300118" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;63.07191175406126" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-38.31065839827809s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-38.31065839827809s"></animate>
</circle><circle cx="79.4759072969399" cy="270.7602411063001" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;63.07191175406126" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-38.31065839827809s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-38.31065839827809s"></animate>
</circle><circle cx="34.30718832814177" cy="60.207260607353895" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;36.85782580252244" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-33.9202714458405s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-33.9202714458405s"></animate>
</circle><circle cx="290.30718832814176" cy="60.207260607353895" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;36.85782580252244" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-33.9202714458405s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-33.9202714458405s"></animate>
</circle><circle cx="141.57461629003254" cy="187.07605677907222" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;51.82556427519147" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-39.3497070269789s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-39.3497070269789s"></animate>
</circle><circle cx="89.86556463252813" cy="191.98681310799674" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;42.52162149867297" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.730611990382005s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.730611990382005s"></animate>
</circle><circle cx="135.68751640285163" cy="79.13898775934953" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;13.167119065627332" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-5.604152896601732s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-5.604152896601732s"></animate>
</circle><circle cx="222.37419164851048" cy="172.5138843825768" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;30.712438068878654" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-11.730564332626214s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-11.730564332626214s"></animate>
</circle><circle cx="65.37962957434202" cy="71.08214856672792" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;51.390991126295845" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.53817444257383s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.53817444257383s"></animate>
</circle><circle cx="146.90696443169887" cy="160.58661584710634" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;30.874027084269912" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-48.61529961868726s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-48.61529961868726s"></animate>
</circle><circle cx="20.6640150520578" cy="116.652000839832" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;20.32462575632799" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-16.94818532763218s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-16.94818532763218s"></animate>
</circle><circle cx="14.794147949099273" cy="178.87974595952937" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;62.66357119046049" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.398483724039195s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.398483724039195s"></animate>
</circle><circle cx="270.7941479490993" cy="178.87974595952937" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;62.66357119046049" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.398483724039195s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-22.398483724039195s"></animate>
</circle><circle cx="31.287373376921607" cy="70.1833739363135" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;15.295461964288506" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-13.161686681828998s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-13.161686681828998s"></animate>
</circle><circle cx="178.84317419706238" cy="167.34091291757605" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;62.162205555011425" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-23.327170625044392s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-23.327170625044392s"></animate>
</circle><circle cx="154.05316621664582" cy="55.033341833431564" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;39.67588542484934" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-15.452897657374963s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-15.452897657374963s"></animate>
</circle><circle cx="72.19223514179198" cy="135.19246311905093" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;20.804220090813203" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-45.51768235650617s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-45.51768235650617s"></animate>
</circle><circle cx="150.9364802116815" cy="160.51205929354626" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;36.57407641397833" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.280565367328037s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-28.280565367328037s"></animate>
</circle><circle cx="200.40953970115999" cy="54.21097279269783" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;18.303774190487488" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.214535605827784s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-16.214535605827784s"></animate>
</circle><circle cx="180.31885618742604" cy="242.78087924898603" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;11.71365962730546" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-33.612535536027956s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-33.612535536027956s"></animate>
</circle><circle cx="203.8062010106876" cy="232.68973192108191" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;5.455675580739268" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-11.86697370110249s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-11.86697370110249s"></animate>
</circle><circle cx="171.6066941076269" cy="48.04474014530398" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;38.59286259496349" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-29.250466319872224s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-29.250466319872224s"></animate>
</circle><circle cx="125.11525876384411" cy="149.77467373569812" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;46.62256816012656" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-10.699532836506153s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-10.699532836506153s"></animate>
</circle><circle cx="89.16772547042389" cy="100.43557995027065" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.90728701564909" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-20.057887262682318s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-20.057887262682318s"></animate>
</circle><circle cx="163.0802387343303" cy="125.70388388233474" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;60.89399699890593" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-29.04746538184899s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-29.04746538184899s"></animate>
</circle><circle cx="147.29969577601045" cy="40.152117547871356" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.17094951058618" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-8.699383046276775s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-8.699383046276775s"></animate>
</circle><circle cx="147.29969577601045" cy="296.15211754787134" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.17094951058618" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-8.699383046276775s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-8.699383046276775s"></animate>
</circle><circle cx="50.39439200506233" cy="147.3941729324677" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;50.69970142939741" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.544702694456348s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.544702694456348s"></animate>
</circle><circle cx="306.39439200506234" cy="147.3941729324677" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;50.69970142939741" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.544702694456348s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.544702694456348s"></animate>
</circle><circle cx="188.7139101584322" cy="210.7115210762685" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;29.504019948829963" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-32.532647237390165s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-32.532647237390165s"></animate>
</circle><circle cx="114.22207446357659" cy="124.76935492926279" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;11.986008541965333" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.917226446523447s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.917226446523447s"></animate>
</circle><circle cx="194.31954289149434" cy="166.65089356408262" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;20.194181381536055" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-30.020995894146097s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-30.020995894146097s"></animate>
</circle><circle cx="184.86541783077774" cy="44.886087590301756" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;56.99589341531981" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-36.60809296354671s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-36.60809296354671s"></animate>
</circle><circle cx="184.86541783077774" cy="300.88608759030177" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;56.99589341531981" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-36.60809296354671s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-36.60809296354671s"></animate>
</circle><circle cx="128.6294815429427" cy="20.412863761372066" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;58.14291539416182" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.6283523615141s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.6283523615141s"></animate>
</circle><circle cx="128.6294815429427" cy="276.4128637613721" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;58.14291539416182" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.6283523615141s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-38.6283523615141s"></animate>
</circle><circle cx="94.65360523910455" cy="237.65373752048882" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;10.872426017373087" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.286612875431295s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-17.286612875431295s"></animate>
</circle><circle cx="186.84577473379255" cy="4.291441103039755" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.03848537207753" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-30.97916037182813s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-30.97916037182813s"></animate>
</circle><circle cx="186.84577473379255" cy="260.29144110303974" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;50.03848537207753" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-30.97916037182813s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-30.97916037182813s"></animate>
</circle><circle cx="3.1171684515748126" cy="10.536170179400985" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;31.72037969636405" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
</circle><circle cx="259.1171684515748" cy="10.536170179400985" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;31.72037969636405" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
</circle><circle cx="3.1171684515748126" cy="266.536170179401" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;31.72037969636405" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
</circle><circle cx="259.1171684515748" cy="266.536170179401" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;31.72037969636405" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-29.18270767825585s"></animate>
</circle><circle cx="188.74527992387326" cy="21.78088381944502" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;24.62604013195285" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-15.60412108402891s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-15.60412108402891s"></animate>
</circle><circle cx="188.74527992387326" cy="277.780883819445" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;24.62604013195285" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-15.60412108402891s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-15.60412108402891s"></animate>
</circle><circle cx="25.856888539646313" cy="42.26884688505775" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.95560071224433" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
</circle><circle cx="281.8568885396463" cy="42.26884688505775" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.95560071224433" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
</circle><circle cx="25.856888539646313" cy="298.26884688505777" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.95560071224433" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
</circle><circle cx="281.8568885396463" cy="298.26884688505777" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.95560071224433" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-16.780876976602578s"></animate>
</circle><circle cx="80.07378641634132" cy="99.95189316646443" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;31.25308753538168" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-44.38933261009856s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-44.38933261009856s"></animate>
</circle><circle cx="115.28452115370486" cy="183.50469529806404" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;43.47190520350591" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.01262905715093s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-35.01262905715093s"></animate>
</circle><circle cx="178.06444021126137" cy="196.65069638203684" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;55.28300103432255" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-31.907669721653242s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-31.907669721653242s"></animate>
</circle><circle cx="44.16845143857357" cy="102.58764890706274" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;56.592641937222965" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-21.452416790316818s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-21.452416790316818s"></animate>
</circle><circle cx="300.1684514385736" cy="102.58764890706274" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;56.592641937222965" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-21.452416790316818s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-21.452416790316818s"></animate>
</circle><circle cx="79.90917564776078" cy="58.24933597303385" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;17.76697933939279" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-6.018058267098058s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-6.018058267098058s"></animate>
</circle><circle cx="99.51047224071066" cy="68.21685313096823" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;32.538025421938485" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-24.711449309412114s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-24.711449309412114s"></animate>
</circle><circle cx="170.23837150372032" cy="80.50555967618685" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;49.47798543600463" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-27.302250080429058s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-27.302250080429058s"></animate>
</circle><circle cx="146.82045516936643" cy="81.4540879579799" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;17.51784178229697" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-14.316475870551947s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-14.316475870551947s"></animate>
</circle><circle cx="85.89692843138472" cy="166.66227056758296" r="0" fill="none" stroke="#5e6fa3" stroke-width="8">
<animate attributeName="r" values="0;43.09830041436764" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-25.33233432848061s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-25.33233432848061s"></animate>
</circle><circle cx="177.2226960369944" cy="175.07899171519415" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;43.73555785023012" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-25.121497689569683s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-25.121497689569683s"></animate>
</circle><circle cx="216.86808064093213" cy="27.577527215605766" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;4.737877261879547" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-15.904900634836528s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-15.904900634836528s"></animate>
</circle><circle cx="110.04710192749121" cy="180.18493319620214" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;44.77556931875715" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-1.5780314591062772s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="25s" begin="-1.5780314591062772s"></animate>
</circle><circle cx="64.71846547185336" cy="75.44443893159085" r="0" fill="none" stroke="#93dbe9" stroke-width="8">
<animate attributeName="r" values="0;9.889551183237941" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-36.2183301855013s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-36.2183301855013s"></animate>
</circle><circle cx="40.659167565439354" cy="80.92354614012416" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.03611543920749" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-40.52530054760075s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-40.52530054760075s"></animate>
</circle><circle cx="296.65916756543936" cy="80.92354614012416" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;47.03611543920749" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-40.52530054760075s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="16.666666666666668s" begin="-40.52530054760075s"></animate>
</circle><circle cx="158.9398261520183" cy="96.5683673937937" r="0" fill="none" stroke="#689cc5" stroke-width="8">
<animate attributeName="r" values="0;9.89977495248037" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-2.5412705195820062s"></animate>
<animate attributeName="opacity" values="1;0" keyTimes="0;1" calcMode="spline" repeatCount="indefinite" keySplines="0 0.5 0.5 1" dur="12.5s" begin="-2.5412705195820062s"></animate>
</circle></g>
</pattern>
</defs>
<rect x="0" y="0" width="1084" height="322" fill="url(#pid-0.2950529742247572)"></rect>
</svg>

After

Width:  |  Height:  |  Size: 42 KiB