From 5f8fb6c22645f87d370368250c66dee71871cae0 Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Tue, 29 Oct 2019 12:32:05 +0100 Subject: [PATCH] fix: Consul Catalog documentation. --- docs/content/assets/img/providers/consul.png | Bin 14864 -> 15114 bytes docs/content/providers/consul-catalog.md | 424 ++++++++++++++---- docs/content/providers/consul-catalog.toml | 44 -- docs/content/providers/consul-catalog.txt | 53 --- docs/content/providers/consul-catalog.yml | 31 -- .../reference/static-configuration/file.toml | 6 +- .../reference/static-configuration/file.yaml | 2 +- .../consul_catalog/default_not_exposed.toml | 4 +- .../fixtures/consul_catalog/simple.toml | 4 +- pkg/config/static/static_config.go | 2 +- webui/src/statics/providers/consulcatalog.svg | 11 +- 11 files changed, 360 insertions(+), 221 deletions(-) delete mode 100644 docs/content/providers/consul-catalog.toml delete mode 100644 docs/content/providers/consul-catalog.txt delete mode 100644 docs/content/providers/consul-catalog.yml diff --git a/docs/content/assets/img/providers/consul.png b/docs/content/assets/img/providers/consul.png index 23a7688c95d721c1d01af5e36a30f0874116784f..a19f0ddf957d5c54f11ff0783658afbe07dff535 100644 GIT binary patch literal 15114 zcmcJ$XIPV46E+$^1yn?_D@EKCL5c!`QW6mr0|K^C1yq^{g3=*CP};_V>`)>_A|j%p zN|hQA6+#O|2`vd7qy<6=A?;h)`}^^p_v}CKxvukrkn72+vu4fQbI&|+*UXK@wjbFJ zfk4FIS1#UwK!lhOh(NZ;Ht-~n_^S;36Mb~W#uoxn`-A@{5R?N8fIyBx;1>;V1r08c z^?Z(6ebpYR%vDgti@kpR;?Hk30;Bt1C+hBz)YVWlP99O7`tV2W2Z`JdmZwIx$GrH{ z^St+nqE#0vB63f`9wmo}ZPm;Ah!d?Te|lxqzoq&X%vSFLlXiupu5SVVk4*@H&kNB1 z=T{N1NJvD2IQaaJum9cZKl=VhtN-}=uO0qh!~TEk@E?=^_t$@);lEq`$EN?64*#** z|Ni>#GyHd}ec~7?Ny(e4PTUQ zHKKJ%3xNn*v^7Ql^fw5eLW)Umebs#Yw#ntETfOG*xSM=HWtSq>(nHa-=+@ zc7j!1=#kT)9kW4}7(p@|kYbBJ?1OhZ-rB`xG}gkTIwa*cyhS7xgBj;riZYoF;$fp4 zYtq`6>`A}tq_sP7L&1o{mI(i(i4%m8IL2_gT&WMXHh*q&7$E?8)r+>kG=&yzVMfx= z5BMdZ+Rf2T^ywyxbv?LRYvh8c7kCI!wj1a7OwVDV z{Bt8Tg~RI0s?nif=HKUwY01}M?X~;UV^wW8QC~={C<-?I>aDFRZQnHoH%>VgzNl-N zwo>>#iBi0@pDu8|B{!!ry!#$Xr61pqvSSu8EEdrjmv+FGOo$nucr$gwnQM*SJcKM>G%V@x<~0u+`&q?g1Trn0wK0o z#~Vq+JJbeh(E6ZA^RwZ1kk4~2At$F7@9`2dVC!5LN7%G4Ywem9=Q$}n#(3RZN5;yU zxoS;@nJ2nQ^H^RmgHD&4rW>-4Hwipg&^!Y+F#UbmdYyv8LQ zpC|6yVYhfp-LBC|olpd1Gg~bUm5?Tu)aFdq?~8B?cCh&5n1`$OG(E^{Rz55J`DQEc zBMx`hoo-kl6@b;=!35%Py2KUbDk=i;3pt-57!i#>A(*zE0ZyY-4!?cls7J2; z3Ep%FZz6wZPQ=4A!ILz+>gbAZ*6K{M0I!O*j?TI^zDt;GK||tU8aqd2d9)`HsEuz_ z-cB;^a(FV*+ zA+hyqSn#1e^FuQ0R0kTi)COR}0xC^W6K74W^X>l|?v;(EIXtCir%i~u$D%zJY5hfhcpm2oUU~vmLxO4b@p?ax z=83Gxw6Yv1J6gq)oz&ZYcNZ%gi?ew(?Ufbdh{i}u;6VuknnGMwyW)ck z11FfcHv0>t*tL4DH2)Fo3k8;Xv65Yg#5e=9=aYY81ixQ!I<@j!eIHJl=!Fi&Oz>u_ zp}4utvckFV8a@TJDQ%vc;)oPU*w3LX6>kRj3H500qd+w@yP$AxR1;~#u48x3KjF0h zAu9uk3bj127zi$Er-tM4nQL*L(Qo8n_B3pJ>y1Afd;~X5zS`N7>Z%Kg(8^o4?OeNf zFUZE+MN`d5EX>Cn8J{laNb)xbf-{(kNu1=i?chp(5aK?bvfoBkepyh4nQ#PZF|9Bi z=~jgt;qh)Eegz{CO&Xsh)tCCK8Q(ROoeNDS3C__n--}OxwH(>O5C$DEsjm(WUq5a~ zOP9k`FEu5a)ju-eq)osOhz_89C!M$hDuQQ$?|37^r~%D$;an*X@`~GYHFn}0XYcqW z_lx$VU%n3N1D6p9WBL0QI2=wUWHPuZxifQvwyr@_T0{0>!Rq2vYmI+|xnf7Ncsz-nYypWcKtL~?N=LB~eKHN90eK1&yUPMjdk zaT2rTnz(+>CCY<$mRhLx6DxbC#a6yj%w4oMR_G?FHmKLJC#{FV9kqucd_nGH)W{Fp z9iXA?Cx2@y%Us+_2z!2bytp$SuT~7IchO@)=SykgW#R9q+L% zFLVWm3&0n@pm?L9TgsOeqD z`(Pw9htvP~rZRY*Q8$7Lr&&uS$NtPND{B5;9I9|XGImi)4<7FLm8BjdR7+@6UQ!#p z_NTu+7W3?d3*tt&?u)V29aKkRs@;^@tH5Q)=r=chFJ;`d)4|SV@zL({uCs8RAMCI% z2j}$$IOU;*rQeP2r^4>Oo~}Gr*z^i`|6zo&UDBfv%rC@;x&XEK(gXXai$h5&*(!ms zbLNRSTzF@#aYG)XRK7{^N8vTFa_GS&@sy3Oa7)XY72wSte*80( z`oRg9|5p*beLC{}*x#ER*b|g>JncGjMPX;-sa@DUVC3?nnz5M@^%~xH-{{M>P^Lyd zPdL(jZTr!73Vm}3#2Gb4E+&SPE=)mL17o9v*mw;OonE;Sq|!8(tV7tgx)wf=FMR1J^F_4At*f!J{p)~>V^%~jvHzz2Uu4fwX& z%EsT?@#Wql`uC5|qrf3l{}z%iiQ=nT#o3V^46+DI2fj3Bz_7=o8U~Uvu$5Wnx z{diN26MF>&gIXl$0swWEMDSz@pHDM9U{*g;EqWM(qMP+|7RGKS`_8urpKo!i5#%C7 z8GDUAoH|pt3IpR?xaun(alKN?7{um(`YAI(AY>tpThzipu)t|jx%hZDp;>dE$nh2_@ zOFPGKs!f_Af9{4d1X3JaHc{EHsbK8U8rxnoo$gXMG;L4Zy%PdX%Eqfp*M!d6w$KAE z)BX9DzXM5q^%3u$tDCMwVF;vuHwv+(V8=#Hs=7yor~t5}f1T+O;M-~k*P9B1H6|LT zxY7{5SJ_&~u!w&|f%Q2z(I_%v+{Xs(fCLIE?c1Yl9 zHOM4Q7aQc1{uqBJkKffnLR{S8k0!ZhCOve2V5-&Ym#p6Is{{c^=;;=QNf6BX zZUPCdKH-fBI(LQcEg%C$hOL_1M=d%h1brGU0UJZq1PoQC#>`@*PafRk1;SgH6j@iobELf6lpYYBEDUb*na1!0XKN6%2}64vg302%K*j~$#T}v$&shA4 zr!RM$uCZ}E$+buSA%GPNsQt=-sw9i}>Gab;40#*zOND^fC^|Lxd&!srr<+aLtMCvA zguTMHEkIq4XgQ13aHYI0{0r3b`|p-THPJiC*1#rY?`Q`uc>;Z^hMhaW(F$lO@LKKE-2%&VPh{7%G@pjCy{Y$)glRc3040i%m za{SCg(naKXtFN4UV?C870Q_qr6vI5Dw9MNa8J z;Xll{XCc&9f)pnz*E4o6VK19P!KU+j(rlO20l@jxlbd61ddLxOttIMGa|_|0w$|>} zV`w&rN^O;Y`}E5wGVRb<(;!qk0!`cOyDnv7k_ph1e|0e(CZnB<(>xKKy4FitUhH)n`S33ln@M}dZD2XrKzRGF$S z72xhu*LPG|5CV}!^=grEP|FEVn-RQ97G?K-SrmDZ{`lc$lmFrsd(z%qaUfw88~3}O zJ_EIkly;$NKs;o7_PyBDk#A6UsD!IwYYv1V5Wohtp%$l{#FHF?RkNRtbROOU4leJs zXAsiq(k{Pm-P`7y%+S4ZiPeP|jh(ZaG+%Di_9x$ohD>HotCLX$uz$HivW_RAUGkA< zyjaHxL1cRh4Iy$BdQ+gQt-0#N0hqW3R_Mp=eSpX-^#tJG%;JlVBnZCS}a6N`e}dCtDH$4_GdtL*jG zXxEldz8IXeh7r6Ee2MBFo51(~6~W)P{$@k}NX3t5M`vCukY1y_&4R%)-ELms+DqGn zi$W^Lk%m1%W&qweH{7 z)8YJXxp@6NXQb>T7^DVH(JDLVwEX+)noq)eD~D2gwdaFFCIhkA zbloc@fv_zKsY#^NtkW;uAGmVj-cdXe2-QU~#sWpp*ej83ap`5;K0E&x!q_TqVB2H+ zVPCf){rssXb0fVTqo0w3F7~8)JXr4jw0Rur!xwk=FER?}I{(;z56o;eDd`CRqBhF? zQY)Qis#5dtpa@g~Tz>QYMZT7N4&e#&g;)$DqA-C6w zJ+-xY_1%_%6}7dmpKuTM^a(SbvP_S>q!^5*eW?kg+1+~Ien8zf>HKq=yuba)=wH#8 zQaSIV{Xfl6y0c1;Z3Dt2U7*`SXov9u7-zoe!hDetPGv+5ARCLQ^54RuSf!!RxV<9dCb#G}r{tJ(&u7>|2OfZNb{6ne0E{aD@{IVgDo z1jnTZ9E9p_Tz*cX#4L;<77@>qmrzyjO01I_mERQ9(C?*^mV{i}>JJ>*RO8wbPs-v| zWnKHaIyR>P+RFdt-d+AUZ6emH_B)H~r*->l_|8Ojb=0d>dz7xOud|&L-Qc#?(fL<8 zT3vF4Scwgy&gmrpZ`*|{@#>nz$qgZX>c!gj?!Ji=LA@vEO*}ZowUn~e8xE`QzqF&3 zn=9n6s4SN?XC|VDGa^|JvEH(Mq-#FJxw zN*dJ-ahaEA)&b&BtZr9`3)M9zgHpCJd`=~c#&~^jdlXx>=ciHQ8=E!v>kY6@dQ7oo zinM_Gz$@~8{iF;GBPaSrn*&f9>W(u=RhEc%B0CRQuUqREDdAC|!H*6U0WIm{olDYAuPIP_*v%J)Ai^Ey5 zr-t&Hz3W%GlKIF7#WsD1UP-#9A-p!l7Y8 z^8i+yR@ZFLya(fPUr}%UXct;i&X`+RqpG3t*GmM_r#c0k5b=^;;U3 zQeavj5U|3Kp6YF4^oC+Q(y7_%`su-2T`<$qJSnm|{&8CBO=oiGbYo1nJ*r$>@IpB2 zD`yE)RR6{q>bhD^76)8p3WKHY7=~oESyAIrKn?}-o%XiNc$@Aant`uA8)ugle;e-k zxB;fdAnHi*KGIAAmmGwlZQXA1b2t?-bJjqJ@IR6O~eM`P&;Fl^Q*b#&ajaQ`n<4j7b}$UfOoc1z_e zcM@ztZ#Nw?b>|W<;1^5K9`G>$r+C?XtU_7v0zu%fjfz2*ju+wHA@|1je#x2}JyGOn z_yM7-WxN#xEZ>ak6L{4Tu$J0&X8IY=aCHKnuM@qhN{f_dR9=T>Tlg>W#Nsmo_|SuO z1N3(r<&%b}Ue{*F=*m2=4s{x;!eyHKQcqTdIdre9E1;dirAGj|dM%v%WIoohelwtC zE1AK_@b7{Pa@a~K5W!dSz;Ud?MQ!cpuPt?mcGS+5=UE$R4cWavB%ck)w> zA_=G6t?=E+#mvi{vqK~}D>b_ze826iEV~*Vx|?28)R?+fJ_du0h?fo|j{2RODXP9P z>l#@owf~Wy!3YCrM0*p1{`p?NweiVng^KbX(-vV_)Jd)VT~X}mt!zW>yysje@mTxN zp!(sr44C6`eMZgL%$L&Fcj%_!r=TdOg0U~2D?Ok1dQh)Fe2XNp6liy#mXhKiY+nLz z+|(z$Nf0MmRsWVzj#KO&x~sX6e}}R~RtDgh?W#+d)2iGHp6*3v0aj0t0wBv#BO2bIiUw;QVbm2L}V;@eb9FfEJ+x9=k@x?ZOWL zwf_3N;RiAe#sm45>~!@lFU+bL;%#9`UNLNkCRTVdb9Xr$J>Xm2hU%HS^N3cpHWE#G znIL|F+ZWW^p#7p56>{FIrU|HJ1%o4lS6z5srm_;W`AvPLPL76_1e9aOdTzE=vb(#X zjEd|GRsQg5Zg!j1B5?pL&n5WIAaXQ(=ho1Q23^GiH8lqxsLfS}_xL;Z;Xrn1>SGpd znn-ER!_6M9slA>u&`Q2#%Dsdh_2|s5E>vW2ed$rH5sh^w5frz2#W%ghSuY5=iLLMb z?NdeE+{bGH{~MDUcpc?6FfSJz2(W$?1s06(PVS*Yuh3U^P{))BjUGbWI*yIsL-uK6 zx<4-rof%<4N-nOAKhvO&W@i`9k*f=10U>2@W(0HI*N(LIzHsibJxLhOwOrH-^w>}_ z?tK4JzX+2RC!Il?tCrS6T)$PA{=MAyb_F?auG)m|kEXQ-ez>gIf6bPTnJFKgK0JI2 z@7e#E=u;cD;`^EuXa>8=U)SN<53Fz|c^qK$mC(B_4F)>!AK;)o2e#f`cMAm!xvlh% zS0WIYpDx}J z9SymmEEd9$UR`uFE~TG8Yh&5Q+544i^8y=fVPt)?5G`3y^1Y;%aUFpeZ;$=s%xFi7 z{{a4^KnU8Io+N$9Wi6(+%$qQT(94?}^pydamdw8ZNoAQ5$9;5D@kE!{z9z8S zajsukQp%?uWi{)jfLOqSM1Bx7vnK)94^ZFFJLdwJ(7?pttxKgbh+#cxH(-cUXu5{H z?6~8Q%(mC;fE(F0hsEDNWL|AP8FJ@{&e@Awts{Zkboa94WPh+z0jVf6dRA74l;6_6 zDne*xBp!2ms99ZfgAw2C((X8tDh^!e^}Xa2yTt~#O>6>wyWa15!y}9>b|q1Sbo=0k^V$6X1xy{A7Cr?(@yZ?@Q308Hj@mXgPf_N>o7aO0!fOzI9D0pUw zZ1UIZT?0P|`w5KSI(o(9*Iu|y+o7d8g0{y!c;g$1RiL+r=>j6mp!@TG9xUINWVtSW za=7Sb?$MF(mkHD>T_}t*NLbha1NBULH(hTcgm)2B&}_eX6{X?O4Xq;~WFSPzmxFM+ zHi3pfkW(69Kfj8LFc+pTbN{6AHWoAp_RY|~i5xtD-fD^L+6hjTsn5Kp(4Dr9zAp=x zMtElkJYZl-aJXI^EP#c#{AYNbFg1xJ4!?o;b%{yQEt=cx$r6;sVzz!Fta0Ic z({Je2*vs;ofG8?noDaLzI(f#Br$#7V-DPe0Q931zHKmEd$mzJ?Evya~wuQe)oHtmq z*mZFFCoq+l(962YvXFjBe|ty3reK2eHb0zGDGGFvQJiG0))vm$8H-n&266&46nH!8 zdE=EU61!^dC~5ZdJsog-SLow>gST>koik4a<8^~Sl@+fTsy^L6>huVh^N2?>HyxgptCeDtbHAl!?dM^medkm94IxT>2iAwW$xsa zKR!300}nT$%RG^Z3ay{VJ$blu-%4V}2hQH5msZOkfav?M@iB0&Iw3H%a?x=ZS!Y2f z%AtV!uH)N}XE72niovy$T+?-vVrbB0y<}2Y@WX>`I!~bu>wJ2Bl6aIM#QWyS=?ecb zp^iOmesqil3$Nh=KMPGqtBRK?lxMuuVpO^-Qa>X(HjXr?)EKgarfii@z`6xHouDQ$ zj((v-DsH4>br$VjjKd0WvswgDexVtAaPX38xSkO=>t47|mrQP*(~4gCMKX}tV+Ybx zUe#OF`m++U-MYVx0!`=+XlE7+C7MqqAK-n$&0cK-xMryEFL@I`vG5e_ZAIcP^aj8~ zk@H<=8q=q@&6TLhzX51kru8QTR?xB=;2gVYfx=MCDUHes?-N_va3Yyz92j z!bc@n@pC>^~M9TN$Q?j-)VPk}vO-?b*p9i*5$O zxu0hz=~v$Q?2MRt$_<_}P_G#b)s$a(lFX75wm%w)CjfHo{gaMiC3gr^ zl!fuP7Y8ZjP+s8gntSsik-&bb6VG4A>&_HqpCp^1i|{~HcZJ=$c^L}O@%hwAYV@2; z#CkNx#(jV$&s0l?$u8ZL1QyHJ&#>hnz-DIKH!E`xJnxgcSURZ|g(MaT$`pof)VpZ3 zA}Xz~TCRFKe(l-;so%Hm4SZGJ+~!+-6uWft36=i&*hC=oXM4|8o%}lBC^ID-ZTqq0 z9W0n@uxh=G2G+W$@_XXk8}BX_wvt^c*j3N~1KrEEaCvRD(Y!EA>dMuY*!a!7@6QV3mUo0tpC!;v_G6rkk4DJHaA5|qp%R<;f%jnrIGhz}t^K-? zEWR!62&M@6Gvq0ZsG~yqu3;w|9tv*@cJDx8C)d?BaxFt4M|N?HCvBEa%z01JakA$9vCnXUW_9HWanYSDLkIl3uf&|M5eM>c58m#J z*tLb5ogZHQHg;ZjJJ@n$T!J`OY}0XivUD3iFSCu9>Ph=6tV&gYQ=^Z%^a2zRFmnGG zUlQnlUknZ<iA1nKP<;sQJVGcYaormPGgW4+rRy>H8R{oT*< zBY{v%??O8`B?MYW%yaQdOYV14YcP7ntU93AQ(j6u{Y=@LC-1iDO0HU!`>7N^@gq6b zeRv9Z60xnj=~(aFe3)6O3w0<-e5h*~d$z#(W*3aOGMx!hWqp$Ly?d7gYGWwZP`kF; z?Wa4?FQMdV2q9MKel8|_Pde4r6xP&74{S`XHM0D-V<04FQ zw=*V;Y$jm1G8ukKn`e>s(b)#s0s<(Es{-N8xtu#5U&CmLkMP;I0GN2+E=l?6tf(*| zRQ=)i9j)$%Jbc>y;P4uONdvEYe~5MXLi9Z+lfMAl0SYus=`y3zvUpb6lu+#{Kb_h- z0A9*xbVzlfwT0r=w#!uQ;!itr_vVvLj(j!2u>aw%esvjajbe*E>Km!p^*3gd+^yv} zZzj4~Ks$`MF#iF=5l0{j=8$vwP1C1`bH_B!-JYrg%-3B6Vj9kML}StOO85BO6*gYM z-7AIjZA<8Rp12SHNY{xlT5Psq;{ef>C7oO7vKt46Y2Y$gO&(##l(|2cD!D~svc8vv@*BCWQ)@Lzr3-`1Q`A&!m88OjZv@=>=QKG=6owy&zKvNz<_ z@D7Sf;Ts$d%~ak|N>7{EUl)=2NNnD9R@QSp{n^0NYRX#Tvk7PFQ)C~YM6hB|cK6lzN+ zO=xxe!YQmQ#tVHn7X~h9rH`Cj(Y27|LE8x7@!9aQ!g7#_DFxLe&6`c?j}xq}vMoWB z-ELG2uiLlY6F-SFe-m!^IIOO3Y*05;?*2oc!^0}eVJb$#Ma}`7wX+^U$XIZgM&Hew z1-YkIQZh06JLlz?958ymoL%#2WU5QP$g%wTW5xGVCFqskN~Vs!Rx;U5xBGN8icvq> zk(uJv(Uly*o0Fi-@fhkd!)zPr>))w8(ms*K3J6Mp3yg>^i-}b{Wkr^^`{9` zTbJXt&tr60O>5jZHJ387jVUE@zfz)wXgbmN%li_n9P{m2?8TGZfI}yq-d24a9T7LS zMHavCLrU~Y*PlIRsQr8C^S>*o)o)RmQ?Ulir)y{7%U@(j{NTe-Z_B-_vC`YHg({{MFMP06$&M`Ly#GN|3ur`k@J{tG_l_RB zmSMmJR8l~WG!!`OdmT=L?@50>JT_C*wz$1D{KO1TY2;`u4e6e~)5`kO;O9_ z53YF1E+O3mtLjNVB6nHdS|5^L-5N^zsU3oEl|SBQB5jYyqW-*VA;Ns4W^jmtSIR$V`WqPu>d49}R58OWSmgNkfi;A(GUYiU(ES5;Ksa7W&R zw()-X8>p=8vewuwi!yydDkB?>ued)^kbdv>tV+`mb%W$zq<_n%x9%hEK_D2);i(0t zW`H8k1a`q#VPI(1;}a&>h@c&ejZws?Bv(AF$A+F@Ja+&Dh;Xa9)6omz7=Q(A`mCIo zKye6N*Y8A{>6VD4iLu5dbj^0@1a_TICAJpFq243wlqib73w%^G3O=VVd^%riN+AEp0N`{avI9-MLL!X__g zqn@X56xukos~Jg) zMVOJ*g%;S5q7zLLJJpR^s85fT7RFr;Kwsr+RQ#5svt>E7j;Scld`f2$va02Up@!H=(TFQ4f(S&+2OYw zBFm637A{S#nA}#Vx^4UxbuX1+5-eUiMu0dTnkOb^ct60faX3rPNWk?NyZjZ+U1+w) z_jG2+FVYo|0G_P(x#r-l&6f5_oKPVQC|Es6UKv**P>y82QiLnC)x$tSK52qsRu_|p zJE9m&TKBlo;1 zrXw=L$c2JW`Uk}q6AvT};Dk07s)@Nbm=&|5k(jwdA=l%nhGR{gBC)jrrEJS8mi>S_zxZTQVM|d=6WLH{{L;%xa~SMf;~vdod8T#cv5s zSxu-4I)%d739Ni~F$fxiy*X@b(cH;#$m~z6ULa@UuURhQMVMvK7LiRq=4O9K=xvG) zk^SqroRR&i0KXQ&IKd{cGRzQbhQGWm^;H{^6^+`IC4A~b@=Fo=r0yx$P(4{sp$~Vk z88zlqg{pn?{B8s9M|#>q+=dQ>@)NEJKbEy zu2{*?Z5wYp6Hda$M}_grx(438#mXI&pC?Lwvdl0Ym!oAaSsoW z^nO<(2gq5!*((oMnZ7Bozz!ZdPh!=@VaS9rW7Au_5k%{~90+em%G1#jZx`pu%6Q z)D|)w>4D=b0-)-^xC_+$)ogq!rnWx9KT4cvI1OHMl9e%Z?DzKmf~OgQt9m1)V(+s4T*Jd-g`~jd3h&Rd&d0Iu-I|c3sQ!D4Ode1DN{EEnh zSA9XX_==~XOazotXtSl{Qp--wD6TA1+~A#Mi>USf#guEXt3F=@YWy(o-THz2K|AOS zHg{lgs4d{SAdguQ+XBM!Y>7qEzysdMW01%fvXc5|xI>Gsly|%jLNe1vfa$T@yP>1s zkDBFY+~;wiBu^ImOPEtCNA;U=vM29gW2AH~>*OLOW`*6UkDjAm-~3x`(?k=%$>?r$ zFKW;VPQiT!KEOv7qc^{M6bUttHQe6L-+u4akCGqWXwqOLgeVvgBhRK5R?Ul}SJ9G5 z=TTkV=fC9F^T}ej zMRL8SR5!hoe?%q=IF`H|0G4B8U{iUu!0RmFj8Zayu< ztI+fXO~9)^ax)AK#|N~6o_<{``C*HFe;<_JNstilhuu2zCJ>Zv{ol#GVmWt3S+1ir z*Do+LADqYE{Y6-1n8yshd`dwUR%a!Sd9{cHO^c zX;K#CT^D89GOVVR2{xjPYVhJ7;Nnk;vufb+_vX1J!_LsZDBwk#>RXchRW(%$qKdX~ zvl`UPBIWck^nkd=AY6BO;_b1qxEcT%&r%qynh94}xO0^eV;f4JU2fGnrE-{x- z3C`CAitWM`Is%w@xQ3~Z-BWgct(t!gP?4xmYX|xBMYjYe5=|m7)=>;OI7&C|#9jVn z13yEg*A89+|G-+o$A7;|_rJWN_jlj_rNh6!argJr|6a#GtNZs3|GM!1|2zEqPXBrO nuS@#(4*$N>|5=s^ay*&yKV0k3i;3#|(}Z6#zgT$T&eQ(`HY-Ch literal 14864 zcmc(`c|6q7|38XI2qjSoE!M2bE^CRgXE%(cEXkVPSR+)jGH&XPlk|$EE)SQ z#F&_@lWp8HeSY_G@8frt+6-_aCkf%<9Hy4TGH^B#kx3-lp6_xmP%0nH5R1Kh_xx=*v@8a4177)VW~2U8RQA(k!}EYjCJj}jJ>$QJDoU8@-*XBu zNO>qf{{JxGznlL5zQzBp{r}(6_nuTWrLOYm3uKL5s#JoU^gZ@FXvtrd?izL>AJnLF z*(oqmMOX~`mvcnwGv;FXwvyBta$U3h3pd*}y_U@H1<@F#}k47q^vnHnY!$_&TAc)UE7uWJ!!1=iS=p;{8sD1?lql zo#+#1^r+QqE(&5Sc-kMGhh-S@m+)BEF`m(T>cL#-HS|205$wH`r6>e)uk8^@<8g$n zit%|s+)w!x3*vX@BC_I>0q!OIQLHK$2V*RhgY6tZY~R05@XcD3?0Q`h4%nHvq+Ofn znV(na*JHmmH#bQrub?-RT9HXNZ1sdJ_PHRNhhyo#I3_s zmNB$Lcc{+;HlMQpj}KZ?uqdtZzYke~R0CRL^D{<*N8^8u%z%J+TU_Dh&-x-7V!kZZ z6%P0{r|`QNO0u`4dGD`nm65_`BsRo)s<;aI)K9QCsHOgKboyUmea@B*)Ms9xa-YA( z4Ic4vY6y#MiFavUG^a_v8!zncbA_8vL1$CPW55SP0%s`;7%aM|wQt}taFchxdgHDP zpyGZ{h`ZR8UuH6|LQz+05Y8ASJTR?>PD|A<++n9Rc^h5eccHwzjnt1$wkRu- zpP||3UxN=Arx}U@yr4-b^sxfw%P6vYQ{^RaFeB%5LVozSoEmk7zDaR}l5gw#;FLo# z&ntfVoVzJ>tZ+5vA$V>lgo)E)Kgs{h;~;3Tn(c1V+WywumUE_KO{<(VxbL8qN6|o1 z1Z-XniqhAX7i^36{)u_GK%ei=volyz!_phlKlPZ4`SNtfX_25iPhZJR(X6`kGMUSg5~w3T=Bs{SuZk5`NwTXT4=W6g|&tq$&e#GhNDIkES zkTk+}j3sf98PN@=3SA+Y3LtiBLSd5Czw1e%Jn4~`S6kx^#^7WNwp%MwelxL(Ivh-a zZEQ4W(@|u9(A`+*NVwN_Nkdq8S-mocv)^AJl}4^6vyIJtAkn}Da_{TWMvQM*CMu9< zhqAhRtf5a6C435L$9OsgT4o+HH2A5 z@)HCh%?7w`@)_P|#&bZns~Ui8Z|Zi=er2T*X2Pf+7!&XiuuZh^zh5(%HmVjVS39$) zA>1!J3Wo=Gs@e&To9Ke=_Anr$r4QNzhYdeeDa5m)P>_?ZvJWy{TmEs)1vJ9g!#+|SNB5E!D45*FQvQqteVL~E+*essy=G5>3YSC|Dikser}thZSa zt$Cd3OfNY79yr-5>H@!1PlEs{0uLAeP#ftx^Eq|gvfXw)neB+HVrow!=U=n00 z#Lc(om7(EExmh17zZV=P4XUX#uSC{f=05{tzFjbBnB|+kXt56iw#?_7JzlOXnhz^I zS<&}N+vjn-UC<@i-k+uTe#tH`4Pm3Um2d=hszs{PAF;rvW&Q=Q%<<&x1O&JLBL-RU z%-C`!P+g+eI}hcl8j5hd_O|Wl)ykx4y7&hiHIiH9~{*B0@UUceK{N5_sn>neZ4@0m%LteqF}qwh*6gb z8K-+1390VxG}UjPb-fwWVw)W6dMp|mzufK|N`E+%pFkQ`JcPsx9}eH|=?N4_ZTlKZ z-z1`I1TN=rcyGOxud7EkZjkSe7GwG@cU4O)k?Pitx@1fXEEx`&sc(2b3fa|5k3>SX z>i6Bsi?3w1d3bo$Uf6Y6V2Wc%5Aap|wh!04mk939+gJUPKrrs-wQ!eNkFgc+2Gl-S zhf7OLd{T>PrCq12TItBiO7$YGiP>jaYn)?ToYV3GFDzGwbQGlQciTiHhnI?9m;>9J8eH}YGP+=B4B3%cr(PD=Vv%i?p^iEZW) zTE9yJz)UHp43unN5U+yb0E^S+eBAlj%+;^-t*K%|UtxJFnK7*8OsJGHXS~qE9x%Tr z+VzbMRGSy-mboM`FYWgbxGw7z;51WrYts`iUwnj;I{R3n$5jDqut~Aq=;HqnHP1U& z?Om`lzb&obgYTlr-<8tWeg6b`CG%qf1r$MS>&h&zYn@a)YfuSjz>FU{@WOatJdi@kV=JBVUK-cV}6QJgKcM8}sm42NBL>&J>T9Q5H(kO(5n~jQc z8bI?xTt|xp%aPz(J|ZV-j!H(1DZktUzbHXw>Pobsy3}ftPP(pQbU#Ler+N=_9y7nl);^>msF z`2MeVv}n!A+*KwtGm~`6Oa6%az?#`U$YM=tvi^g!%`ggEEPLDYy&FZCU^}S~kJ@=Q zh^M*ZI#^>*M%6qD;7^@NJ;-oM3IyQ?Ht znv2(b-TOs>pGuB6-(uPegE*0r49*XEQrymsLW-rKKk6L@Q$_}vx3(;1S#Y8^rH>nW z{MP&9i4n)c%-xSw4nnNlNk^Qjvp^`K>GYl}Lgz`trC?{kBjw3kpV4#hj};T{94Z)l zeg$LE_r9~HZMsZiulaVrzXESDB#~|ysbDkjhSjS+97?$}1MHY&{m3=g)1$5F6Fu5L z6r7iER=PQN{|Ft8H~2^^Uc5)o?;YxSe@jzd7iS!>eMD?wJQcq;m4rC__%j2bmypNb zlxCIXyH}w>%SQwG39Pv?elKno`&n_F{F^U-I+v-aJ-=l?Alo_XL%o$JX|m#(cc=Bb*xezbGbCu2aQptVK$cbvG`Zz{99_elAxwPY3$( zcr<(+4PUM6B#=o9 zIUTsfCr_a-Zp9T07i>#*MGPkLcc?6zA#iMOU5}aZeJ{gZrk#MXQ@o&uV!0!70^bLA z6OzqQHugtN0&%zui08_~qi&umo}<|?1w#%rT+=`4FG*pK_e#BzE^E#z0gWKlTn#!^ ztbu=rJ#S#W_LHII;Sm%loTEq9>)HGSI+FrZ`SW^{;U|>*$H2ulPDp0Xei1D28=oIa zR9<5WHe@KqiB;YLGlK4LYX7?IX(@!=SO=uJ6`IQTreHvywdip&62gJILmsB!Ts<3& z=m-{3latKh@p0g+%Ke3o{ic45k{gPpcom!gjlEbgq4psM%MhV8q^sDpqr|g#)wGco zL+;bX1o_y}K5pP&crcwKM4>g?+Y$F|troT=MxNaA8P8A1zpSSlNJgL7Dew%XHL*;n zB?fxlBg50g4@a%H(@7q%{fy*5AT+Qq39aGT=HJca3H@I^odHo@8+26dWL^AvyjWjie7-@0uc95a%QIS*(0PuPpH;Sm zlKdlNXACzTUKDKmL6%hXHi@F1@@-DSl}5mHiHyX`aQFJb@?YPu4Ce+Ly)3ZjK`loO zq$vm(R+u@#)%B^3<2NN;Tv*ExL!wi|9f^Lsh3)nm-Aqx!Q{~K)uQ60*>RD-IsJ>_* zO)t>w``O}qn($o5ta-n)SBZ*U6cA9gvVI_udVp5t0xB%hTlFl?psY#s>2^N&?SYk$ z?29f#zivhWmfK(C+-97;t)l_v;vK$=SR?=owByH+Us)&`C|F)C4ePVeJxp9dx|;DU zIfymq4~phROvOf82xKvDE(h(mPWArL%a90(H3n3=zzg}(v9>~8cgQ}lebI-ekB~_2S4Oo;;hzoE8=== zbU?CzIvpZ;6k=)jjqyCVqu!VC$5OG*Ah;X2uWVLTqd0D7vPa_9P?L;VR=7_W<*FYvD&RM%|2<&n98rAaaNmLjpszuvk+U%!G2Q<3IFq=uV2m7Jlq-N8e!WD8 zRY?H5)JS4zu0vdQcf@p*{pnN11Fj?YVXV}@h#bSr;WfpZyb8}KQM~V|$qTc`WP(N; z9C#@MpT^jF?-e01A8mU@%-J)oRqjEXiLk6~(lJ+65^pYF= zVmb1&%i*2#1FcM((9YmIBF||MEOImrD;aDW$cUe)NcI3p1 z0^<-Vp<}|k+XlnjAd@kfc*8ROdTR|sAcdQaclnfzQkq&#nKux-2J{;YP#JZE17gPJ z^BdM(PDtY9nQef&0=g4gXTs!WfKp{F39Nl%mU>fyCP2jokm=7L2$GxlSGn{?t0am^ zzSh+vRvDW_S^iPiRo5T$e*6VBsbMY8n&R>V1^E}b%Y{K6rZZmfb_WFUf_Pn);(YYE zFdt5`v`<`qAGMU&FDmxDoljM4Mc5E=+Wd@;pes~;R(10iaPfA47jd2V4YUScvbU(2 zWOy1W=XAUlN}8*BW&;dU$HajD63vy&ik@*GZaF`}Kzv%v4x|6bpaO7zR_U{MMJpvoIlmTUnHh_GriX<;)M zr~R5aC=AvHVUM-%O@r=^Y?;5nr%ZaYl(kdXRD9I6{HJ0o0(tA}vIaihX*e+Z$p;H2 z(XB_20>Af5z-cufE;X;G?0!_`B3*t_8;fgqpFMr##Zfzni=BF#Cw?<^=I>a3f)+Q! zpsui7S$0KeP*VoleoesD8SWKtsDZb;TrM<+Ri0HIvmWr}t|<8~x5T5U56(-*U<4L9 zxZj!`dVEl6VRa;%P4LNeR=B#U75Mjt+_*e^y`h(l%>sM#+v{pNU^3$vP7+vAo#Tlw zj0&aj@n0P~DoGEhj{>UKd|!%ose{bDR|vA>teSwCUBPcDAC?QiB99NJjC z_4~ckx>MMsP*RQzKmpuvwEfX9%(mQtet=Ng!c=VhJDRCGOgDYe{g#t+?9YgLPBXnh>++y`FvH>SF9+`ixW!Bxw z3D5ORR8ZEHI-?`k$3#i}y&-ByF5Q~ncK+^~;Y^5lbrT6*<_^c2BMaIG_Pr-|{S7Kp z4*vjky<~!E6dyg@?-K!XgRtN4c6j73kKHGe?6e@{=_qgSj1*}YDK2s39{qQw*)$L_ z?1@hpoznf_ckL|?>SDk~fhP6xCt$PvA8DcDfTzVJo@@eWK@OmWm+_|7P- zWdvf;&dQENc4Fv^mV(50S}!-u<6lO2oi)gj@}nSo?f}G2rQnUs0Fk%0d>4-nhwBeq z1I#Wt?YTY7<5OU}$H~DmD)a0Y#JU|sw-l63D02yDUUNUI=MZB6AgNf*Y;Pny%@N_a zNkO$bYTV+I+c~L5-esS{3s?ZYZYSjJxGcoGq#qo;>*(_M9&?Pk(mBU-= zExw z;Hww@u3Bdl$`$bUqT;2hkNro|U4|l|T|c6_mAh62yw-MH9uhLHWwu??vo?yQfCJ?? z8gpl}tHe0EN-8Ov*4}N_^yeCqF>5TvkdMnopC6}=e0E6x^rWp5L{AMxJ`y51(bxj+?V#^8rmrkikqFGo4T9D6KXnn8 zM(IS34~a!q9Qah0Nw}shN6}VV-BQ^b_;b6@^Ikhv8n9sLY46>&&#R1Ous>h3un^zLs+CL%3jKUfaaOtEU!dD)Fep;qNcEY! zCi7!gBGi|Yi`N6QtnXeTj;pW)9+f6GMKKcuI73sbX5 zv&MpKStLHx&R_INgfkjIxOq5nmk|JcU|*xR$pnevJQ z7$ZfS2ST~PNk=jR~DWIAkCtiW{yh|6B&tL8H_WZ7Im)u z)PW831vEewsZ9#20z8H9BYP|W>xuy`Z%V?z^=de+4J3()PTX%4q9Iggbo70W_(Rw~ zj0RbS?3yY)%(lbPJ-5R{Rx?$wg#wQH>}FxzAu7TKJfTu7GYaH9-qh6C#0hA8Uahrn zXJT3h6YCy7DSa;7K4YaBwN@L6}js3KJ^UV%n;*A3fz0LvA1 zs{BxH;YT8I0QEK8eEej5#%h*5Jvq~dX%tw1OS|4#&CFY%5_y%O7-}Z{QwN10d zhgg_78w@Gfe<ZGK~Iob{6O%&pfalgGg!nY`GxxQdG@Jl;0-kR-{Sw$)`|M ze@=hRY*W^eo3f32dDyeJ{xs$jH2@xW+VQRkUPaSI-nBDyYNIRNaat<_Y{qgb#p4cN z7n!J_fREdKLcQ>3unpO+npY{51e&ZSedim2u2Mb}ILi}SXDF{ka`FWBDjs%(XB98` z^`E5$Ca0GXr4_tyAW7J~))mps5l=OsD4^PU3&bTk#rPYFWVoJ3A2XcMTT^a6ZNI;JFP zhA&;ojPi!(_plixao^_&njs2i6`A9z1uICSSC6ks+og$gUkO8ET}!{5Cmh^@`8flL z%?8L-kHB1D?g}=ZTKlr_Iya{5zmlT^#Q-M}&It!hqteiFllG>{*L=^=D`E@U5+4uK z1Z<1&Fsiyt4in31&2S^}CJEU;Yp`PcjH*wO-1TIEafu|e{7O~eyyZapg+`=dj^sm< zO`y3k$)mk|G87(v>_c))12D_oMFT6c_(RCxsprvHuwKFO=#ar$GkxwBe*pu@%#nw#ceZ zf30oy$dCIN8ET@^!*ohrj_XolooLR?-_+vLW6O-SLC?_L!Gw_?{f!1VWW?%o0D;TI z@BS9tdlFwd_mH6kv(I_%9?+ig4_xtJV z4-sM0dw?E+wFKCrVOnc=dzF`<5J#wQCdjIFtu$Ll(@Mluu(#v)I4G`(Ps(jmN8Sr3d2m}|(T2>{wLLm~S zz;n?gF_g4Ri|$6C%|9sf%fs@UN<+%L}!>CQ>N9 zxax02vudlC`Plb@@`xE|a`;>qGvrWH#8?Q9W8hu#gveF@%0t(mLz^~&Spo_MQs?i1 z<>q?S{pC4LYl~H8Aq<6-pxKNYaQLSt8DpZcsz2INYs`E0Zc0ve6D?>u>R~FCQ{VaZ zp|>3E0x|I7f!+m6yj6CnmE*LOb1hrlv7y4A(V)DucJOx*FPjOkdD4jPVN>){_3H$v z>vKBo=y$piu6CvHrGoM*x$-ylxdM$0nQ{fUq67h1Dz*5d{2NrD!a_#{&g4H2CF%2j zN&Ngj7%=8|Y((b=F*Czi9}`L{2!#@dhYpC=sbj@*0z4vNiB~{D$LF$^fbNMWgmpT1mhPg0+f&a)?dL5C%o<8>OB$iF~Y&Hmw&R>sc z37ieN@pOBINtLue(jQSmfdAa40ej*oem02XlNdTl1$*#H*gdaM@Y&$|$0zKkDZL-j z%c03lm_1!HGo{8)2V@jqXFYk=AiIDCySGd^h@fOlg~Xs96w@=8cuZ>N6tLtjy-ziv zVWDDOibkuOnZ=oz>6fB0C1`Z>P6Haf+VDNi-Go4LLI=C=RgGtBsV^y8M>$1oyc#h2(-VQ?&D9o!7ro1V8h>TgMMFf+q$ z9@Hmwx|*4V^g$zgi#t+1>QWY`Imt(w2sy}%shLa}0q&<1IlXltS51uDYrD{gMvHg% zPcP{+q;FlV%Frs4HiBC6o*(ORYd&l{fWKMvFf-%z8r3CZ*xCqabOqw~a{rS`Y~y}@ z1h1A|P_G4qY+^PXXb0sv9qEaC&@CIHXCI<8t6}Nf+!8WJ%$wOFN)Y!*qx_;3-5V#m zrR^kALc)KAkrgkNlD@#T5q6&SS58zZ)MO6&7lvTERk>DHG0i3D)gs!VH_7m{V*bjE zVzWOIm1(NhDn$6q8-{z>#y>Klj#T8FnG-bY)oBh)^(THhWsiIhEwS;iMsU-3my>h^te?3x`JUrW^)o zeYWkmi=5{!@G~0SIsASM(pSAl-{Yl*9N_)F`FvSZTfPz2D=la=P8zls$W0FfevFYb z>2H1OiS}{We9-bp1aJBa6~fqu)qoYHY*r*P6vsBfyD9~w(|;>#8YSvPSH%xpc*nC5 zPDuEhHy>1_I5t@eQM3VIsg-P2f0#vnND*FzT=wzqj}2IlGBT^i7sXc7xBeIP<|3hm zuQBNJmn)Rg=42Ygqy=e(zzZLAv!;X|wzafqZ`#UJaNThZZmuBm!nVEmD!Vqd2>GCm@do%pM`^N}1s3l!=O@ z{1&&92M*(B=6qZICFSlDc8N*QGk*HlPK>do$3J)jn_)y1HaaEmb}#rkR9Hm)mhL@$ zv}dH$xU=9=3cusTJv2!qm?4hSdTD=wocP#;S9gfK!L47rNq=nX^pvxiUevd*?!0rJ zwlI^ynq@>E`ZMDkZ*p;fP*|f>Z)=opd-fOc)1|P!D-nI44VxvSRYk@=;M3a=!=92C zd+sp8m--jj%9f+odO~Jq=V^M#`*}VyzZvO1pBzlC-=f&KD+il(*!E&bye5?i9ImW9*`SE!TM{ z_mmf$LfXQ8TMkweXAe>r8-N9)Pd!?F-AUSU=~j48fVv5PK3TeoF=zU`+7e2((F#y8 zvUq&bJ_O%Q|6k1}w5u%CUfE8i7hzf`t!oAw_76jw1Bt1nqWV1Xf1VL(z880cDzewu zZ1_r-0bCGd@)7l`%lal z+lXJah()O`O@=Z~h=Kk+UFpW) z{c}G&Bk>B=N%6AIx#_=DZ#z;GP9dZDj`4pd!RE%`P(3_cXwB)??o$pu zK*5ZfJ20nr?AFAkV&D|ekrin4V}vvJfWG(AbCBiMkh_C7KpZi{b)o-bbZvg`N}C}# z#_|q!s#eqU1M~J6;l9fTR8= z6DO?Od~H$V-P^##9DEHi;Jxsc9uk1q?q2xS;ze(HDkZ>|TB|Au@zU+Ipy@~m#rL=9oPtW)P0$PxpLzI2HX9wK+FO3cJHM1(6j|%xU!NjT z^Rqsz;ak{JAPc}BqO<0X-4U#K3=hVNrWqbHAL4tG{xpI>i4h5=$`^!=TCZ6z+Do3v!a&D8|`0cnOo?xSf1u z=X3@najS}%(L9XBX2gFw7NzD^m?9{nYHt^ zC@*&qFcs-W`2gqUZ?Fsc!&pcEaoEDw;n$1^=bsJ+`?}@$W~b%K<{EeR1sz9Iq6npWA0UFU4?*MMMCx2TErJz=LZb zX)U8kr#k0sLPr0EpH;I@NvMA_qk)QK=RU*yhQ+5N9!FyZXL4$=wbFH<-PdHy9k$XO z_WZ@2y|{VMA23|z0J@2*-h-?cIkqWx6smtb5Yk3Gt@x)IH0mTh&^2C3zn?w|g&PA` z&Zw%i)X%94S2c-~k;rHJ&AC0n+jFx)+Xo)fGvjkhx?v$_EbHJvB<>8@n^H9Xoek<@ zDSSKmNu+N`7g6=5_Vf|}DhKuL1F~o|+G2F4gVAnNs%s{!v-$Fyy*F`qm+pvjru44R zNP0Zk@)1CJ&1X(?4omIa>?)*jV9<|)u=FHq#!t9Dt~^2gOG>|f8_(@zH*^z^bgd2j z)+lN7MZfQwpg=F(*n2|}pjp4T#8-kiK9vRT@3pfaQnRVDjt)nV4jDI0(Q6q% zCi2u)}Zg3w*(&1-@NH zd~ef0-|@QT7t!A_eJhoOeMx;el5dlZFVa!b4qiVvE}J#W5jh45O%@QnC} zE&iqfOm$k_m4xY(&O|{SEE+8jKfF+7vOaMh98eznm5lM}(08$)kZ5#REwGqWw@CsI zF_Eaf`|{wrsV07Q0`Lg*%5Fg38HlnyQ?A%bux+tb{B8t)5s$f9t;I+Q9WcZVqaAE{ zTTa;tG~|@UV>2_Ea`aI%{5dr%V~hmpaZBH>t0 z$c(@qzrNe*hh!j3R8wWVpZc6IGpWh&`%vSML`tKrd!?)>$q$FvZ;=u(Q=@d`dzi@T z{~dUD4J%IV|8oV{wa>dTI0%B0p*R*V5LvBGvenvo7;grXOye(E7J+ks@1U*3Af;sK=GGLs)4g zMX?FpT9(_-DnhB$ciz3yoz~s#mrg-(D2msj(FNHc(en3z&bapf}=H7@9#C)pqW9Gy>tOh6XY$A)sZqj2O_ne4{5risSM&h4}!ip$KhP_W*@I! z20|g**FlrF;6yL@K=fyr1pkH9&j&xV41HIJX8!tCReu6b0t)WC>Q7`kUmOgM^M^@* zVWr5Rvz)(0Pyqyw>E1hLX3_s_n?#oziZZq=excN-6^~e6AFHk}Qtlze&A3^y2Aow7T>U-+DjPZntX7o`p**Z$F>RdUzIZ>c1oQ1^F$n(Mf)BM- zY6c`+nEDAc?|A#ef}(B@p|``^NPH2yc_DN@iZqa3q)FFc2jaD1|D#1CD?kxZNC*2u zhePqkL9)}g7o6%8Gb%PLxY6015VEz|aHmiBbZEMlN>Y1>N(#6N)_|HhdqrNO*>o*5 zS|@vCT!L;$(`E|Jx>tayFa$h(f3V9PVFxu3Ok$AXPhNNVFrCwBfJgCmHoi&dVQVw! zNf_3kiD;aMez}RUymNH85e%fl@+I3q-^Xl@oD3$$sD74W--5#Usjp>x+>aRROq_5RqRjRZiY+rtLojd-CCkisb^&_7H9*RzFc2R zjbVYH@0t;>Tm5EA%TT4e-`+P3ab>@GxWAt`*Vz40B}nrHrlQi^M)s{HfFUW}JToqD zHp6+O?iV%@ubyDM=t4yxn;ZZnrXz_Au%}z!BfYkaFuq%oe4M^1&Vf#u+p|f## z&%kA;nsgOitLFD2y4>6<^S)s@y({MdD6JdtKGB9Zfwt@_{%x)VEsiga-LWj(#CAb) z#YQKk-7Ga3x8seerXwCGc2!llEzooN-Ws7xahZCicNsKd6;#jHR1nlLN)N;S43VZ^ zd*4W{n+vu2kmU5O%S08&DRyw%PH-=I(GA55atZ_S<3e36IP8Y2MBYZ8SDUM~U{o$2 zo&m`;Oi&Zz7Mly+wfqcSfa-Y~;nx zwKhX;HI^_}q#S~{b0BlDoUxdfgI#CY3uAty&@3tkKfbX{{81huM+Qa2AU~rw-|2>W z(mD6s)rld{QGbc9K)29-IanTc*>7pHW1%Uf*k$fveBW9MpIt`(^tD+6{$(3p|H2Wb zf?x|9J+K?QXC@iL|AAkai`NLJ_bxLP+d}GISh^JNpXE%wf#btDl`UIAgA%(#c+yBs zzn5ZE_!XK9{a-BQOm@mqzptrd#l2GIcJ!a@vCWXWEbd!!4>pQgQU)2h>N&|U8G;FKi`h%00Jt`b?fm z{cl5g*2+A#nMrsvsPL4sDzi3T$r0GQuIJ|=S7=QP{F_X2?JVxgUr^ffHII<6t<8 diff --git a/docs/content/providers/consul-catalog.md b/docs/content/providers/consul-catalog.md index d387f6ada..0a8486b9e 100644 --- a/docs/content/providers/consul-catalog.md +++ b/docs/content/providers/consul-catalog.md @@ -14,12 +14,12 @@ Attach labels to your services and let Traefik do the rest! Enabling the consulcatalog provider ```toml tab="File (TOML)" - [providers.consulcatalog] + [providers.consulCatalog] ``` ```yaml tab="File (YAML)" providers: - consulcatalog: {} + consulCatalog: {} ``` ```bash tab="CLI" @@ -39,34 +39,19 @@ See the dedicated section in [routing](../routing/providers/consul-catalog.md). ## Provider Configuration -??? tip "Browse the Reference" - If you're in a hurry, maybe you'd rather go through the configuration reference: - - ```toml tab="File (TOML)" - --8<-- "content/providers/consul-catalog.toml" - ``` - - ```yaml tab="File (YAML)" - --8<-- "content/providers/consul-catalog.yml" - ``` - - ```bash tab="CLI" - --8<-- "content/providers/consul-catalog.txt" - ``` - ### `exposedByDefault` _Optional, Default=true_ ```toml tab="File (TOML)" -[providers.consulcatalog] +[providers.consulCatalog] exposedByDefault = false # ... ``` ```yaml tab="File (YAML)" providers: - consulcatalog: + consulCatalog: exposedByDefault: false # ... ``` @@ -86,14 +71,14 @@ See also [Restrict the Scope of Service Discovery](./overview.md#restrict-the-sc _Optional, Default=```Host(`{{ normalize .Name }}`)```_ ```toml tab="File (TOML)" -[providers.consulcatalog] +[providers.consulCatalog] defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)" # ... ``` ```yaml tab="File (YAML)" providers: - consulcatalog: + consulCatalog: defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)" # ... ``` @@ -113,92 +98,43 @@ and the template has access to all the labels defined on this container. This option can be overridden on a container basis with the `traefik.http.routers.Router1.rule` label. -### `enableServiceHealthFilter` +### `refreshInterval` -_Optional, Default=true_ +_Optional, Default=15s_ ```toml tab="File (TOML)" -[providers.consulcatalog] - enableServiceHealthFilter = false +[providers.consulCatalog] + refreshInterval = "30s" # ... ``` ```yaml tab="File (YAML)" providers: - consulcatalog: - enableServiceHealthFilter: false + consulCatalog: + refreshInterval: 30s # ... ``` ```bash tab="CLI" ---providers.consulcatalog.enableServiceHealthFilter=false +--providers.consulcatalog.refreshInterval=30s # ... ``` -Filter services with unhealthy states and inactive states. - -### `refreshSeconds` - -_Optional, Default=15_ - -```toml tab="File (TOML)" -[providers.consulcatalog] - refreshSeconds = 30 - # ... -``` - -```yaml tab="File (YAML)" -providers: - consulcatalog: - refreshSeconds: 30 - # ... -``` - -```bash tab="CLI" ---providers.consulcatalog.refreshSeconds=30 -# ... -``` - -Defines the polling interval (in seconds). - -### `intervalPoll` - -_Optional, Default=false_ - -```toml tab="File (TOML)" -[providers.consulcatalog] - intervalPoll = true - # ... -``` - -```yaml tab="File (YAML)" -providers: - consulcatalog: - intervalPoll: true - # ... -``` - -```bash tab="CLI" ---providers.consulcatalog.intervalPoll=true -# ... -``` - -Poll the Consul Catalog metadata service for changes every `consulcatalog.refreshSeconds`, -which is less accurate than the default long polling technique which will provide near instantaneous updates to Traefik. +Defines the polling interval. ### `prefix` _Optional, Default=/latest_ ```toml tab="File (TOML)" -[providers.consulcatalog] +[providers.consulCatalog] prefix = "/test" # ... ``` ```yaml tab="File (YAML)" providers: - consulcatalog: + consulCatalog: prefix: "/test" # ... ``` @@ -208,21 +144,21 @@ providers: # ... ``` -Prefix used for accessing the Consul Catalog service +Prefix used for accessing the Consul service metadata. ### `constraints` _Optional, Default=""_ ```toml tab="File (TOML)" -[providers.consulcatalog] +[providers.consulCatalog] constraints = "Label(`a.label.name`, `foo`)" # ... ``` ```yaml tab="File (YAML)" providers: - consulcatalog: + consulCatalog: constraints: "Label(`a.label.name`, `foo`)" # ... ``` @@ -271,3 +207,325 @@ The expression syntax is based on the `Label("key", "value")`, and `LabelRegex(" ``` See also [Restrict the Scope of Service Discovery](./overview.md#restrict-the-scope-of-service-discovery). + +### `endpoint` + +Defines Consul server endpoint. + +#### `address` + +_Optional, Default="http://127.0.0.1:8500"_ + +```toml tab="File (TOML)" +[providers.consulCatalog] + [providers.consulCatalog.endpoint] + address = "http://127.0.0.1:8500" + # ... +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + address: http://127.0.0.1:8500 + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.address=http://127.0.0.1:8500 +# ... +``` + +Defines the address of the Consul server. + +#### `scheme` + +_Optional, Default=""_ + +```toml tab="File (TOML)" +[providers.consulCatalog] + [providers.consulCatalog.endpoint] + scheme = "https" + # ... +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + scheme: https + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.scheme=https +# ... +``` + +Defines the URI scheme for the Consul server. + +#### `datacenter` + +_Optional, Default=""_ + +```toml tab="File (TOML)" +[providers.consulCatalog] + [providers.consulCatalog.endpoint] + datacenter = "test" + # ... +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + datacenter: test + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.datacenter=test +# ... +``` + +Defines the Data center to use. +If not provided, the default agent data center is used. + +#### `token` + +_Optional, Default=""_ + +```toml tab="File (TOML)" +[providers.consulCatalog] + [providers.consulCatalog.endpoint] + token = "test" + # ... +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + token: test + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.token=test +# ... +``` + +Token is used to provide a per-request ACL token which overrides the agent's default token. + +#### `endpointWaitTime` + +_Optional, Default=""_ + +```toml tab="File (TOML)" +[providers.consulCatalog] + [providers.consulCatalog.endpoint] + endpointWaitTime = "15s" + # ... +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + endpointWaitTime: 15s + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.endpointwaittime=15s +# ... +``` + +WaitTime limits how long a Watch will block. +If not provided, the agent default values will be used + +#### `httpAuth` + +_Optional_ + +Used to authenticate http client with HTTP Basic Authentication. + +##### `username` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.httpAuth] + username = "test" +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + httpAuth: + username: test +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.httpauth.username=test +``` + +Username to use for HTTP Basic Authentication + +##### `password` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.httpAuth] + password = "test" +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + httpAuth: + password: test +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.httpauth.password=test +``` + +Password to use for HTTP Basic Authentication + +#### `tls` + +_Optional_ + +Defines TLS options for Consul server endpoint. + +##### `ca` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.tls] + ca = "path/to/ca.crt" +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + tls: + ca: path/to/ca.crt +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.tls.ca=path/to/ca.crt +``` + +`ca` is the path to the CA certificate used for Consul communication, defaults to the system bundle if not specified. + +##### `caOptional` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.tls] + caOptional = true +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + tls: + caOptional: true +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.tls.caoptional=true +``` + +Policy followed for the secured connection with TLS Client Authentication to Consul. +Requires `tls.ca` to be defined. + +- `true`: VerifyClientCertIfGiven +- `false`: RequireAndVerifyClientCert +- if `tls.ca` is undefined NoClientCert + +##### `cert` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.tls] + cert = "path/to/foo.cert" + key = "path/to/foo.key" +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + tls: + cert: path/to/foo.cert + key: path/to/foo.key +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.tls.cert=path/to/foo.cert +--providers.consulcatalog.endpoint.tls.key=path/to/foo.key +``` + +`cert` is the path to the public certificate for Consul communication. +If this is set then you need to also set `key. + +##### `key` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.tls] + cert = "path/to/foo.cert" + key = "path/to/foo.key" +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + tls: + cert: path/to/foo.cert + key: path/to/foo.key +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.tls.cert=path/to/foo.cert +--providers.consulcatalog.endpoint.tls.key=path/to/foo.key +``` + +`key` is the path to the private key for Consul communication. +If this is set then you need to also set `cert`. + +##### `insecureSkipVerify` + +_Optional_ + +```toml tab="File (TOML)" +[providers.consulCatalog.endpoint.tls] + insecureSkipVerify = true +``` + +```yaml tab="File (YAML)" +providers: + consulCatalog: + endpoint: + tls: + insecureSkipVerify: true +``` + +```bash tab="CLI" +--providers.consulcatalog.endpoint.tls.insecureskipverify=true +``` + +If `insecureSkipVerify` is `true`, TLS for the connection to Consul server accepts any certificate presented by the server and any host name in that certificate. diff --git a/docs/content/providers/consul-catalog.toml b/docs/content/providers/consul-catalog.toml deleted file mode 100644 index 7915ecfba..000000000 --- a/docs/content/providers/consul-catalog.toml +++ /dev/null @@ -1,44 +0,0 @@ -# Enable Consul Catalog Provider. -[providers.consulcatalog] - - # Expose Consul Catalog services by default in Traefik. - exposedByDefault = true - - # Prefix used for accessing the Consul service metadata. - prefix = "traefik" - - # Defines the polling interval (in seconds). - refreshSeconds = 15 - - # Defines default rule. - defaultRule = "foobar" - - # Defines Consul Catalog Provider endpoint. - [providers.consulcatalog.endpoint] - - # Defines the consul address endpoint. - address = "127.0.0.1:8500" - - # Defines the scheme used. - scheme = "foobar" - - # Defines the DC. - datacenter = "foobar" - - # Defines the token. - token = "foobar" - - # Defines the expoint wait time. - endpointWaitTime = "15s" - - # Defines Consul Catalog Provider TLS endpoint. - [providers.consulcatalog.endpoint.tls] - - # Defines Consul Catalog Provider endpoint. - caOptional = true - - cert = "foobar" - - key = "foobar" - - insecureSkipVerify = true diff --git a/docs/content/providers/consul-catalog.txt b/docs/content/providers/consul-catalog.txt deleted file mode 100644 index 79781aae1..000000000 --- a/docs/content/providers/consul-catalog.txt +++ /dev/null @@ -1,53 +0,0 @@ -# Enable Consul Catalog Provider. ---providers.consulcatalog - -# Enable Consul Catalog Provider constraints. ---providers.consulcatalog.constraints - -# Defines the Consul Catalog default rule. ---providers.consulcatalog.defaultrule - -# Defines the Consul Catalog endpoint address. ---providers.consulcatalog.endpoint.address - -# Defines the Consul Catalog endpoint data-center. ---providers.consulcatalog.endpoint.datacenter - -# Defines the Consul Catalog endpoint wait time. ---providers.consulcatalog.endpoint.endpointwaittime - -# Defines the Consul Catalog endpoint http auth password. ---providers.consulcatalog.endpoint.httpauth.password - -# Defines the Consul Catalog endpoint http auth username. ---providers.consulcatalog.endpoint.httpauth.username - -# Defines the Consul Catalog endpoint scheme. ---providers.consulcatalog.endpoint.scheme - -# Defines the Consul Catalog endpoint tls CA. ---providers.consulcatalog.endpoint.tls.ca - -# Defines the Consul Catalog endpoint tls optional CA. ---providers.consulcatalog.endpoint.tls.caoptional - -# Defines the Consul Catalog endpoint tls cert. ---providers.consulcatalog.endpoint.tls.cert - -# Defines the Consul Catalog endpoint tls insecure skip verify. ---providers.consulcatalog.endpoint.tls.insecureskipverify - -# Defines the Consul Catalog endpoint tls key. ---providers.consulcatalog.endpoint.tls.key - -# Defines the Consul Catalog endpoint token. ---providers.consulcatalog.endpoint.token - -# Defines the Consul Catalog expose by default. ---providers.consulcatalog.exposedbydefault - -# Defines the Consul Catalog prefix. ---providers.consulcatalog.prefix - -# Defines the Consul Catalog refresh interval. ---providers.consulcatalog.refreshinterval diff --git a/docs/content/providers/consul-catalog.yml b/docs/content/providers/consul-catalog.yml deleted file mode 100644 index 734886c0b..000000000 --- a/docs/content/providers/consul-catalog.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Enable Rancher Provider. -providers: - consulcatalog: - - # Expose Consul Catalog services by default in Traefik. - exposedByDefault: true - - # Defines the consul address endpoint. - address: 127.0.0.1:8500 - - # Defines the scheme used. - scheme: "foobar" - - # Defines the DC. - datacenter: "foobar" - - # Defines the token. - token: "foobar" - - # Defines the expoint wait time. - endpointWaitTime: "15s" - - # Defines Consul Catalog Provider TLS endpoint. - endpoint: - tls: - - # Defines Consul Catalog Provider endpoint. - caOptional: true - cert: "foobar" - key: "foobar" - insecureSkipVerify: true diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 4696c98f6..7a2f4e0e4 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -108,19 +108,19 @@ refreshSeconds = 42 intervalPoll = true prefix = "foobar" - [providers.consulcatalog] + [providers.consulCatalog] constraints = "foobar" prefix = "traefik" defaultRule = "foobar" exposedByDefault = true refreshInterval = 15 - [providers.consulcatalog.endpoint] + [providers.consulCatalog.endpoint] address = "foobar" scheme = "foobar" datacenter = "foobar" token = "foobar" endpointWaitTime = "15s" - [providers.consulcatalog.endpoint.tls] + [providers.consulCatalog.endpoint.tls] ca = "foobar" caOptional = true cert = "foobar" diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 114523f2b..5b9d5f5bc 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -115,7 +115,7 @@ providers: refreshSeconds: 42 intervalPoll: true prefix: foobar - consulcatalog: + consulCatalog: constraints: foobar prefix: traefik defaultRule: foobar diff --git a/integration/fixtures/consul_catalog/default_not_exposed.toml b/integration/fixtures/consul_catalog/default_not_exposed.toml index 49e2bebc9..f47ba97db 100644 --- a/integration/fixtures/consul_catalog/default_not_exposed.toml +++ b/integration/fixtures/consul_catalog/default_not_exposed.toml @@ -13,8 +13,8 @@ insecure = true [providers] - [providers.consulcatalog] + [providers.consulCatalog] exposedByDefault = false refreshInterval = "500ms" - [providers.consulcatalog.endpoint] + [providers.consulCatalog.endpoint] address = "{{ .ConsulAddress }}" diff --git a/integration/fixtures/consul_catalog/simple.toml b/integration/fixtures/consul_catalog/simple.toml index 59506bb1d..93265e7d9 100644 --- a/integration/fixtures/consul_catalog/simple.toml +++ b/integration/fixtures/consul_catalog/simple.toml @@ -13,9 +13,9 @@ insecure = true [providers] - [providers.consulcatalog] + [providers.consulCatalog] exposedByDefault = true refreshInterval = "500ms" defaultRule = "{{ .DefaultRule }}" - [providers.consulcatalog.endpoint] + [providers.consulCatalog.endpoint] address = "{{ .ConsulAddress }}" diff --git a/pkg/config/static/static_config.go b/pkg/config/static/static_config.go index 93f970ff3..9e1aff800 100644 --- a/pkg/config/static/static_config.go +++ b/pkg/config/static/static_config.go @@ -162,7 +162,7 @@ type Providers struct { KubernetesCRD *crd.Provider `description:"Enable Kubernetes backend with default settings." json:"kubernetesCRD,omitempty" toml:"kubernetesCRD,omitempty" yaml:"kubernetesCRD,omitempty" export:"true" label:"allowEmpty"` Rest *rest.Provider `description:"Enable Rest backend with default settings." json:"rest,omitempty" toml:"rest,omitempty" yaml:"rest,omitempty" export:"true" label:"allowEmpty"` Rancher *rancher.Provider `description:"Enable Rancher backend with default settings." json:"rancher,omitempty" toml:"rancher,omitempty" yaml:"rancher,omitempty" export:"true" label:"allowEmpty"` - ConsulCatalog *consulcatalog.Provider `description:"Enable ConsulCatalog backend with default settings." json:"consulcatalog,omitempty" toml:"consulcatalog,omitempty" yaml:"consulcatalog,omitempty"` + ConsulCatalog *consulcatalog.Provider `description:"Enable ConsulCatalog backend with default settings." json:"consulCatalog,omitempty" toml:"consulCatalog,omitempty" yaml:"consulCatalog,omitempty"` } // SetEffectiveConfiguration adds missing configuration parameters derived from existing ones. diff --git a/webui/src/statics/providers/consulcatalog.svg b/webui/src/statics/providers/consulcatalog.svg index 28bbadd24..a692dede2 100644 --- a/webui/src/statics/providers/consulcatalog.svg +++ b/webui/src/statics/providers/consulcatalog.svg @@ -1 +1,10 @@ -Asset 1 \ No newline at end of file + + + + + + + + +