From f0bfab824f1732dcf02fff78619581ef335accd2 Mon Sep 17 00:00:00 2001 From: wjunLu Date: Thu, 26 Dec 2024 15:43:53 +0800 Subject: [PATCH] Add docker image for Apache kudu. --- kudu/1.17.1/22.03-lts-sp4/Dockerfile | 55 ++++++++++ kudu/1.17.1/22.03-lts-sp4/entrypoint.sh | 140 ++++++++++++++++++++++++ kudu/README.md | 59 ++++++++++ kudu/doc/image-info.yml | 61 +++++++++++ kudu/doc/picture/logo.png | Bin 0 -> 21572 bytes kudu/meta.yml | 2 + 6 files changed, 317 insertions(+) create mode 100644 kudu/1.17.1/22.03-lts-sp4/Dockerfile create mode 100644 kudu/1.17.1/22.03-lts-sp4/entrypoint.sh create mode 100644 kudu/README.md create mode 100644 kudu/doc/image-info.yml create mode 100644 kudu/doc/picture/logo.png create mode 100644 kudu/meta.yml diff --git a/kudu/1.17.1/22.03-lts-sp4/Dockerfile b/kudu/1.17.1/22.03-lts-sp4/Dockerfile new file mode 100644 index 00000000..ef36ac04 --- /dev/null +++ b/kudu/1.17.1/22.03-lts-sp4/Dockerfile @@ -0,0 +1,55 @@ +ARG BASE=openeuler/openeuler:22.03-lts-sp4 +FROM ${BASE} AS build + +ARG VERSION=1.17.1 + +RUN yum install -y autoconf automake cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-plain \ + flex gcc gcc-c++ gdb git java-1.8.0-openjdk-devel krb5-server krb5-workstation libtool \ + make openssl-devel patch pkgconfig rsync unzip vim-common which hostname memkind gem graphviz \ + ruby-devel zlib-devel openeuler-lsb && \ + ln -s /usr/bin/python3 /usr/bin/python + +RUN curl -fSL --output kudu.tar.gz https://github.com/apache/kudu/archive/refs/tags/${VERSION}.tar.gz && \ + mkdir -p /kudu && tar -zvxf kudu.tar.gz -C /kudu --strip-components=1 && \ + rm -f kudu.tar.gz && yum clean all + +RUN cd /kudu && \ + build-support/enable_devtoolset.sh && \ + thirdparty/build-if-necessary.sh + +RUN mkdir -p /kudu/build/release && cd /kudu/build/release && \ + ../../build-support/enable_devtoolset.sh && \ + ../../thirdparty/installed/common/bin/cmake \ + -DNO_TESTS=1 \ + -DCMAKE_BUILD_TYPE=release ../.. && \ + make -j"$(nproc)" && \ + make DESTDIR=/opt/kudu install && \ + ln -s /kudu/build/release/bin/kudu /usr/bin/kudu + + +FROM ${BASE} + +ARG BUILD_DIR="/kudu" +ARG INSTALL_DIR="/opt/kudu" +ARG DATA_DIR="/var/lib/kudu" + +COPY --chown=kudu:kudu entrypoint.sh / +RUN yum install -y shadow-utils && \ + groupadd -g 1000 kudu || groupmod -n kudu $(getent group 1000 | cut -d: -f1) && \ + useradd --shell /bin/bash -u 1000 -g kudu -m kudu && \ + mkdir -p ${INSTALL_DIR} && chown -R kudu:kudu ${INSTALL_DIR} && \ + mkdir -p ${DATA_DIR} && chown -R kudu:kudu ${DATA_DIR} && \ + chmod +x /entrypoint.sh + +WORKDIR $INSTALL_DIR/bin +COPY --chown=kudu:kudu --from=build ${BUILD_DIR}/build/latest/bin/kudu ./ +ENV PATH=$INSTALL_DIR/bin/:$PATH + +WORKDIR $INSTALL_DIR +COPY --chown=kudu:kudu --from=build ${BUILD_DIR}/www ./www + +USER kudu + + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["help"] \ No newline at end of file diff --git a/kudu/1.17.1/22.03-lts-sp4/entrypoint.sh b/kudu/1.17.1/22.03-lts-sp4/entrypoint.sh new file mode 100644 index 00000000..92a636de --- /dev/null +++ b/kudu/1.17.1/22.03-lts-sp4/entrypoint.sh @@ -0,0 +1,140 @@ +#!/bin/bash + +set -e +set -o pipefail + +function print_help { + echo "Supported commands:" + echo " master - Start a Kudu Master" + echo " tserver - Start a Kudu TServer" + echo " kudu - Run the Kudu CLI" + echo " help - print useful information and exit" + echo "" + echo "Other commands can be specified to run shell commands." + echo "" + echo "Environment variables:" + echo "KUDU_MASTERS:" + echo " Defines the kudu-master and kudu-tserver configured master addresses." + echo " Defaults to localhost." + echo "DATA_DIR:" + echo " Defines the root directory to use. Subdirectories are added depending on whether a " + echo " Kudu master or a Kudu tablet server is being deployed. Ignored if the FS_WAL_DIR " + echo " environment variable is set." + echo " NOTE: this variable is deprecated. FS_WAL_DIR should be used instead." + echo " Defaults to /var/lib/kudu." + echo "FS_WAL_DIR:" + echo " Defines the WAL directory to use. Takes precedence over the DATA_DIR environment " + echo " variable." + echo "FS_DATA_DIRS:" + echo " Defines the data directories to use. If set, the FS_WAL_DIR environment variable " + echo " must also be set." + echo " Defaults to the value of the FS_WAL_DIR environment variable." + echo "MASTER_ARGS:" + echo " Defines custom arguments passed to kudu-master." + echo " Defaults to an empty set." + echo " kudu-master is run with the set of arguments built from" + echo " DEFAULT_ARGS appended by MASTER_ARGS, so Kudu flags in DEFAULT_ARGS" + echo " can be overridden by corresponding flags in MASTER_ARGS." + echo "TSERVER_ARGS:" + echo " Defines custom arguments passed to kudu-tserver." + echo " Defaults to an empty set." + echo " kudu-tserver is run with the set of arguments built from" + echo " DEFAULT_ARGS appended by TSERVER_ARGS, so Kudu flags in DEFAULT_ARGS" + echo " can be overridden by corresponding flags in TSERVER_ARGS." + echo "DEFAULT_ARGS:" + echo " Defines a recommended base set of arguments." +} + +if [[ -z "$FS_WAL_DIR" && -n "$FS_DATA_DIRS" ]]; then + echo "If FS_DATA_DIRS is set, FS_WAL_DIR must also be set" + echo "FS_WAL_DIR: $FS_WAL_DIR" + echo "FS_DATA_DIRS: $FS_DATA_DIRS" + exit 1 +fi + +DATA_DIR=${DATA_DIR:="/var/lib/kudu"} +if [[ -n "$FS_WAL_DIR" ]]; then + # Use the WAL directory for data if a data directory is not specified. + WAL_DIR="$FS_WAL_DIR" + DATA_DIRS=${FS_DATA_DIRS:="$FS_WAL_DIR"} +else + # If no WAL directory is specified, use a subdirectory in the root directory. + WAL_DIR="$DATA_DIR/$1" + DATA_DIRS="$DATA_DIR/$1" +fi + +# Define the defaults environment variables. +KUDU_MASTERS=${KUDU_MASTERS:=""} + # TODO: Remove use_hybrid_clock=false when ntpd is setup. +DEFAULT_ARGS="--fs_wal_dir=$WAL_DIR \ + --fs_data_dirs=$DATA_DIRS \ + --webserver_doc_root=/opt/kudu/www \ + --stderrthreshold=0 \ + --use_hybrid_clock=false" +MASTER_ARGS=${MASTER_ARGS:=""} +TSERVER_ARGS=${TSERVER_ARGS:=""} + +# Wait until the master hosts can be resolved. +# +# Without this Kudu will fail with "Name or service not known" errors +# on startup. +# +# Gives a maximum of 5 attempts/seconds to each host. On failure +# falls through without failing to still give Kudu a chance to startup +# or fail on it's own. +function wait_for_master_hosts() { + IFS="," + for HOST in $KUDU_MASTERS + do + MAX_ATTEMPTS=5 + ATTEMPTS=0 + until `ping -c1 "$HOST" &>/dev/null;` || [[ "$ATTEMPTS" -eq "$MAX_ATTEMPTS" ]]; do + ATTEMPTS=$((ATTEMPTS + 1)) + sleep 2; + done + done + unset IFS +} + +function make_directories() { + IFS="," + mkdir -p $WAL_DIR + for DIR in $DATA_DIRS + do + mkdir -p $DIR + done + unset IFS +} + +# If no arguments are passed, print the help. +if [[ -z "$1" ]]; then + print_help + exit 1 +fi + +# Note: we use "master" and "tserver" here so the kudu-master and kudu-tserver +# binaries can be manually invoked if needed. +if [[ "$1" == "master" ]]; then + make_directories + wait_for_master_hosts + # Supply --master_addresses even if a single master address is specified. + if [[ -n "$KUDU_MASTERS" ]]; then + MASTER_ARGS="--master_addresses=$KUDU_MASTERS $MASTER_ARGS" + fi + exec kudu master run ${DEFAULT_ARGS} ${MASTER_ARGS} +elif [[ "$1" == "tserver" ]]; then + make_directories + wait_for_master_hosts + if [[ -n "$KUDU_MASTERS" ]]; then + TSERVER_ARGS="--tserver_master_addrs=$KUDU_MASTERS $TSERVER_ARGS" + else + TSERVER_ARGS="--tserver_master_addrs=localhost $TSERVER_ARGS" + fi + exec kudu tserver run ${DEFAULT_ARGS} ${TSERVER_ARGS} +elif [[ "$1" == "help" ]]; then + print_help + exit 0 +fi + +# Support calling anything else in the container. +exec "$@" \ No newline at end of file diff --git a/kudu/README.md b/kudu/README.md new file mode 100644 index 00000000..98b17af8 --- /dev/null +++ b/kudu/README.md @@ -0,0 +1,59 @@ +# Quick reference + +- The official apache kudu docker image. + +- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative). + +- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community). +# Kudu | openEuler +Current kudu docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. + +Apache Kudu is an open source distributed data storage engine that makes fast analytics on fast and changing data easy. + +Learn more on [Kudu website](https://kudu.apache.org/). + + +# Supported tags and respective Dockerfile links +The tag of each kudu docker image consists of the version of kudu and the version of base image. The details are as follows +| Tags | Currently | Architectures| +|------|-----------|---------------| +|[1.17.1-oe2403lts](https://gitee.com/openeuler/openeuler-docker-images/blob/master/kudu/1.17.1/24.03-lts/Dockerfile)| Apache kudu 1.17.1 on openEuler 24.03-LTS | amd64, arm64 | + + +# Usage +Here, users can select the `{Tag}` by requirements. + +- Pull the `openeuler/kudu` image + ```bash + docker pull openeuler/kudu:{Tag} + ``` +- Run kudu container + + You can use the following command to find out how to run it: + ```bash + docker run --name my-kudu openeuler/kudu:{Tag} help + ``` + You will see something like this + ``` + Supported commands: + master - Start a Kudu Master + tserver - Start a Kudu TServer + kudu - Run the Kudu CLI + help - print useful information and exit + + Other commands can be specified to run shell commands. + ... + ``` + Above shows the supported commands, you can use this container following [kudu documentation](https://kudu.apache.org/docs/quickstart.html). + +- View container running logs + ```bash + docker logs -f my-kudu + ``` +- To get an interactive shell + ```bash + docker exec -it my-kudu /bin/bash + ``` + +# Question and answering +If you have any questions or want to use some special features, please submit an issue or a pull request on [openeuler-docker-images](https://gitee.com/openeuler/openeuler-docker-images). \ No newline at end of file diff --git a/kudu/doc/image-info.yml b/kudu/doc/image-info.yml new file mode 100644 index 00000000..b830f89d --- /dev/null +++ b/kudu/doc/image-info.yml @@ -0,0 +1,61 @@ +name: kudu +category: storage +description: Apache kudu是一个分布式数据存储引擎,它可以轻松对快速变化的数据进行快速分析。 +environment: | + 本应用在Docker环境中运行,安装Docker执行如下命令 + ``` + yum install -y docker + ``` +tags: | + kudu镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + + | Tag | Currently | Architectures | + |----------|-------------|------------------| + |[1.17.1-oe2403lts](https://gitee.com/openeuler/openeuler-docker-images/blob/master/kudu/1.17.1/24.03-lts/Dockerfile)| Apache kudu 1.17.1 on openEuler 24.03-LTS | amd64, arm64 | + +download: | + 拉取镜像到本地 + ``` + docker pull openeuler/kudu:{Tag} + ``` + +usage: | + - 运行容器 + + 首先,使用以下命令查看kudu容器支持的命令: + ``` + docker run --name my-kudu openeuler/kudu:{Tag} help + ``` + + 显示如下内容: + ``` + Supported commands: + master - Start a Kudu Master + tserver - Start a Kudu TServer + kudu - Run the Kudu CLI + help - print useful information and exit + + Other commands can be specified to run shell commands. + ... + ``` + 用户可根据[kudu documentation](https://kudu.apache.org/docs/quickstart.html)使用`openeuler/kudu`容器支持的coommands执行任务。 + + - 测试容器 + + 查看运行日志 + ``` + docker logs -f my-kudu + ``` + + 使用shell交互 + ``` + docker exec -it my-kudu /bin/bash + ``` + +license: Apache-2.0 license +similar_packages: + - N/A +dependency: + - openjdk + - zlib + - python3 diff --git a/kudu/doc/picture/logo.png b/kudu/doc/picture/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1afca89769c79c67e97e8ac1ef7be690fb653ca6 GIT binary patch literal 21572 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
={H;q|L%xI2AMcBm;Uw3Uq3*s>qxQ)%8qT~4 z<~hd63dj$Mu}WNVtWLyH>2^tKJ!KYy3iVfsDOOgF0e8?ZC^1`l;7=gi?F2gZTBcuRI=6?&8zGW%0gwZ zy;5_7b=r};Tg>ybflBSd3c<(QeEZ3E@?*zPd(1Q}|L0QA*X_HR(h|)Plk0OtZ4q)>ZLFZb8a#QsXe} z72Kj{XgPJ>|8}oQ38kyKi2=l3ygF1*mQUZdb!3jo-+4m2WaXXRM4<~bRqAM9^c=jZ zHJQ=s{v!!yee3m4%drfWLp)+s5RnizmZi|YRCGC);ktw=+W48D4?Aa z+YHsk!*sj}6PWq%i}kL4N+V|LH1YhaC!1ibwVg1-BOc1SR|sZrkEn7PbTP@lrd~{qH5$S(RYSET^DnuF&h1akmCfgjZXFV1#?!|ty7a} zj$ttcvUgga?(Vl-Kl{-Kj*F35@phr28cKIi6KYHupojofFRgHk{-~7XR)tsd%Hhf! zYrcrfqhu-;A%PBld={vLCG(b+ci@P@sZMwbY0gpI#W<}+|}t z*R!JXHjySMYo!V@LmbXb@jUO+TC$lH6Xjmw(dX?2>FCN|9EWKCCd^#3O8?9c4{!BP z)JNBpt)WC0!hG@_#n3vzeVSuG6S4CPc6Ra;Px^gdFYOl$YlhS(>70q~xw`yu6dV1H zvdsdA;D9hbf3j06%- z;zQfz?Fhs=<&!xO!XU?_Xi=h`-)S5^nJ!nyidcjED&T^qZjjAGPmgNEslV+VNo|x9ce~ND$@ZP~h$j z(-_VmA~(;AZPJLTsybNIT=NIS_gAHI=bpkw$IT7XM)J8grc^QbMpUx=&FTWD8*G{>Lh<$!p-13QPc_!H||ku|?Tc~Nn{ zfgFQYW_oqco0vIrYMbT9!ui%3C};j2S~wD~5IjB}K|WWF1&K#lQzQN!(AH0^OE$BM zZTY@)v4jYzz6rm;{5${c)X<}*WnR&+&YRaQaWA-Oer)Re^WZUwf|Y`O@h%;B=3G+(c6? z6;!L0I66frytRdpH}F;i9I~9G13&a z6n+LeJ+It9s)HI0-rkVX{{5onNYG0#6>&`0+rC>bCsK1##hMjrwdQC6s9OH19vA;M zrHk?h6&@a*Li6FBaPykTX`Ahe_3M^OI2c{`Cvwh@)}QQ&=A(o*_0B0%iHRsJE03OG zb%C#XcFR_~tpU5k)u_nG$iQmE5=5`>xwnUSRorPbiRSS-+^HH+8+@n0dun?9*t;5n zdbEjc7P57^`Pw-UrA2{mEuAPq;ymizUj^FN_wljd(#c{n=~<)+^Pg8Hido87(654^ znO_kSI!oLp_X%xK*`=!A*(V*{N?5leg*Dr;Z-n=U5wg1eF?Vr+ zYECqU%jrA?6V0&feZgGBe5WGSw-R~0j3mtcDU%XJuuRSygxB1#+y$5++!XJSDAfv9 z9+3o-(0g=#S6;qAZHEZ~W6Nc-a^n5*)oK2Dpl81AeK<+}dNfpzR|KVkZ1?}ek@Bh~ z8L{?Ch#suF3n#57 zAhJvN_b?GpRn1`UJhP%;#GBc-o5d*YZcYHbVkIY$Q?~Vl((lTw;Tg!`iI261-^s{Z z&3rN2oLpdy)_m6h(D=`kHE{@@!MbiPa57$20KfD)f~x@fZZi`*$Yyc%x; zeL$<3zb#`{CH9~h5bnye=Lx{g^~x(L@R2kS;<-+SN!eD@RGB#l0wk1%Y8?l657%hx zE__RVpwS-D_p|Ssrla<*rsIx1tCFmYvEB}=Nl5F?pyzMV7F<(gm)>WLd-FcZoU))V z#V*OXSUtQlDit%+mvMR=0`#-89&iqIB!($k%qrrL!$wJm6*kC;9PT{7G>zZr5Ic>B z5oPOiv?fc(%TSNv+?0(DvokCn^V-y#$aU$Y{i>7&8~L5|2!&a<^j(?9n7uEcTXJLa znTLgze+uZuoD7J)ImA|KPH14!vPJ>Dy3|umTB=Nco#&#Aw)!-vA_JnOdz8;7)~Feb zLjC>|y{EvOG0Z&H08zM>mRBI(5_cdcFd0`#@ElZd+!li5mbDj|Ya^yb>a44?s=3)r z5o%vVFg$a&{E!Iw+7TE33x$gBpbA`|8x_=nWlN=3OrKEV$Hl;1+TMLQLu3UM$fq;)A2cjK` zc^~ejgmN*~z>gg7h|h3WdpPlMv54f7<{Gd7O&Q8)^}pogT+pC+f)W$L;?kA~iI%6J}#P91x! zMPNz3n)jT2N{JY3v{{y?vp1yTvRaU_2G|F_k14%_l~P{@th4mFKb^ z%eVgm5-RgcEt${N6I?|ZZ=f0TKE}G6-Z1$eK2`B(npNTS=V${irC@@?YC?q@dzI}h zTAWcF@K|uZU2$WLv>Y~5zXfRTMO5L&N@BmwRiMOOHCg||HEY7hW3}E!0WF%2!z}|7 zhuhn+HvWZWLVJVl-FT8FXILvGbp9r9Ro=V=@0M=Wwa>@qQ~1?0@rDK z*33@8LVZu*X49_OnkvSKNeRvc#Vt8+FD_{SQmL=$w#$Z|4m9%_UJ^iIWeA9jwl?c8 z($Kk}OfLST%M;xMYOJb?7N&06vSFTT*7nzs$dx{l(aR8z>$!yDfS6Xfz>tWmlr_qr zBx^l0J|o3~$u;}NT#rIS?mfY~Q0Q zC=Og}%tgPMqrMxe$K-cqKM)abY6D$a#252G32axS4HP`&Yw20k?8d=SWM6NYI|@tm z1Bb3uZz`V2&YlL8NjZ^&Yk2?`dc@yxCbUz(L)?_>*k}$%b@z#SnU<08uXA~m-^s04 zAXlJ@gCto#FD)bSc126<&_X1%?J?RpqZakJs8H9`Xw#|*Gyi6=G}B_}_BsFqrUlh0 zzWC>aPc7WB>b&;K?)_PE^c#?UO)jXn-=b=SjT$$dh62{xQrx&j4FRQN0)! zm`mVo4H#XMyI{#yQt);U_g}$*4!3Od7s={`%ZTk@m*|^oVU7-UZQ9IBV=yf1)$gR+ zJ9>)GM^;i%XLewcDp@=mAg9wo6?m$kRCR}Q$I+s6f#mp=8*Wq2IV?pk*ht+n?vjTB z%5`%}my6VCCp%hT#Zz~h!PG}P#nT3LOfOI@_&j&k2S%_OZNh?s`cL8h9`kmbmguqm z)DUo6em$BWpJ9kqJWP|~bj*tgHIk!KwYq3)^y5nuZ1&!LI-~Om{dkQhDY~>8_BU;9sKqsLtDdG6VejeR&60XBDWXiDRn>xmax6%3FVg+5^45PMh zw3h^#y?Z+DqC<=+qcUIDlAq0&oom+k=q7}uz7oj>$s7YXpFZ}Wjykn{bF++ z4+d?JQF%Z?bw#(u0%DST|Lg~OQ?~p=c&NSrb?Q9Bb?T63j7te9_S;f8=-WD=y?2-P zd$)}d@XBy?$|ibxZM*ZExtVA7rTTFoTpV&Nw>C_D<8aO^5q-k$m?zV#3{w}d?1SeN z#tWO9_gpgOtHL=eMmzu5S( z9dB<<^3Y2&)r{xWUpCiaQw+8n3t-w^GGx7$rh1}rCCH;_??vcruLGyIpuK70WLSxZ zaOQYI9;_H8C-0}=Eyje+mEvSJ)LNMjHH|z4$P*hNCWRF#Xk_b>^$ulJDA$o4p)y4w zEV3h;3HlHWk83Q$op@n?mvN$T+res`D+Ojj1vH7m7}2>{P3ldbX@^Q)L`M9DgM6AT z1=fqf@aWbTRkTJBypr5i+lTd;W-&jhUQet(51kZXHkxYkn@+k@b_lUWD^v^j7C@)y&xj4B34w;Hv7v&}tED0ME_z zGdvPY0!F)yH*Xu52Sp&sKnh59l!RElycz(5!ALCLoO^>UQiM!-j!mv^Hq=}WD!C7d z(g~ne5Wc~UTU|&x|KM8D>+KYQQ8##wJ{s(#iK1=z-CpEvx;b%CsuR*6cH4S+c$^q| z$nrpdR#mvj-7_@gY5<8R#VHEpHn+Wu#9X0hNzIBvY_QW`k<)gV6jvT&UaT&HdU6#x zTvoLLt~D2ZvX}Q&o7Fq_S*t+3x!{uL?5FS35=a9mRXVYCqqh-7rwY^z_ z&oPRO#UxGfq#tsaiR&0vsaVrqK@_mfE$y4WgRuKGPTAB*Gu>5W1iI^IOxq*xq1&4T zH@WBp~o;eT8k#;(VPZ%}^A+{ZYZuozlnsE-&79$%Bu z>$5QF?}?<-=(`0_%Q_?RDvuRfKL=M$Y5EehR(xBoXCCa$6XGGZQ!M&8=J{$O0LGlR z1jviSLeFcr^`&iMUzaV}Hnv&|b_iA%F*@h0nEBCwoLR=TzD|vd3s(4}14cOQ;#CiU zP^gy>>3&?<`rFtNf+~Jh#AtKpZ@nL)qLh=~k)}KOF?3+gye-j%5{EeU%WG*L(83K< z8KR%{f3pA`WgPngJW{L7@Cvm#P+p_wlZTCdo5H2lLa{!I_!_2C^8)a{b|Bz|a*moF zjO5;=_%&N98#m{uF@stEY0?zF%j0QC5R7(BR=m?HF}CJ3;HapNyJl^cSD?c2Wf>$^ zH6L?jXO({Y$vy4Fy90Jx9oSqdEQww++e*eD$|f~hqrAxNE^%YeM!lxbABjqLfGkRo zCV$^U2bNKb`1ENc#?|k%@%>i}LHXS8;n9bT`bzr9tjO%P+Nap>%9UJI>52g*!Qz#L8Dq~-`>!?Ri|?PFu}}6#(Ja)# zR4Tc*F*GWY*SKtaoP7V5DZ^QKa}auP<8yG0!p%K#KabNXXxIGq>32dPh zC)d6^W$IBD7`q!ko#-Bs%?i^W&`*_1i#d^;ZRGe;6AR-xrK(;Zg5D*Lhyop7x*Ouz z&C`s-{uDBo;S*4PpZmv89#o#1@)ZFJE{}Q`qcuwU53W%?={GhT1;i&=Nas_90ijog zdb!ri3cruxDd{#W%rDs*2Hf#BC(lx!aSHd9arr11rnnhrLp-2pWa*9QQeH(wRUldC z@HA+~eLo9rK6CcK3;sM4UG3OP8L)xtFQx`g7M^K1KH~8!%&1cLE^O@`X9A)zxn!Ah zYe!h)_N^2B+l<5-HCMU3NQh1sy4peF^#zk8UQ*%nHtoLRS>z~~A<#My3X_CBpwCzl zwi26UlkER2OyI9iGI61*iZ;jJT%aS~Rli}Rh?4j$oMZlO7HCaQkhy$}F(Am*%T^{k zhy#Jg8&B`mTzpuD2%_2Z53C$&mV}?RH5wE;- zpJt9}L^#N7e3IcTYm5Y?%~A`$21i$l%Jbt+8&!yD#m4DZ9oBD_d=!Cf-g0p|8<$q6 z)#~-wb&tr&(rOo0!|J(t=TsSbeyW2+!UOISqsJn98@E<_XuxAiHg6)^mCN5;i0$HK z+|Z0y#d?eh!uO~B|6;#O7iT7$E7CyG?>}MO+(LkZ^2yk3^-QV<2+83lp&<{F-;_2?($YaZe5>C2qWlIJ@v8$ zF?dRP5x-&jDr5TQjw3r*6->xwlCE(F>eDj;TopUD^>WdT2ga5g3^T>NUjkZ6CqCAR zY#!lNS31xS;>sFQJjGDGx9djRcxJ$bE~mRu&GvCY6Sv|@S`=^inVDHSJJ=gB56?;) zoN4?5Z&=_Kwb2&*7WnoL$eg${$K&tSF5j)MMDu!D6+}O*U<>FFNx8jle*P@ig<)A# z=^|IX>{?i)x-l-vva?9C^Sw%{)noK8w$vbrTT!(2I(YnwfzikrNSU~v9K7@myi(uH zCX0?LhlbmNKG6!E!Pf4x(f`?9dUMl_#Rn92s*$kN!)@EG0w}6SHqk7OvNAk+V2(a4 zy>R{n^BvHFJhVv-CL#@}{gR7XuSir(Pp#nKeCE}1-S&-vJ2BIsR4t>nPn;XgBH2a+ zbWyFGt=W1klW|r!)}adhN4ip`HT68{KKNFQ{VXT*vtVRGI3TdxhzlMgg>fs6N7dBy zNhD-EL=}~S47q4?jaW?jz{KqWR^^q0J5kM5d7H~2c&Aq2#lAD*ENi+u?tn}eql8f( z1sBLcl600*W%+SM5-g@Y=z^3Rr)=zE>J%QA(Hb}S%hDN(!z)VrD_G?P{V&KtO=&?1 zJ-iFacy@aBj0%yfgb8oXx!wl+c~m#enpwlR8?!`05=b3DGZ+kGa^%+bpk4hflkE(; z(4lVr0qsGVxow`tKhQc8it^)-s$N(;eQ)~G!y|W(3Oq)o6$$b3sY3Jlw46+s ztD?05x5m$mRtL_H`YY$FRK(;{G;Rb&liOBNIMWz8kWnsuWaH)O*}BwF;k8qdl7+?H zvc~|<445uFq0wSU&it?e2;5vBjGzRvq7_RY+*l8^B;9Zk(%F)tx5`!nL#S9(P zgHqgszQ4t>Y>WbWqFE^%rGvq(}f}xB%qGdK#mtB zlHTB_aog2ls96?*#20%9eZsrC|xyvYjz5ugiO&XdAQx zdZ;_{;cd@zqO5DCVt+4GEkZ5^+zc9n^{7)S|HZP$U@34Km#MIdoOmSb02_|4h`o`d zJ3_o~y>zNx_UmBKu_ZCPoDykV(1!0{L^nz|Ph~9`knhHD5{441>2l5Nd|F=UcNOws zepb?vBEuK?@~Wmy^<=h5%b)k%REYhdxPB*QvFEDnO_+gN5!AGc$$2OBA*Q{)qg`WM zN2Cmn7~Tvf=)Qi>)2(z-tyr5Z+pTelm0S9Cm93Y$>~3<(TK#MQ;Mogu<%aiE5V=E{ zH8Xs%CEcDnS{Wly@9dv#(570+RdSEW5(JKG+@gvfw1uE#kkY~uCD42g#+sAQS6-9X zY>6d9zMnH*9Nh6y4YRq$WB)AL{|6rW;5;bbGe86$2)EH7KJp@oF+=A2*K?}n$Ncaj z2}b(3(Aq(mIWDf=-pZC2a=6Z`7N7jBjRjaSDg@+90M=1ImFj#A z^?smL$;#E}4YJ8Gn)Aw0jDNgCI@>cROdsgYxANm1v{zDGMA7c$dK)K!jkU4P8&+$a z199fb-)<2bm`7Yu@>uTiaM$j;f3d)H#vKGMZh}JdhLV;BL9yf+=FCrNK4?g0bp^NB z$`7J|VT6Lh)*q9630W&gV4;5zwU{|8Nw>@4nvC1q<3t%lB zmt=44LAwfs^i+{q@+||o$O2d8bl#&1ppXRB^XF~|#slHAN^G~Ev2!A@NY*hXBU2ADO3 zs(eJ>{d7TpD7e?a#Ida`jqJ5kz5MTwM9=K(A2mtV&h>`Il>|lH3)&nH zE^UW*A0<7uGc;S5D<()Q>pmw{Y_vIYw&ly)1QD*pPpxa4>-h4+g)o> z-B3=PtS02WkBygp=S=qrp@%X1Gb;#{P7(R9ErzoKOypGEfJiL52fFaUFvLw|p#v6W z`Gu{;ateb4Y-U~g0>Qu zV+C&xno_z0QPn!X{ zG9zcgy(uPxrM0WYFc&{QA~+>0dMz(CmYMQJ-sGdcRk!JQ!G_n*2 z-yz}Z?1}2#D5qvFdCsLie-d?0sy=VHaB^}&`ng3p5qu;m5it|t@kEf)Iz z`To%&O2?O)avg>S8mh@G{b5db&5oZt*>5rMV)0rWDTx+QPS^)NcxOC(1g-S3hf%{X z|BV^#CMj8m)eIl$&5PmCdP{O^HAp)!a!QaRoI`$l{80a0+K!WToNWa3$gfce(P?0; z3V;7Go>kzf01neXKj5SBP?XiUyrwU^C*Esx1Wy-i+OBCJzS_@zm6DgIMrW3>cMa3m z%B%Sx^qYjCfAfxEW=)X?@cH&$u6-O97)|#S>8&&?RsKG=tit9(yiN{>NeN$8S5&c-;4?3RXqg5QyPyi8_JZH@Ok*`1M9|2b)p=sQ}zq zh4pP-vcfC>(bgq&E>c?j65%3IUa~hlL_VMZSSG!jFIU228)e&n;|=IWeJZbSyDoGa z`A_m{l6eF}zI~mN@Wiik;TO;Pn8!FlGkEQ+8h$i9WRz)%SueN>HpY>kdNl zxXcIE7C8kbv2zK*?`DZnDYsSvv9leN9f*7XxlI}TPSk~;9x008JObb#^|H|WPrp?I zg7CI?94k>n36lXTMm6?0PKmR{w%QST50~;(gKMY80 zcI~-`<@UZrh#l0Oc3bsbXfG=Nsh4Q&YOpOXLTePPqs*#nr&%5C-t{82hPDRA>gWa8 z@(aOLlD`U1g%{k|uHLOA+Ecvj!9C>l4gZ!u84< z3Rdx})JMPlQi~wrZ0~RvEKKPy0Xr-jeDP;K>-|$*9sR$3f0-~Np6&3U5rC`JknRei zaf|I*Zpcj$uFyGH-cV;JC>51QR&nk)$)m^+69fY}H->E)<;c8kyv_o8Hzx0~7vSkxX{?2y4 zCvf?%YHga@Wy>acrI;={J_Bg@zFZe}Ve<1(@W&;52nb~>A+74TY!}C>(IIoJ!)1;j zhj-hhdmgSiX<-3>fxm0WffFweRA-}bNG|v1FY=A}qU-YT`>Gue9KGqi`j8iK;MHCi zeDY*AKb049m)R9L!oO3RR`S)4HSKt8oP*_~;Juvx&Pa_E=o5d4y_3tc?|*bNMO&h+ zP(@L%h=79==pXX7r0jOtw(%hhDhW~lLSwGyKp8W@Z9q|iVJLFs4TtwcSl|eBeq!mR8%}o*=Sb?57Z9d|~eb-(; zg{s@Fe`mYg1>)|dJ876YoiwM*=h6*^jC-kGWzLX@O?Ov*b;Os}<0TUw6a?KH!t=F` zP3;36{aq2#9*ieeST<*^^-*Z8=JV4cEhGuOLGJDc(9eJ8z{jNH_`qlCo!7so?A=2y z5t}9c>BaBIHiG{$eQ_5D>=b_>>7P~%ze5cKwElwQ;*+qBKk?cn1@IA$loKNF$xP-& zDF~_Kjf*sD8s?37BoqD%o#8Fa+iul!@y2eo!7h;_BKrO5xTbe+Xy&b-W`QG7%?;{q zcH{?@;IE$W@D;oH^+4dPSQ}?(Kn2iDG-_CB{-H$GRQ0W3^90ow3?Ct>?&^{LB0V4msEG6XO3W`(}3O1h!4cGW`SdkyM#5qFgf$u z3s$v?8-t+Qh4`jwghxOKJTyPEx+PU-ogOf>bJ}j~sKIwoLQ8)?Mk6gO$49Hbf5xug z8@_~uAbwt6AVZ-*dy-JG(P6KfSPT9UonD`$a(D6xZEP9LfR(4xQDa+>+gL^jyp1*C9%1#F#>*CEqVz>Fi|3Z== z9FMnHJp2pogo=wa27qRY(VFi<%>T_waYA&uHg-@!baao1qyna$XS8xI2-&0s!GFll znK?xKUbC2t@9#Vc>q+7|+3lRD3ED*w_23Hx6-F-H(toD0i$0Kj0T1_0g|6#+t!jB! z3lH1p**&5G(2!~y-wSZmTy!t~W^-Eq(UKj?=|alUGG6|9{wYs2Izvef!%l+>jedeC zwUXJiecx2pMg49D*oM~n0>!NKD6&3q#1?m;mZvRz8S?J0`tJt2)fBRY8sN2WD@IKuD9Aqa&pb5XLnh|^^s}w*z z;H#_CQI&=6t8?ruYn|E0fgk+-{6hXz+mr4kObw+Q&>oW)<`_B!hipFD3S2_<)G60J zV9=oH-BD$0**+`CA%x4t$tCD*>pa1UkqK1K2#J~bsSSy601MiuM55AoH3OP0U8|`P zr=g=(zbl7GVz2wayJ%)%rQ|tAA%KLh5EiR40(d62<1GBRnhng%tckG{SqtyZ= z3|qLq>7)}CNdqU$%~BKrND`x1>bq zhtC4?mEpAT>X$%5RrPldRYJIMh#~izYNTMaSei8@IOs3eb+B9%#$>8#&FW9frYGzp;;e|! zP_+V&FEXnO_>< z>bMsv88~M$w<=Xo6y@e>!ZT#^Pg0KC1sd6CbYA4=X|+p#rqm?=gR5}UR7dVlJNm)8 zgF=`r4ZSPjccb#e6m&i=`KL$LUGaz}0l@sQjYZ)d`Oh6N4#S0Xm@85{K6xM4{vd;6 ztnR`@&ZX$Yn;$*t#SR?`zsl3A3`s7P>@u$y!8lKXktM;H*hJ)iy3qfIuBm}>7P$tm z#Dtp~l!-Jhe-&qLE!{H)jFL_tQk65BsrB53&fmvwW(7T_tFP)PM`K+FzSu#MRI$|?N@Ok0uSklgz14kk|P2r=WwTn z5fJB8EH0ty`v3sd&-f*eu-j2zJoNm|zo*=Y2d%6KH8ry1HL%9`HH~u9xXb0FELVyb zAgHPwVDbqT<{XFHr)3+VMVtH`RwUV2Rkq{CyCWN^melnW`DIurDRDbODkro%Owp1r z;Msf8U>iswOzDdNElcN8P*7SWP;Eht>8vTKTz;GCfF6wEcRL zOQ2B{Im*G=&H?E&ovrP{4{Xwpc<=C9U=#0p#y}fO0uWC*Zp{x_6;H$dd~c?+soEWc z37(YHTM-ePK2FU|9AoX{GGLvZFv@e`-*LH7y2R;C^R2M-Y>R?b;v~G!-_5M+dkkI8 zgw|HP1Ks(TPPc0Ezj;6Bp@0>Pzj_mnTS-t)0$4}=igc)+^rqtnbt-IR<`g(bN`22a z_6~gkkutk(KyUJL;RO-`gHM$i-J5!zAIy+)h(8xv&FZ83#Pe6s11<0zfxS0Z7 zF?*And_t)i+jsSMjS<0VQC8a5N*f2rkF*3u6%2R8dhIT*0L}-itEO;n@;@ecBi1_M z+{@92sDz$tGW$8-EO4YZDD z+Y4PQko};R0sV_Ef9k&(9#(7`a=wCeQu=GV0rDNPD%mXD5AoYYuB4ILA*r0d>WkZg zWPPKn3tb|tYHC15nCYiFuw%%fHw@Jwr93Z!_*Doh)8sY&mJ}(HS&r{Km@FV znHhGTy)6R?x4~2QtfcXIaT3r!yul18rcUF4jA7ySklekiIQoTLnOfKd*$mH}gXdSv zUjMGM0_|RxL#>E^%X&$DWi(sL(pjLZdo98*k_EU}is)*U$|56cFS3nLj(>jxqr6d( zU^eK`kU(%z)BoPldF2;5Lk9mBp?+!1%}%*v*3aoDqL`mFCoAjaqfSbxbk=?zo^d`W8borpQR}wdnx-iL}d4C#@aA4 zmKZ|TtRriZlr0iJ5ym$5>_e6;S<1v%#wdg=qb%9qN4@Xo^Uj~obDwk1x#!$7_ndRj zSC>yfDgN;zW6PJEJEl;ZUD%!iH4s`_!cW5rUUWf`qZ9eor_*+Afu<~}^ze}OL<l)U08^~xU*aUw`=cOlXtpy}A=C{EUUF{r=j~I@cU}gxg|WR;;&}m^C)2_RuaVOGcGSR|*+3>{k7r zuvX(pT%-7m%L?=D{0k7Y*E+%LUzM=>A($m&iH!--f*j^;evRn`PL$r}8Sy*6!)EOs z9=5fE+Sndm=pXPI$b06TcP#xVNa;#K$wZ5PUdk|+vQnO^q@_sOwCT;n$klTJ0A1zq zGOF2z;Y@o}E_0|u%E`;1zW2zAar=Nn&0+NQ2f|dgQ~^T``*>I03ASJK1YaH@4_~PE zGz4zZz1Y-!Z|>OmCP{I%1XgXK5JLX%zT}~xGonkLS}WogD^hYB8)@ zZvs4i*Vk3;&I8!Y!ZZC(lB+UQB-dVFS8(zj4M(!b#>R8pQ4hINR?TbUJgAp;Jg>|m zNqDe}h4 z{s|qZk8h6niyg@tYL(_pb`Gv`<`nAlT%Q(l1IaE&dWhfIoJck0UK`)NQ*-zugv=N! zkeOH=ZA~Lx;i6FC;uLTrB}=rJ6giZFDWG?addzl~3ac(m*a?Xvvj|pFeJ`aM9f`Q! zsZJ`iS_28v9fo$MC5P2YO;sOygw&%Em5?^@A;>N9Nl`*-cf0%C)E+b(d5Rwg^`&<`e!$WAS#q>J z;ER0xp_g@VK7sdJWoW3IRf8+ZYBwlk&uZtlNPiWxD^2BoL2=Lb2t89ynI>5D!QfD!b3buZp;s!naHu(y{KUBvo`va;9^Hp7l=Jj6)Z^ zB#imDOjb5Bz0BpCxB=Phv#|Hlp7;L>g0OsnAt2fbrd24%8HdkbI^ zhjrp{cC$D9un9avQa#2XM4@5X!NGkHWYl}I5_6(G?-gUlxNm|Wnd(~b z>P|c7Li6h#pI=mz>IlQYgd52`Iom)u@!)(F%U2WB>g>gtnV%|*m9g)|o?#XSwrgC< z7}Dtm#P8HnZ=o_ZxEQ9muQ?@mvmey(PtcUzC=k=e7CKCNa#IH}(=qz7$&{rrab>Gqm{mC(GH9Ca`4di!vvj1^$F@-@>Op)b@4^I8Fb4$y$+>~CS}eDrKzfO=Bh!y86l1XekKw1bUN%k8W0uP3jS_a>XCn>-V@MLlCof&B$;dLKG!|8I|sX_{$fV~A!7LNl9dhWvflC5^0Gn|QUbw}D1Vx~kr@B*EPuU4IL%YS|8YQ<+WpDx!V?;oaT z^Z-5r6;*X%x{ikXzIC{km}Ep_rzPlsmVp+)$53@@x>rN)F|PP6B({w!S4#1C;+6qq z--P4%^&_b1^^Ar)6(iQ8Sg|Q^a1>jBHk1@8&$PQ#WrKQi6kG|cu_?tKXy~WiCI}PO zGhvh9ybjrfILrMVLQZB1jN|Svo3&5PR&Rj(Lm@EOn$kcRvWrF`D-{;1ROqwk-}g*~ z-VAXC3JPpX(kf_)OY2Svy9yLxV@4iZKstt;|5(w!Z4Yi+RqG-JIhO_mntroKAk7#VS~2 zGj!*;JWMCX`c#Pc@n%23vXLfLVd4_swP5vf#YFi{X_u}Mg3K+v=vtI=$Mdu0_E9qL zU(7(1FNlPq4>?YP71l_(avDB{OWFbkig_&Hvgk$o!kytsuM5^m5Am`chW%Fabv)C4 zGQ)_P0_3yrjzUHKi03IAPudszX3-lt%8!_*!!nQBQQCrb==rju$?3| z?RJGO9kPJ4ER}!njB9_CXMR;(v2d|>ZgE>AKaaxJ8Psd25?_%Z7vCb&pTJ5!0dUa9j2Y{b>E$S^2gT`M<|b`xKyY^k6M zsx-Gq4?%XdQOprDsx!e9PRg51m;D3mdh*X)+~h07QAfphxrwW%%ta>pXL>mzdlqTC zuf6kS{xV)aBHDVXds%uTkq(&yooIG%9<3BnN4y+^iF`ZH!hYr`791st^ZM1_IA~pzyw!K@$_|)kI`@2{lCESw zg!rTn$;Lmy1!6$G1PN~-EF%7>_iagPCgR+D)J?HM54BV zx5zEnjt}?7TOkKkXE5D^YaJ7v@w=M}&V~tQ=K(!I4f-0A^?1*He(jzuqSGnr6Kp&o zK$B`Rcvy8w+d3Lc2hnA+43lADdC&FP+ETD^$%MFasbg`g@F51|j{z+|kqn4c;R_<& zQg{@`6ToswfRmFVGI>JRcE+l950)Gkt$5#S;Dw{&Ymw{*wlQ*13APf$-0?UWHBg04 zGe8;f^d1mjahO|jestxY@16PHcNXryxb$FMfXhG;3MJ^*D$zNBUJn<#ETop0sj%0k zzA=4l*|Hp9KX)c+CnRI1q{OxxEG7Ek>TbA7)W_Yjk0dZjXU|Jw0NN+^0Vn0hyYJ1= z1K{}3BC3J5sv<-q_w~DUJQ6nB1>W6^iuQeJ2F?p-%8n4KDM-!@EN5Sbe|hwof4^{b zs!aMzM}tT%2TN6_tmGM5`})1ty7v5tr#~5PbN`XvS0`bI$bmY}E_pu*QM)V@OIuXl z)lMUauf3n^LWQCY`^^0B5zD>Jjc|K{wre$EUUYpBFdQ-Z)UI*04uhS7sA!j38jZ#3+_X9%EoVcNDJiO-@VM- z$^rtpM|S55?;a$K%Z0I?li%Dg^iNFY&)sNLi+8iVJspuG-8*m@YjV-LZ=n0@uH+`J zG3`Jtzv-6aqv8s95E7;FHZ{Ns5k`OQs|K=PRT0}Gf44Jm z2D;IhA>omDBxfpMPq4HRvLY8S$gk8EIgu zW-wqe`MQlh1}?ic^sAQJ{x*DM<78L2bKm^mF@AQ59 zENPrR%{4fQdjdi%uXfp|Lg8_^w|lR%^n&$AR8ibEigW_nx>O|Zf@b)h zPe?1<9rA6hWY+n(rk56kKy#tzNhGjow^gnvi2_Uv9%GdnQm=J-@OE7Xaa7eQrmm>H zKK@j*iQ|+l@EDKOa89F*-q3BL1IV)r6D2rcczzpwYJK1_!TYZQmnNTh2Us?;*WM7} zbykrP=ywOa2B_)D_^?(eB6ih=S?ONaQ{o6z3<{XSznF+G8b23fYAn$RQ~hnr2D*%$ zxh4RFgBEbWQ4O-{I{G=m$z}V;b4HQZ%+~{Y*A4K1ae_dS@26(9fR{cEEn%Z&MLZhF zw3vE&Cx@hvKR$EGCBM}z{i*tqtWDTv3J1%>w~|I>5_a;4dLZ#G^oLn+Dq$rt86HW@ z7;IxvW?8W5f8d;q%T1M?&Q z&OZierg4RwdS}LBp*A>BHA?y8VL|SXumEn53M1d2-O}LnkGJ7pTKy^TW&cz5ZvUkK zkM$=&hmWRcLjIQws}fzq&RaJ2Q$IQ4fd|t6yZ|)ctVYCo%FLNR-)t%71A!~cZzJ>5 zC8n*rFeyq%Ae{fBTJTt`n;muoq*W8R{Xw|q4>J$1jaJYML1dW$I|l?%)IH$4!tt(r z`n%tEG(D4p1+W1lZU7v;z~<7lgS~98-5-jzZMFJC{fO&*qz!?WkONfKbMFB1jo20g zS8;)9kGL9NO$uT835|pk;&6_Z>&F%qTa$dYQ@%NAwk=7=fdI{1fSM_hS>P{oJa{!~ z4uDiqbZXMTlCkad!c+e!o3WS{tcWmWrP*L{s5BxHR^v~ z->WXCyGeTjdBtvQ8vG8Fjol`26Z{Fer$bc#Z-~&nw6$9VZPC}y>!J^YsWbqB(*`gF z>D(XfLvt_