diff --git a/0018-implement-cmd-hooks.patch b/0018-implement-cmd-hooks.patch new file mode 100644 index 0000000..f9bb7b3 --- /dev/null +++ b/0018-implement-cmd-hooks.patch @@ -0,0 +1,846 @@ +From 27a99ca97da9540200068d75152896492ecd0064 Mon Sep 17 00:00:00 2001 +From: jikui +Date: Tue, 14 Dec 2021 16:33:02 +0800 +Subject: [PATCH 18/24] implement cmd hooks + +--- + cmd/checker.go | 52 ++++++++++ + cmd/cleanup.go | 10 +- + cmd/configs.go | 125 ++++++++++++++++++++++++- + cmd/configs_test.go | 2 +- + cmd/delete.go | 12 ++- + cmd/deploy.go | 9 +- + cmd/join.go | 14 ++- + cmd/opts.go | 12 +++ + docs/hooks_of_eggo.md | 3 +- + pkg/api/types.go | 18 ++-- + pkg/clusterdeployment/binary/binary.go | 25 +++++ + pkg/constants/constants.go | 5 + + pkg/utils/dependency/cmdhooks.go | 115 +++++++++++++++++++++++ + pkg/utils/dependency/cmdhooks_test.go | 43 +++++++++ + pkg/utils/runner/runner.go | 4 +- + pkg/utils/utils.go | 15 +++ + 16 files changed, 444 insertions(+), 20 deletions(-) + create mode 100644 pkg/utils/dependency/cmdhooks.go + create mode 100644 pkg/utils/dependency/cmdhooks_test.go + +diff --git a/cmd/checker.go b/cmd/checker.go +index 9d1fda6..07068e9 100644 +--- a/cmd/checker.go ++++ b/cmd/checker.go +@@ -19,11 +19,15 @@ import ( + "fmt" + "net" + "net/url" ++ "os" ++ "path" + "path/filepath" + "strconv" ++ "strings" + "time" + + "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/endpoint" + chain "isula.org/eggo/pkg/utils/responsibilitychain" +@@ -383,6 +387,54 @@ func checkPackageConfig(pc *PackageConfig) error { + return nil + } + ++func checkCmdHooksParameter(pa ...string) error { ++ for _, v := range pa { ++ if v == "" { ++ continue ++ } ++ res := strings.Split(v, ",") ++ if len(res) < 1 || len(res) > 2 { ++ return fmt.Errorf("invalid hook parameter with:%s\n", v) ++ } ++ } ++ ++ return nil ++} ++ ++func checkHookFile(fileName string) error { ++ file, err := os.Stat(fileName) ++ if err != nil { ++ return err ++ ++ } ++ ++ if !path.IsAbs(fileName) { ++ return fmt.Errorf("%s is not Abs path", fileName) ++ } ++ if !file.Mode().IsRegular() { ++ return fmt.Errorf("%s is not regular file", file.Name()) ++ } ++ if file.Mode().Perm() != os.FileMode(constants.HookFileMode) { ++ return fmt.Errorf("file mode of %s is incorrect", file.Name()) ++ } ++ if file.Size() > constants.MaxHookFileSize || file.Size() == 0 { ++ return fmt.Errorf("%s is too large or small", file.Name()) ++ } ++ if !(strings.HasSuffix(fileName, ".sh") || strings.HasSuffix(fileName, ".bash")) { ++ return fmt.Errorf("%s is not shell file", file.Name()) ++ } ++ ++ user, group, err := utils.GetUserIDAndGroupID(fileName) ++ if err != nil { ++ return fmt.Errorf("get user ID and group ID with file %s failed", file.Name()) ++ } ++ if user != os.Getuid() && group != os.Getgid() { ++ return fmt.Errorf("user id and group id of %s mismatch with process", file.Name()) ++ } ++ ++ return nil ++} ++ + func (ccr *InstallConfigResponsibility) Execute() error { + if ccr.conf.PackageSrc != nil { + if ccr.conf.PackageSrc.DstPath != "" { +diff --git a/cmd/cleanup.go b/cmd/cleanup.go +index 37bb87f..7a78b15 100644 +--- a/cmd/cleanup.go ++++ b/cmd/cleanup.go +@@ -54,17 +54,25 @@ func cleanupCluster(cmd *cobra.Command, args []string) error { + return fmt.Errorf("load deploy config file %v failed: %v", confPath, err) + } + ++ if err = checkCmdHooksParameter(opts.clusterPrehook, opts.clusterPosthook); err != nil { ++ return err ++ } + if err = RunChecker(conf); err != nil { + return err + } + ++ hooksConf, err := getClusterHookConf(api.HookOpCleanup) ++ if err != nil { ++ return fmt.Errorf("get cmd hooks config failed:%v", err) ++ } ++ + holder, err := NewProcessPlaceHolder(eggoPlaceHolderPath(conf.ClusterID)) + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) + } + defer holder.Remove() + +- if err = cleanup(toClusterdeploymentConfig(conf)); err != nil { ++ if err = cleanup(toClusterdeploymentConfig(conf, hooksConf)); err != nil { + return err + } + +diff --git a/cmd/configs.go b/cmd/configs.go +index 326e889..4d7a4b9 100644 +--- a/cmd/configs.go ++++ b/cmd/configs.go +@@ -20,6 +20,7 @@ import ( + "io/ioutil" + "net" + "os" ++ "path" + "path/filepath" + "strconv" + "strings" +@@ -559,7 +560,7 @@ func fillExtrArgs(ccfg *api.ClusterConfig, eargs []*ConfigExtraArgs) { + } + } + +-func toClusterdeploymentConfig(conf *DeployConfig) *api.ClusterConfig { ++func toClusterdeploymentConfig(conf *DeployConfig, hooks []*api.ClusterHookConf) *api.ClusterConfig { + ccfg := getDefaultClusterdeploymentConfig() + + setIfStrConfigNotEmpty(&ccfg.Name, conf.ClusterID) +@@ -601,10 +602,132 @@ func toClusterdeploymentConfig(conf *DeployConfig) *api.ClusterConfig { + ccfg.WorkerConfig.KubeletConf.EnableServer = conf.EnableKubeletServing + + fillExtrArgs(ccfg, conf.ConfigExtraArgs) ++ ccfg.HooksConf = hooks + + return ccfg + } + ++func getClusterHookConf(op api.HookOperator) ([]*api.ClusterHookConf, error) { ++ var hooks []*api.ClusterHookConf ++ ++ if opts.clusterPrehook != "" { ++ hook, err := getCmdHooks(opts.clusterPrehook, api.ClusterPrehookType, op) ++ if err != nil { ++ return nil, err ++ } ++ hooks = append(hooks, hook) ++ } ++ ++ if opts.clusterPosthook != "" { ++ hook, err := getCmdHooks(opts.clusterPosthook, api.ClusterPosthookType, op) ++ if err != nil { ++ return nil, err ++ } ++ hooks = append(hooks, hook) ++ } ++ ++ if opts.prehook != "" { ++ hook, err := getCmdHooks(opts.prehook, api.PreHookType, op) ++ if err != nil { ++ return nil, err ++ } ++ hooks = append(hooks, hook) ++ } ++ ++ if opts.posthook != "" { ++ hook, err := getCmdHooks(opts.posthook, api.PostHookType, op) ++ if err != nil { ++ return nil, err ++ } ++ hooks = append(hooks, hook) ++ } ++ return hooks, nil ++} ++ ++func getCmdHooks(hopts string, ty api.HookType, op api.HookOperator) (*api.ClusterHookConf, error) { ++ path, target, err := getHookPathAndTarget(hopts) ++ if err != nil { ++ return nil, err ++ } ++ hook, err := getResolvedHook(path, ty, op, target) ++ if err != nil { ++ return nil, err ++ } ++ return hook, nil ++} ++ ++func getHookPathAndTarget(hook string) (string, uint16, error) { ++ pathAndTarget := strings.Split(hook, ",") ++ if len(pathAndTarget) == 1 { ++ pathAndTarget = append(pathAndTarget, "master") ++ } ++ target, ok := toTypeInt[pathAndTarget[1]] ++ if !ok { ++ return "", 0x0, fmt.Errorf("invalid role:%s", pathAndTarget[1]) ++ } ++ ++ return pathAndTarget[0], target, nil ++} ++ ++func getResolvedHook(path string, ty api.HookType, op api.HookOperator, target uint16) (*api.ClusterHookConf, error) { ++ ++ dir, shells, err := getDirAndShells(path) ++ if err != nil { ++ return nil, err ++ } ++ ++ return &api.ClusterHookConf{ ++ Type: ty, ++ Operator: op, ++ Target: target, ++ HookSrcDir: dir, ++ HookFiles: shells, ++ }, nil ++} ++ ++func getDirAndShells(path string) (string, []string, error) { ++ file, err := os.Stat(path) ++ if err != nil { ++ return "", nil, err ++ } ++ ++ if !file.IsDir() { ++ return resolveFile(path) ++ } ++ ++ return resolvePath(path) ++} ++ ++func resolveFile(p string) (string, []string, error) { ++ dir := path.Dir(p) ++ fileName := path.Base(p) ++ if err := checkHookFile(p); err != nil { ++ return "", nil, err ++ } ++ ++ return dir, []string{fileName}, nil ++} ++ ++func resolvePath(p string) (string, []string, error) { ++ var files []string ++ rd, err := ioutil.ReadDir(p) ++ if err != nil { ++ return "", nil, err ++ } ++ ++ for _, fi := range rd { ++ if err := checkHookFile(path.Join(p, fi.Name())); err == nil { ++ files = append(files, fi.Name()) ++ } else { ++ logrus.Debugf("check hook file failed:%v", err) ++ } ++ } ++ if len(files) == 0 { ++ return "", nil, fmt.Errorf("empty folder:%s", p) ++ } ++ return p, files, nil ++} ++ + func getHostconfigs(format string, ips []string) []*HostConfig { + var confs []*HostConfig + for i, ip := range ips { +diff --git a/cmd/configs_test.go b/cmd/configs_test.go +index 46cb163..04afc51 100644 +--- a/cmd/configs_test.go ++++ b/cmd/configs_test.go +@@ -44,7 +44,7 @@ func TestCmdConfigs(t *testing.T) { + t.Fatalf("load deploy config file failed: %v", err) + } + +- ccfg := toClusterdeploymentConfig(conf) ++ ccfg := toClusterdeploymentConfig(conf, nil) + d, err := yaml.Marshal(ccfg) + if err != nil { + t.Fatalf("marshal cluster config failed: %v", err) +diff --git a/cmd/delete.go b/cmd/delete.go +index 9d911a9..5990a42 100644 +--- a/cmd/delete.go ++++ b/cmd/delete.go +@@ -63,7 +63,7 @@ func getDeletedAndDiffConfigs(conf *DeployConfig, delNames []string) (*DeployCon + return nil, nil, fmt.Errorf("forbidden to delete first master") + } + +- clusterConfig := toClusterdeploymentConfig(&diffConfig) ++ clusterConfig := toClusterdeploymentConfig(&diffConfig, nil) + if len(clusterConfig.Nodes) == 0 { + return nil, nil, fmt.Errorf("no valid ip or name found") + } +@@ -89,11 +89,19 @@ func deleteCluster(cmd *cobra.Command, args []string) error { + return fmt.Errorf("load saved deploy config failed: %v", err) + } + ++ if err := checkCmdHooksParameter(opts.prehook, opts.posthook); err != nil { ++ return err ++ } + // check saved deploy config + if err = RunChecker(conf); err != nil { + return err + } + ++ hooksConf, err := getClusterHookConf(api.HookOpDelete) ++ if err != nil { ++ return fmt.Errorf("get cmd hooks config failed:%v", err) ++ } ++ + holder, err := NewProcessPlaceHolder(eggoPlaceHolderPath(conf.ClusterID)) + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) +@@ -110,7 +118,7 @@ func deleteCluster(cmd *cobra.Command, args []string) error { + return err + } + +- if err = clusterdeployment.DeleteNodes(toClusterdeploymentConfig(conf), diffHostconfigs); err != nil { ++ if err = clusterdeployment.DeleteNodes(toClusterdeploymentConfig(conf, hooksConf), diffHostconfigs); err != nil { + return err + } + +diff --git a/cmd/deploy.go b/cmd/deploy.go +index e21bcc5..2d7c441 100644 +--- a/cmd/deploy.go ++++ b/cmd/deploy.go +@@ -71,7 +71,11 @@ func deploy(conf *DeployConfig) error { + return fmt.Errorf("save deploy config failed: %v", err) + } + +- ccfg := toClusterdeploymentConfig(conf) ++ hooksConf, err := getClusterHookConf(api.HookOpDeploy) ++ if err != nil { ++ return fmt.Errorf("get cmd hooks config failed:%v", err) ++ } ++ ccfg := toClusterdeploymentConfig(conf, hooksConf) + + cstatus, err := clusterdeployment.CreateCluster(ccfg, opts.deployEnableRollback) + if err != nil { +@@ -116,6 +120,9 @@ func deployCluster(cmd *cobra.Command, args []string) error { + return fmt.Errorf("load deploy config file failed: %v", err) + } + ++ if err = checkCmdHooksParameter(opts.clusterPrehook, opts.clusterPosthook); err != nil { ++ return err ++ } + if err = RunChecker(conf); err != nil { + return err + } +diff --git a/cmd/join.go b/cmd/join.go +index 79d68fc..d035bfe 100644 +--- a/cmd/join.go ++++ b/cmd/join.go +@@ -128,7 +128,7 @@ func getMergedAndDiffConfigs(conf *DeployConfig, joinConf *DeployConfig) (*Deplo + diffConfig.Workers = append(diffConfig.Workers, h) + } + +- return &mergedConfig, toClusterdeploymentConfig(&diffConfig).Nodes, nil ++ return &mergedConfig, toClusterdeploymentConfig(&diffConfig, nil).Nodes, nil + } + + func getFailedConfigs(diffConfigs []*api.HostConfig, cstatus api.ClusterStatus) []*api.HostConfig { +@@ -206,6 +206,9 @@ func joinCluster(cmd *cobra.Command, args []string) error { + } + var err error + ++ if err = checkCmdHooksParameter(opts.prehook, opts.posthook); err != nil { ++ return err ++ } + joinConf, err := parseJoinInput(opts.joinYaml, &opts.joinHost, opts.joinType, opts.joinClusterID) + if err != nil { + return err +@@ -237,11 +240,16 @@ func joinCluster(cmd *cobra.Command, args []string) error { + return err + } + +- cstatus, err := clusterdeployment.JoinNodes(toClusterdeploymentConfig(conf), diffConfigs) ++ hooksConf, err := getClusterHookConf(api.HookOpJoin) ++ if err != nil { ++ return fmt.Errorf("get cmd hooks config failed:%v", err) ++ } ++ ++ cstatus, err := clusterdeployment.JoinNodes(toClusterdeploymentConfig(conf, hooksConf), diffConfigs) + if err != nil { + failedConfigs := getFailedConfigs(diffConfigs, cstatus) + // rollback +- if err1 := clusterdeployment.DeleteNodes(toClusterdeploymentConfig(mergedConf), failedConfigs); err1 != nil { ++ if err1 := clusterdeployment.DeleteNodes(toClusterdeploymentConfig(mergedConf, nil), failedConfigs); err1 != nil { + logrus.Errorf("delete nodes failed when join failed: %v", err1) + } + +diff --git a/cmd/opts.go b/cmd/opts.go +index f5204f2..7bb8297 100644 +--- a/cmd/opts.go ++++ b/cmd/opts.go +@@ -43,6 +43,10 @@ type eggoOptions struct { + joinYaml string + joinHost HostConfig + delClusterID string ++ clusterPrehook string ++ clusterPosthook string ++ prehook string ++ posthook string + } + + var opts eggoOptions +@@ -66,12 +70,16 @@ func setupDeployCmdOpts(deployCmd *cobra.Command) { + flags := deployCmd.Flags() + flags.StringVarP(&opts.deployConfig, "file", "f", defaultDeployConfigPath(), "location of cluster deploy config file, default $HOME/.eggo/deploy.yaml") + flags.BoolVarP(&opts.deployEnableRollback, "rollback", "", true, "rollback failed node to cleanup") ++ flags.StringVarP(&opts.clusterPrehook, "cluster-prehook", "", "", "cluser prehooks when deploy cluser") ++ flags.StringVarP(&opts.clusterPosthook, "cluster-posthook", "", "", "cluster posthook when deploy cluster") + } + + func setupCleanupCmdOpts(cleanupCmd *cobra.Command) { + flags := cleanupCmd.Flags() + flags.StringVarP(&opts.cleanupConfig, "file", "f", "", "location of cluster deploy config file") + flags.StringVarP(&opts.cleanupClusterID, "id", "", "", "cluster id") ++ flags.StringVarP(&opts.clusterPrehook, "cluster-prehook", "", "", "cluser prehooks when clenaup cluser") ++ flags.StringVarP(&opts.clusterPosthook, "cluster-posthook", "", "", "cluster posthook when cleaup cluster") + } + + func setupJoinCmdOpts(joinCmd *cobra.Command) { +@@ -82,11 +90,15 @@ func setupJoinCmdOpts(joinCmd *cobra.Command) { + flags.IntVarP(&opts.joinHost.Port, "port", "p", 0, "host's ssh port") + flags.StringVarP(&opts.joinClusterID, "id", "", "", "cluster id") + flags.StringVarP(&opts.joinYaml, "file", "f", "", "yaml file contain nodes infomation") ++ flags.StringVarP(&opts.prehook, "prehook", "", "", "prehook when join cluster") ++ flags.StringVarP(&opts.posthook, "posthook", "", "", "posthook when join cluster") + } + + func setupDeleteCmdOpts(deleteCmd *cobra.Command) { + flags := deleteCmd.Flags() + flags.StringVarP(&opts.delClusterID, "id", "", "", "cluster id") ++ flags.StringVarP(&opts.prehook, "prehook", "", "", "prehook when delete cluster") ++ flags.StringVarP(&opts.posthook, "posthook", "", "", "posthook when delete cluster") + } + + func setupTemplateCmdOpts(templateCmd *cobra.Command) { +diff --git a/docs/hooks_of_eggo.md b/docs/hooks_of_eggo.md +index b1f09cb..fd9ce35 100644 +--- a/docs/hooks_of_eggo.md ++++ b/docs/hooks_of_eggo.md +@@ -21,8 +21,9 @@ + 说明: + + - 脚本目录下的所有脚本都会被执行,而子目录中的脚本不会被执行; +-- 每个脚本的超时时间为60s; ++- 每个脚本的超时时间为120s; + - role可以为master,worker,etcd或者loadbalance; ++- 命令行参数指定的hooks脚本默认拷贝到目标机器的/root/.eggo/package/file/cmdhooks目录下,脚本大小限制1M字节; + + ### 配置文件参数方式 + +diff --git a/pkg/api/types.go b/pkg/api/types.go +index e5e1958..5cb7121 100644 +--- a/pkg/api/types.go ++++ b/pkg/api/types.go +@@ -47,8 +47,10 @@ const ( + type HookType string + + const ( +- PreHookType HookType = "prehook" +- PostHookType HookType = "posthook" ++ ClusterPrehookType HookType = "cluster-prehook" ++ ClusterPosthookType HookType = "cluster-posthook" ++ PreHookType HookType = "prehook" ++ PostHookType HookType = "posthook" + ) + + type HookRunConfig struct { +@@ -233,11 +235,11 @@ type AddonConfig struct { + } + + type ClusterHookConf struct { +- Type HookType +- Operator HookOperator +- Target uint16 +- HookDir string +- HookFiles []string ++ Type HookType ++ Operator HookOperator ++ Target uint16 ++ HookSrcDir string ++ HookFiles []string + } + + type ClusterConfig struct { +@@ -258,7 +260,7 @@ type ClusterConfig struct { + RoleInfra map[uint16]*RoleInfra `json:"role-infra"` + + // do not encode hooks, just set before use it +- HooksConf *ClusterHookConf `json:"-"` ++ HooksConf []*ClusterHookConf `json:"-"` + + // TODO: add other configurations at here + } +diff --git a/pkg/clusterdeployment/binary/binary.go b/pkg/clusterdeployment/binary/binary.go +index 363de0e..478e081 100644 +--- a/pkg/clusterdeployment/binary/binary.go ++++ b/pkg/clusterdeployment/binary/binary.go +@@ -419,6 +419,10 @@ func (bcp *BinaryClusterDeployment) Finish() { + + func (bcp *BinaryClusterDeployment) PreCreateClusterHooks() error { + role := []uint16{api.LoadBalance, api.ETCD, api.Master, api.Worker} ++ if err := dependency.ExecuteCmdHooks(bcp.config, bcp.config.Nodes, api.HookOpDeploy, api.ClusterPrehookType); err != nil { ++ return err ++ } ++ + if err := dependency.HookSchedule(bcp.config, bcp.config.Nodes, role, api.SchedulePreJoin); err != nil { + return err + } +@@ -434,11 +438,17 @@ func (bcp *BinaryClusterDeployment) PostCreateClusterHooks(nodes []*api.HostConf + if err := checkK8sServices(nodes); err != nil { + return err + } ++ if err := dependency.ExecuteCmdHooks(bcp.config, bcp.config.Nodes, api.HookOpDeploy, api.ClusterPosthookType); err != nil { ++ return err ++ } + return nil + } + + func (bcp *BinaryClusterDeployment) PreDeleteClusterHooks() { + role := []uint16{api.Worker, api.Master, api.ETCD, api.LoadBalance} ++ if err := dependency.ExecuteCmdHooks(bcp.config, bcp.config.Nodes, api.HookOpCleanup, api.ClusterPrehookType); err != nil { ++ logrus.Warnf("Ignore: Delete cluster prehook failed:%v", err) ++ } + if err := dependency.HookSchedule(bcp.config, bcp.config.Nodes, role, api.SchedulePreCleanup); err != nil { + logrus.Warnf("Ignore: Delete cluster PreHook failed: %v", err) + } +@@ -449,10 +459,16 @@ func (bcp *BinaryClusterDeployment) PostDeleteClusterHooks() { + if err := dependency.HookSchedule(bcp.config, bcp.config.Nodes, role, api.SchedulePostCleanup); err != nil { + logrus.Warnf("Ignore: Delete cluster PostHook failed: %v", err) + } ++ if err := dependency.ExecuteCmdHooks(bcp.config, bcp.config.Nodes, api.HookOpCleanup, api.ClusterPosthookType); err != nil { ++ logrus.Warnf("Ignore: Delete cluster posthook failed:%v", err) ++ } + } + + func (bcp *BinaryClusterDeployment) PreNodeJoinHooks(node *api.HostConfig) error { + role := []uint16{api.Master, api.Worker, api.ETCD} ++ if err := dependency.ExecuteCmdHooks(bcp.config, []*api.HostConfig{node}, api.HookOpJoin, api.PreHookType); err != nil { ++ return err ++ } + if err := dependency.HookSchedule(bcp.config, []*api.HostConfig{node}, role, api.SchedulePreJoin); err != nil { + return err + } +@@ -525,6 +541,9 @@ func (bcp *BinaryClusterDeployment) PostNodeJoinHooks(node *api.HostConfig) erro + if err := dependency.HookSchedule(bcp.config, []*api.HostConfig{node}, role, api.SchedulePostJoin); err != nil { + return err + } ++ if err := dependency.ExecuteCmdHooks(bcp.config, []*api.HostConfig{node}, api.HookOpJoin, api.PostHookType); err != nil { ++ return err ++ } + + // taint and label for master node + roles := node.Type +@@ -552,6 +571,9 @@ func (bcp *BinaryClusterDeployment) PostNodeJoinHooks(node *api.HostConfig) erro + + func (bcp *BinaryClusterDeployment) PreNodeCleanupHooks(node *api.HostConfig) { + role := []uint16{api.Worker, api.Master, api.ETCD} ++ if err := dependency.ExecuteCmdHooks(bcp.config, []*api.HostConfig{node}, api.HookOpDelete, api.PreHookType); err != nil { ++ logrus.Warnf("Ignore: Delete Node Cmd Prehook failed: %v", err) ++ } + if err := dependency.HookSchedule(bcp.config, []*api.HostConfig{node}, role, api.SchedulePreCleanup); err != nil { + logrus.Warnf("Ignore: Delete Node PreHook failed: %v", err) + } +@@ -562,6 +584,9 @@ func (bcp *BinaryClusterDeployment) PostNodeCleanupHooks(node *api.HostConfig) { + if err := dependency.HookSchedule(bcp.config, []*api.HostConfig{node}, role, api.SchedulePostCleanup); err != nil { + logrus.Warnf("Ignore: Delete Node PostHook failed: %v", err) + } ++ if err := dependency.ExecuteCmdHooks(bcp.config, []*api.HostConfig{node}, api.HookOpDelete, api.PostHookType); err != nil { ++ logrus.Warnf("Ignore: Delete Node Cmd Posthook failed: %v", err) ++ } + } + + func (bcp *BinaryClusterDeployment) CleanupLastStep(nodeName string) error { +diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go +index ee02e24..c60d061 100644 +--- a/pkg/constants/constants.go ++++ b/pkg/constants/constants.go +@@ -17,6 +17,7 @@ const ( + DefaultPkgPath = "/pkg" + DefaultBinPath = "/bin" + DefaultFilePath = "/file" ++ DefaultHookPath = "/file/cmdhook" + DefaultDirPath = "/dir" + DefaultImagePath = "/image" + +@@ -27,4 +28,8 @@ const ( + + // network plugin arguments key + NetworkPluginArgKeyYamlPath = "NetworkYamlPath" ++ ++ MaxHookFileSize = int64(1 << 20) ++ // 750: rwxr-x--- ++ HookFileMode = uint32(0750) + ) +diff --git a/pkg/utils/dependency/cmdhooks.go b/pkg/utils/dependency/cmdhooks.go +new file mode 100644 +index 0000000..e6fd9af +--- /dev/null ++++ b/pkg/utils/dependency/cmdhooks.go +@@ -0,0 +1,115 @@ ++/****************************************************************************** ++ * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. ++ * eggo licensed under the Mulan PSL v2. ++ * You can use this software according to the terms and conditions of the Mulan PSL v2. ++ * You may obtain a copy of Mulan PSL v2 at: ++ * http://license.coscl.org.cn/MulanPSL2 ++ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++ * PURPOSE. ++ * See the Mulan PSL v2 for more details. ++ * Author: jikui ++ * Create: 2021-12-11 ++ * Description: eggo cmd hooks implement ++ ******************************************************************************/ ++ ++package dependency ++ ++import ( ++ "fmt" ++ "path" ++ ++ "github.com/sirupsen/logrus" ++ "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" ++ "isula.org/eggo/pkg/utils" ++ "isula.org/eggo/pkg/utils/nodemanager" ++ "isula.org/eggo/pkg/utils/runner" ++ "isula.org/eggo/pkg/utils/task" ++) ++ ++type CopyHooksTask struct { ++ hooks *api.ClusterHookConf ++} ++ ++func (ch *CopyHooksTask) Name() string { ++ return "CopyHooksTask" ++} ++ ++func (ch *CopyHooksTask) Run(r runner.Runner, hcg *api.HostConfig) error { ++ dstDir := path.Join(constants.DefaultPackagePath, constants.DefaultHookPath) ++ ++ if _, err := r.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"test -d %s || mkdir -p %s\"", dstDir, dstDir)); err != nil { ++ return err ++ } ++ ++ if err := r.Copy(ch.hooks.HookSrcDir, dstDir); err != nil { ++ return fmt.Errorf("copy from %s to %s for %s failed:%v", ch.hooks.HookSrcDir, dstDir, hcg.Address, err) ++ } ++ ++ return nil ++} ++ ++func ExecuteCmdHooks(ccfg *api.ClusterConfig, nodes []*api.HostConfig, op api.HookOperator, ty api.HookType) error { ++ for _, hooks := range ccfg.HooksConf { ++ for _, node := range nodes { ++ if !utils.IsType(node.Type, hooks.Target) { ++ continue ++ } ++ ++ shell := getCmdShell(hooks, hooks.Target, op, ty) ++ if shell == nil { ++ return nil ++ } ++ if err := doCopyHooks(hooks, node); err != nil { ++ return err ++ } ++ if err := executeCmdHooks(ccfg, hooks, node, shell); err != nil { ++ return err ++ } ++ } ++ } ++ return nil ++} ++ ++func executeCmdHooks(ccfg *api.ClusterConfig, hooks *api.ClusterHookConf, hcf *api.HostConfig, shell []*api.PackageConfig) error { ++ hookConf := &api.HookRunConfig{ ++ ClusterID: ccfg.Name, ++ ClusterApiEndpoint: ccfg.APIEndpoint.GetUrl(), ++ ClusterConfigDir: ccfg.ConfigDir, ++ HookType: hooks.Type, ++ Operator: hooks.Operator, ++ Node: hcf, ++ HookDir: path.Join(ccfg.PackageSrc.GetPkgDstPath(), constants.DefaultHookPath), ++ Hooks: shell, ++ } ++ ++ return ExecuteHooks(hookConf) ++} ++ ++func getCmdShell(hooks *api.ClusterHookConf, target uint16, op api.HookOperator, ty api.HookType) []*api.PackageConfig { ++ res := make([]*api.PackageConfig, len(hooks.HookFiles)) ++ ++ if hooks.Target != target || hooks.Operator != op || hooks.Type != ty { ++ return nil ++ } ++ for i, v := range hooks.HookFiles { ++ res[i] = &api.PackageConfig{ ++ Name: v, ++ TimeOut: "120s", ++ } ++ } ++ return res ++} ++ ++func doCopyHooks(hcc *api.ClusterHookConf, node *api.HostConfig) error { ++ copyHooksTask := task.NewTaskInstance(&CopyHooksTask{ ++ hooks: hcc, ++ }) ++ ++ if err := nodemanager.RunTaskOnNodes(copyHooksTask, []string{node.Address}); err != nil { ++ logrus.Errorf("Copy hooks failed with:%v", err) ++ return err ++ } ++ return nil ++} +diff --git a/pkg/utils/dependency/cmdhooks_test.go b/pkg/utils/dependency/cmdhooks_test.go +new file mode 100644 +index 0000000..106518a +--- /dev/null ++++ b/pkg/utils/dependency/cmdhooks_test.go +@@ -0,0 +1,43 @@ ++package dependency ++ ++import ( ++ "testing" ++ ++ "isula.org/eggo/pkg/api" ++) ++ ++func TestCopyHooks(t *testing.T) { ++ var mr MockRunner ++ ++ hs := &api.ClusterHookConf{ ++ Type: api.PreHookType, ++ Operator: api.HookOpDeploy, ++ Target: api.Master, ++ HookSrcDir: "/tmp", ++ HookFiles: []string{"test.sh", "test2.bash"}, ++ } ++ ++ node := &api.HostConfig{} ++ ++ ct := &CopyHooksTask{hooks: hs} ++ if err := ct.Run(&mr, node); err != nil { ++ t.Fatalf("run test failed: %v", err) ++ } ++} ++ ++func TestExecuteCmdHooks(t *testing.T) { ++ hooks := &api.ClusterHookConf{ ++ Target: api.Master, ++ Operator: api.HookOpDeploy, ++ Type: api.PreHookType, ++ } ++ host := &api.HostConfig{ ++ Type: api.Master, ++ } ++ ccfg := &api.ClusterConfig{ ++ HooksConf: []*api.ClusterHookConf{hooks}, ++ } ++ if err := ExecuteCmdHooks(ccfg, []*api.HostConfig{host}, api.HookOpJoin, api.PostHookType); err != nil { ++ t.Fatalf("run test failed: %v", err) ++ } ++} +diff --git a/pkg/utils/runner/runner.go b/pkg/utils/runner/runner.go +index 9a739ca..09c9e1d 100644 +--- a/pkg/utils/runner/runner.go ++++ b/pkg/utils/runner/runner.go +@@ -227,7 +227,7 @@ func (ssh *SSHRunner) copyDir(srcDir, dstDir string) error { + return err + } + tmpCpyDir := api.GetUserTempDir(ssh.Host.User) +- tmpPkiFile := filepath.Join(tmpCpyDir, "pkg.tar") ++ tmpPkiFile := filepath.Join(tmpCpyDir, "remote-pkg.tar") + // scp to user home directory + err = ssh.Copy(tmpPkgFile, tmpPkiFile) + if err != nil { +@@ -235,7 +235,7 @@ func (ssh *SSHRunner) copyDir(srcDir, dstDir string) error { + return err + } + // untar tmp file +- _, err = ssh.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && mv %s . && tar -xf %s && rm -rf %s\"", dstDir, tmpPkiFile, "pki.tar", tmpPkiFile)) ++ _, err = ssh.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && mv %s . && tar -xf %s && rm -rf %s\"", dstDir, tmpPkiFile, "remote-pkg.tar", "remote-pkg.tar")) + if err != nil { + logrus.Errorf("[%s] untar tmp tar failed: %v", ssh.Host.Name, err) + return err +diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go +index 8272439..059516c 100644 +--- a/pkg/utils/utils.go ++++ b/pkg/utils/utils.go +@@ -16,10 +16,12 @@ + package utils + + import ( ++ "fmt" + "os" + "os/user" + "path/filepath" + "strings" ++ "syscall" + + "isula.org/eggo/pkg/api" + ) +@@ -107,3 +109,16 @@ func IsDocker(engine string) bool { + func IsContainerd(engine string) bool { + return strings.ToLower(engine) == "containerd" + } ++ ++func GetUserIDAndGroupID(file string) (int, int, error) { ++ fileInfo, err := os.Stat(file) ++ if err != nil { ++ return 0, 0, err ++ } ++ statInfo, ok := fileInfo.Sys().(*syscall.Stat_t) ++ if !ok { ++ return 0, 0, fmt.Errorf("Assert failed when stat %s", file) ++ } ++ ++ return int(statInfo.Uid), int(statInfo.Gid), nil ++} +-- +2.25.1 + diff --git a/0019-add-design-of-eggoadm.patch b/0019-add-design-of-eggoadm.patch new file mode 100644 index 0000000..8813235 --- /dev/null +++ b/0019-add-design-of-eggoadm.patch @@ -0,0 +1,5130 @@ +From 2bc0e2af382e170eac150663c72f22aadd40aa83 Mon Sep 17 00:00:00 2001 +From: haozi007 +Date: Tue, 4 Jan 2022 17:05:31 +0800 +Subject: [PATCH 19/24] add design of eggoadm + +Signed-off-by: haozi007 +--- + docs/eggoadm_design.md | 116 +++++++++++++++++++++++++++++++++++ + docs/imgs/eggoadm_design.png | Bin 0 -> 266688 bytes + 2 files changed, 116 insertions(+) + create mode 100644 docs/eggoadm_design.md + create mode 100644 docs/imgs/eggoadm_design.png + +diff --git a/docs/eggoadm_design.md b/docs/eggoadm_design.md +new file mode 100644 +index 0000000..5e86c87 +--- /dev/null ++++ b/docs/eggoadm_design.md +@@ -0,0 +1,116 @@ ++# 背景 ++ ++当前eggo的集群部署安装的逻辑都包含在eggo中,导致节点部署过度依赖ssh的操作,而大量的ssh链接会成为并发的瓶颈;而且耦合的设计对于后续的拓展也是不利的。因此,我们需要一个eggoadm的独立二进制,负责集群节点的管理。 ++ ++## 概要设计 ++ ++相关模块关系图如下: ++ ++![eggoadm_design](./imgs/eggoadm_design.png) ++ ++### prepare模块 ++ ++负责节点部署的前期工作: ++ ++\- 下载节点部署依赖的组件(证书、二进制、token等等); ++ ++\- 安装依赖组件; ++ ++\- 启动需要的依赖组件服务; ++ ++\- 设置节点的前置配置(例如打开相关端口,关闭swap等); ++ ++\- 生成驱动模块使用的配置文件; ++ ++### 驱动模块 ++ ++负责K8S节点的操作(部署、清理): ++ ++\- 封装统一的接口; ++ ++\- 提供kubeadm的实现; ++ ++\- 提供二进制的实现; ++ ++\- 记录结果(例如控制面初始化需要返回token); ++ ++### 日志模块 ++ ++负责整个流程的日志记录 ++ ++### http客户端 ++ ++负责与管理层的通信,日志上传、结果回传等等 ++ ++### 依赖管理模块 ++ ++负责依赖组件的管理,包括下载、安装、清理等。 ++ ++## 详细设计 ++ ++为了兼容当前eggo的设计,第一阶段继承eggo的InfrastructureAPI,依赖组件由InfrastructureAPI提供,先完全其他功能;第二阶段,基于文件服务器或者docker镜像的方式替代InfrastructureAPI,由eggoadm的依赖管理模块完成。 ++ ++### prepare模块 ++ ++```mermaid ++flowchart TD ++subgraph prepare ++A[checkEnv] --> B[setNetBridge] ++B --> C[installBaseDependency] ++C --> D[addHostNameIP] ++D --> E[addFirewallPort] ++end ++prepare --> prehook ++``` ++ ++### 驱动模块 ++ ++```mermaid ++classDiagram ++class AdmInterface ++ <> AdmInterface ++ AdmInterface : InitCluster ++ AdmInterface : UpgradeCluster ++ AdmInterface : ResetCluster ++ AdmInterface : JoinNode ++ AdmInterface : TokenManager ++class TokenManager ++ <> TokenManager ++ TokenManager : Create ++ TokenManager : Delete ++ TokenManager : List ++TokenManager --* AdmInterface : Composition ++class KubeAdmImpl ++ KubeAdmImpl : config ++AdmInterface <|.. KubeAdmImpl : Implements ++class BinaryImpl ++ BinaryImpl : config ++AdmInterface <|.. BinaryImpl : Implements ++``` ++ ++### 日志模块 ++ ++使用开源的`logrus`框架,收集日志到文件中。 ++ ++### http客户端 ++ ++待eggo服务端完成,再开始实现。 ++ ++### 依赖管理模块 ++ ++```mermaid ++classDiagram ++class Dependency ++ <> Dependency ++ Dependency : Prepare ++ Dependency : Install ++ Dependency : Remove ++class PackageImpl ++ PackageImpl : config ++Dependency <|.. PackageImpl : Implements ++class DockerImageImpl ++ DockerImageImpl : config ++Dependency <|.. DockerImageImpl : Implements ++``` ++ ++为了适配当前的版本,提供一个`PackageImpl`的实现;以及后续支持`docker`镜像方式的实现。 +\ No newline at end of file +diff --git a/docs/imgs/eggoadm_design.png b/docs/imgs/eggoadm_design.png +new file mode 100644 +index 0000000000000000000000000000000000000000..43b788d29402a446245b93f384862aee6eb39430 +GIT binary patch +literal 266688 +zcmc$`RX|)_vn`qsf(Jryf;&MQcY?bIcXxLWA-DynaVG?KcXti$?(TXPU%veRzGvU3 +z`*L}qf$q81tW{OBYK&0?$x4g7gTsb<_3G6-F;PMJSFhfHU%i4{gnxrrXb?ryeRi7iccMyB%j)|uDE#NQt^9iOLCvur1O4)zZW3}gtv +zQoJTjhm869K^8*%^S?iQe)pbUAyV}Xsw3?G`rFqJ?;$=hTnhY;xBvaD4>oZ+QAM}x +z9{+z<`uiu~8bk^$|NBZ`Kl}s%%b6qO&}RQ%H}UdO;6fk&zg)DReSUh} +znaqzCYqd)WdAH<#u`@Pc*MdA{tarQHa8RE?wWK>j#K2KWb +za4OaH-bmu!{{H$M9_BLPo^aetItki)?;q0t-3&J8Ycz1!Bm7U_?Yvr#(=H4;Dx)XS +z&)BS3{Fin;G<0+=J295?)fv{y&GG6GSXfvXXdjg8g{6|$<;^u<6@q{L{P{D4$6AWM +zDT*1hjcg($jLH>#$(<6fK&hyGXDo~E-iofOd)~SwjNN`q!|q+MWbkZASRz|bY@scC +zuJRdmyuKRB@?C85y4?u>QVOSY^Fc#cXlUb(wvk3(#R(mMZFg69Y+;)_5(c(68d3(wT<_?e7aJYiIxSo{!y3L +zFz=)$?VeLsVHqzQ%PLm5pSnerqf8-n#AA432w~ +zAL}*2E1F05wW`By))rR>v(sHM%eOz}vWm@toj|w9J)z*>ghmpJtl1r(x_KQ> +zy2t+OaFghOb*qGwrkRm{T1Mvo{O9+qA73*vG7hG2UPl>1vCcE@pa1dw)**qWdcQyaM@$Zs=RZgIRRrieL_93-g +zR^Q^V+d%?u_3N_9;mzM&|NYQjJaE5vo68hV#}j!GT-()_^VnVIdjfx~^*8=~x+MW4 +z>3iKfUL1U4*oUdK`uA@CE@SlyFpKrqc$*4*KHynA`Cs1tkJ|wfRIByN9Zk#bzjzym +z-s0a}_3srH=wHl0U$VBv9T+^AbiKG2{m;|;&mum{D8N%#7Ayk3sqP0lzHG#b0phsv +z95GiC3<0Eyq=UW-+duD52fY{_bIFdIHw$?9Ua#w$0IR(V{|W|UZ4IZuSAQMP_%~gp +zX8`^%JG!LuhN~oa5b9?9q8HfHBo*L)m%-Ys%KzjZpM4U*)*P?*4&%vfHhPi8ZsFkI +z>K_bJ{$1t8KYafG^AF$&&KVbS{)vXqhc6E9ZsBP7_facL>C9JK?#$QFRa-5>b)?+? +z!WjGb*RYesFFS?Nu2K3o%bvJHfWhFkZmF`_d8r``nx1qFtOci)_@pYGy91dwA+Ardb(~|zdvq?cjt6ILU4C? +zKXH?m4i8+oUUElDO-*HeZ^|9~Zyf%U1%PwV8wh~?XWWGg@>;yeI;TT5$rKK>jEsz% +z>z3y*ug5z=Dk=#<^8MJGb9L(`wD}tAo5@_4%4cDdb*2f3W+1le(LaxPyS%i_!a +zKOc(*CGcF8#l^QZ8GX#rz}q8f@f0Mu=;Ts~-$n3T1qbOd^F20Wl}B@>K6*S}PM20y +zb%kOv8sHIwBe<_HEi5cH8bdkc31~HHWd-*}c%MCHU9FpMa|0FOdYzYCMW!lBOX<0J +z6)d&A9~~by>Ac%mmpzD)6>nZMkh4teEhXBTygnh~GG>iy*50qk0( +z!YGVVUJdQT^yAHXgpdb=;Z+cM>Q6`i`hO$vZ$V^20i+a`7}nokM_g%$80qMcWVkO; +zua1}Ln88a+OMum(!|{1(kq3_!81S%o%YVc7x_K?bbDMo|IVOTnNJ5hRx&@cJ{{M0f +zRlqgO9150W-D=6 +z@_7SIZ?(V%`iRY9fyv=?KyjH6YQ>P*Z(h=Lg{@X&RdlTJ^2BA=AgoY9yOi+SJT4T*;$>+NM9(v!gT}gP2)6AC|+LPIxo_5 +zHsj@HPdj`m-yNd?bTWYe#4hgZ1>zz}Oq$;rkY-V@6sm5E6me5H92sEWiHL}tOyiWf +zo}ScP=Jy?b98`17xuy6-FyG<#sQT@!rR*M5d@x3U{0jpL?P +zF4myTj57NC^z`(5Cz;b35rs^$RnvKql<4=|+#S-c=58ZYpjO1fSD1}h)RnRTV;|%~ +ziFaP-H1|~Lf=n4J-=qV(3LG#rVu8bEZ2VFU50_kCd*)r|Fnl`4q0}yGIc6P&xiWU}_l9YVtE9WC^tjv2ld6hs>FKH_VuHS# +zUw(p8R-QKF<#9P7@JGV83ij7RxQrb(hb$4tFH41ymCU)46(-y^+5I|OVJuNe+dzWhN_s2Gn-&~XyJ5CJ>~*W!c==F}Yd$Z3 +zl^$`Ao2#uYonT9}pQH`c6Ls5?(vWH#UrMB|U{8ejEgndNu+6hkb64{=G>Np5=AX#| +zk8#FP+*uA{m@&I7JtaPpVC1&7wIdEIh1)$I)+|4zQ5a~MzP3nWicLG_u0(=06=VBh +zi%P>KaQeCAUPpII&`U{4%il3bT~I^*^YW(K$Hv6^q+!X(+Zyi&{HMz`3CBA_z(NWO +z_256THVN@kFuqcZFI0u_^YhbNt1z7)lYL)qC^lWJX}g``{B76bp<^3AY$%D<7dgrG +zd`ovUoezV1GIqFNHgEj*OMUW0p@$xK#yCZ8)g_wdQ#)~~1jdPv{~AHm+|8}^Xp^Vj +z#T*`*Nqr#B`Sq1LzJra0Z`uUX`g9?qO_^OM#WEkgFL;nM$`t~d(aR^rkLIq{8H3M} +zX`iHB{%VbOT3sshvf#}?>25rY3xN)*#iy>h>X5Zh=)e4wf@|E&x^A46PEQ9za< +zBNwKMZj>X#HjdJgEIkIn-k7G+^v8K-{`S)WJk5^`T +z^~KGqXkbSnwd+4!na>;%&@)!|?$tYre`StYU0p3VHZh^N32@39*(^647;W}+znuk) +zJkhal6qee0EVSjHO@AOcOHNcGRe|14o=1XloSYIcEPZGj;jE2PvC;m;1Ec2kCPj~a +zMzoL)-U!D#XLAhXpWSTHAA|5e)U=i4$HUOT4J9Jo3>2v!r~~<>4$kB!3$^4$cWsC +z>IZV&K2_cLfN*^jF|YZ_Oq`uU7Ne&yZmu8psbfm+yAceQyy?_soNB@P;4IO#QGZ +zgs>KhG)BAX)~;a?b78Gz76aI6@{$CNyi9$>Y^JZE3jjO9?%(}6KxOA&>SPvO%@%1G +zOv;kFx;m9wn~d6)ax~a`BU-IS6-jrtVh61h95tXlj)nXcJcw(0U&iAFPX-zKS)_-B +z!53nCJy7U_Yw`|nW+J9qbSYNRfdGALMIKD2KA3#faGmzsFsAJ-tO{xcT*eh2<~pM& +zky{-p#);{MUafkao?a`AN`mUw%W&(|Tb!B(hnPUpp1K7J3-LKZ{>m2P2(#l*h}f~; +z$UJY}TWm+1--_K(y5?nl7W+OIe784V%Bfo;lR8h*Bvii9jgj`vK!!M|VH^4zUCSQ_^$EN)Q +zCg#nQRAJ-O`cv^c@&TQUrtB2AS;{LZVKSf|(rj?@aZD_Hz1Zy8a53?4 +zF(ETnsOks533%=0n|&zpbhy_72GX8Kx*i|OR3H_+BN_~ZZB;?dfolF_^gW?JmdC|d +zNiBPhDg`iC#so4w?WxvrjT;SXU4BL +z*`KdkYspLuxYUY +zoJz^XiXEb-oDra|d|}_Bz(9m|JD_jE-4qfyTuh6*ztNx=sY;&Ui1Mct|0(oR;vg5( +zYSuu`yg7d<`2+C10+W+*kdv&NF46Jab_j1fGC_dLE~aWZn-@YN@SPs|qp=;hBQ9!i +z>VCg|)z*eO6Vcv+o+0LAI^QXr8Mcp7O~^neJg$p%s-LpCbU_SLeqMl1!$g#hY9CFt +zPg-|W|DEQB^qz?fI+TU|7sDqkPeMd*GmunfB98eQD=`Z%-?&m;HK-Qf{PVF*6PjiU +zr|6d$#~-vx!=iM9t?!R{?56xcRFRs=VLbwQ2}e@YqHW_d$GQ`pYVz8<@6AJzIxxf^ +zHxAGz#ySgOF>|=%KZcF*_zIGITz9#`dPt~5DZ=HapDBod5t%CSpMw?;BR3ZgGqL=s +znVvvmiyDijtJ$u^1Y(SzR2G0aHx4aiP#c_^(setP1%b9*of{W8A{ +z1n?YL;r<^?;j`sSlRN+2@sWd6R!Pa9M!i}T_xIP=Z%z&>MxJze2dGk%^8%)aut{GF +z$a0mRm?9jp!esrLl#>q?+U#0eU4fO4=o2u~I^_6jYhNk(i>i^(dP2+HjC&VTsxY5am$3(~?@0l~tqW +zkJ5|YW`)AFaD_VJ?JbBGlgz^~UhA-j&+&KoE+do(3iE%kXacS7_Nkn8D?8p^~ +z?#iJ-Q=Xrlh_-X>Jg^H>I|nM}sC0p9W_aXFk|_*bZXMLjjZXIQXJk{pE +zOe?d|UZR=lNH-A-?A7Hg(GV4djT#7H6tBW;+0JV*UyW(T70F)Z;75MZ5k@P>{mGEx +zDD(hTS&Gy~krr%nyp@fscO-C%X|hdj#6vq3PC-Le5C=E#Wp08UnTVcp6w7o|r}BEy +z{#Lpk);-i=fsooJjWIj*|Q=68M1cBM)im|sR`9lw>6 +zmtWQQ4V!`%QH3_JkJFMOoWhGF$K-SC#$y7Yxc$eFx`>Wzs!H2bmfQ5g^jo*v(gJ?5j^VIs(Qf5q8=aWV4@*}vnmugZ`rd_P!rg@>dqvEBP5kSh|Y!(aC!%Q!SjIf?xc1y3Mh-YMNqv$OaPHS%e>M`7k?zh6gs;)W;*OK%t3F;SpEjv_>stra!}Wwl5hPx{=TNY#QA8AIGx;M +z_+J2$!YAYfZ_*Yi`Y<||sn%5xvP=TWz{t3|u|XnJ0RlWKh8|%*|8UN@xBFfQbB{55E`inLW&D_r8{Zp*qDIQ$?h{NHdJ-na|7DR}itMC@h?*K^N7q3=~FNGD05{!J9L@^nm+z2qF2=8>K-wGo8`*m=)`g +zI!Mzu<{J~&>{^Y3T5c+XXI$nndXG}>J@`)ibuWxjdQn;+C$Sl35(Zsnacv{!acT

F?Ck59!B%x!><+fahshD;LWM81=BLfZY +zkl(A6AJeF3y%fS*SA076$XD$K2Ic&sTl%U89J`=?m{P(-O8S=IC&bN7!vtizmi*(b +zxtk%jL`S#^e)1s9Cl0rq+H+~7W~3{{WXF<+uszAYXjE7<0K|3QF6|%WD;i8;nJxbG +zL7Dl1>YqY+eu`rorT-EU*(GxvHPial7#a+_$ +z*8}@>df7zNvBjgnYJZg3MV|Xzr_YR`mWwH(8Q8(S +z^2mNznjG>iRBkN$8!8tz$LyCk;^fNJSguSC +zQIldyxM{+)!n&r&Mt+h}aimQ4;m?0y1~vBkAk<+A&Su!;qwb;a0fe-W#<_miZc-Jo1jE~fH^oqsT=e2K|KKYSneLYT1 +zB9{}(?X)XZvU6-V0(I$nk_*v56UR}FSa(_u*QA&9q>P6|HPJUHC!W)%#4%@Z?fYD0 +zxfI^|=E9Jq=(3Xf>1IB|RNBE5IW5I*v#tmZvvVPH2oZso$sb6XXebTB;yx8tJTRE$ +zvyBbIfC)ylzbH}LyCP2IZpCPPHg(OP44GptYdfS(k-RVEvG-g<-}M!<9c;VM$XyrS +zOo@ldZISXzF!ZF#DlMEoIGPi>vm1_hQu5NQa+Jt=puf!c>p&VWDD^aqv~>dmP-vEf +zMi0wFK=~9=x@SXGlopCYl4)v~Zk^lD5k6!cD*XOTijf^epjT{2z~6i+u1-A +z^$Yt=lieM0rK3qWa%?U~=#H(W@H^AWb!Ey%3NDQ9Le#MyweE!|E(=MxXr3ql_921j +zMb*k3D-L@`MuL`!aU#c&%+W+^kvm#X{skO8xRm!K^?gjggRw_3ZDS3a@4Ie-4RwjXM4xy_;v22 +z>Xdr3vlHHtLjgUWp4$PC!XX+Ew+laW +zs6$j$tXt1=vH@6nzA`8_JIIb+ub$R62|0d*jkw7&0-%MeTf)x!|(&KYPidZ2+)#@D11TDNEf(L?yL_wr6 +znMaq5X?p3#GRXSf>7O5dl^<^ag&`Ta(vyenpqXh~n@I-pTMg_6rSJ1VFCb<9J?DWs +zyv)J4X{gRuBacA+eUrxUXV4A+rP1^?bg9Pjhws*NNl0on)>b${nY{-hCbnO +zZ!7`5a+K5Dz@gK{bz!X$LgI(AuwMGK=AAW%kc(G2`O-lDFzJZBK3{tom3wb+PD#c( +zEr8Y2#az>*PgPlt^!i;C2S+tBh-b1OA{+Cg@iV<1Apl5Zi;zS65s!Eu@mEepV&_*p +zV9nQzmiE%i>J>!U#e|4Of>fS4oR2gd62>&|jLz!z+6}M#Ftl1j=$d~LRV+P4Oosgl +zwiP$vTyNC+=JreqOMhto`_ur5r?JMSJ5ZK=gq32-tlfEO_^c1;{#n*SBZH$~AJE27vOq9FP@pP+g%J +zy!gxm-d_|;Qf@j5lYyUZAZ{z3# +zusC6no@&h1iIzFlS*wlxgxH;3r-tm3@r^(^$%x$I+MazY1=J|hnt%$guCzoM#@~La +zgFMjKFraS|r}aFx1%iAL#%X-K*PI3HQ^OHz;gy*PgI1?ME-JEhvRe%xD?BTdh~~mT +zbbIQkG3bGE$k0;W6v<)k1;K-2-l_hhrZp?4qm=Tj>KFolP=r4vbvg@Rv_h%+`sx=r +za)kjh)a2RNe7mi#B9E<5ErA(X02h0PYkDuzj7pY?p`I0_LjqAyTYWUbM%K*|{YE4! +z$1`w2fKcr8N@oRA;TO$>hPU|ayX9Oh%)LdCab0$ma~Jw^OrX&f`dSn*sWeUzSX^0{ +zW#CDX1-8f-uMDaZgvX*Zth}5E6dL!ndpPc-H|J~#RQp7uXu=}c*5_%FG^0~_{28!J +z6<9alo%GwT=^^d5?tbL&)1+0)^>8_$ucZgD8v-(3zCCeujxSuq(Az14>;dFSGH56S +zi1jP-I_0>bazK02{}X;2l(#8xcCe6S+JKr69-AwoC}cF!1EsT6kR~=+RqP);SWi@R +z|1TYB`9epk8#rpdL}e@5`=5#OOZD!YLD=P&Q1_zceo#VDAgAo3j^>LjqMKjU`{@K( +z2_Lt9BLT30a$sd6+b)RxOR*wbNx6TdX@MjN_wYQacRt$by?WHO=sPl8eX#IAAn|cl +zZI)=(jrxZM>|G)7hh2v6*rzSGd+y(8El%0R1MB +ztuyNMGjU+cWJg5^q8SqdMy&f3_98wa3r&k}xTVasE!JBN_ +z@;#Ts3v!s!OXezi-E3R03p*Fph9FlY=zWyg^Qdlq;>Pc +z_w*^3RuP=GO#9iBT;m1-+q!#)HpdN8P1Nz7#jn-V2jRew?(pgpk#PNRr;ZomotxzS +zjH85chXPS>3SG8SfvpVk{d1xmbxw}E6xRwdUKll6cP7IKb@(}kIUiiJqb=;@u>D;w +zeXs@%tX!-RwuI<9K1XQnYzF+w;`kMUhsooOp(>63Xbo+$r +z6WQF?E)!P8;+U^{w?`IgpQ`L^m}M3K_=UXLt^p^_j@B(!n7hiyzErR#m8J!y6>rFm +zFr?ORx4tS^-Zc%Y%0Shn0dy(=e?|sl5JxI?%*JMd$JDX0xUm_;hC8w4u_5H-D~f`2 +z$5Ffp)dcD0<3~LLeZ!mhoSuLxKYLDHH<3Q=cmIMsWPY?FBiF+M@y>H6{VI2B1@uCZ +zrun0~(ti{ofJ6N>e1RgdN@+`8;Eq}x0K0Wc`VF0D*M9otJV3|F$X^pc16V$68ey)p +z{!C0)N3Hlk>4zmhAj+pAuN928?ft`H8X7{ltsy_aLL#!~j=#PF`;i)~C*gx-uuYy{ +zVG+dd)5kQ^IPL+&Mc~hDo2--l!>L778iN>X^)tL6rn@;8Mfb|s(~o>2Gx+uiN_lkQxe7IHIav7xYvelm +z>I#)N8SU{AbBA6S1X9BsB8|sSBVD~T`|_&l;;VgaEL3quaV``$HF%kg(x85?WQ+Co +z#~F;6W5bJsdwREF7lex)*pYsY@qwn1{m0vf+jEfnmBna^`oB^p3Lk$_APot4n7bJP +z$=T`?gn#eB^$nnHXpfOkyanoD0bNy)@EyX>EfR?y6}TSNjOc7S66o#mFsE8)Zv}Cx +z6oYA!hd@MWOF-qrL=XWQM-b^G=}#lpUG#I9EL +zmkb{nnVMpG{5oz!y1}7A(z&^|GUmj2Xz&(;e3HhG;Ji;+HOBVDr}lHY$N^2<^~9Cq +z6hT{jg;E2*CB{;{)*FQp9^mgtA5^Drua&nm9c!vxHjYfm +z#=I0fUGC`rY8cFdfM`>LC>T(Bzp~sblf)vG6ub|e0ZGgEmFRrAj4 +zM_^i%b4UN+hoU6E#PKh6f-3!5L3iA!4keZER&_d~9g{SZt=bM_FT)Ds4HADE`@jcZ +z8R{<9JF>Z5P>3hS>F*^)tdzV-i@H#NYlF|ZJu%&*lv7CDG(g+d0gBKdymF)Q@r4h@ +zcElTV1QAQ3GkAW0qy__M4#w9fYBXQXNgjQJZV2x|N-JrzAK?yw)=mk^K=If8KJqGm +zVB?11fl4EAp!?~%gWhgKR5FoC?8*T3k|j@lbf76InY@Ax8Z0ymQ++LmYHV-L&le#o# +z0#m3~1?PEp;S(JlEjXHBw5MYVZEcPO`UQeg;GZV7XafjVljXu34Wp4kUvLky#lA5^ +znHb$*CvV*I$AGxQw$mb!$mnQ&wT`JVL~RF=$pINId?qG{ktuR5Z +zOj?iUExN|WHM;^{qAJ$J>+7=dYB;Oj*$y{L@7NF(+ +zW)QFAeWW0R3Vjc4c86+*4_R3H$$dec(;%vBtx|x~sT;iO +z;ogNNC1P)P{|fVKtz56M^2o9A{-mH+d{_`ryq@l4MYP{JiFB&wt;o>i2I(RWxg_L% +z+Re{*ADg~Jq<*p?)B>bCU18Op4Niev7(sy4YJsN+BlWh&e#dzET{O8&cd=%}$=Lv1 +z*7kR=ndIg-Pj#s?7j0@D4G-!FUKWrnBkB>l9RceV*E~L9VPO}Uq0R3jY^UCkx~T%f +znrU7ylm^T2wx01f+wo~#El-zp`S}P|xZi3|R5lEZBm^&V;UDL( +z$fo1FiaJWl$Zhu?A62SdurxF@=pFV%Z^Es^c^wmIBe|}|4Bl;P7T1WGN6n{j>ODR% +zyBs|~zHQS?TIZ#Egzh-T`KEwuOmEQ+!$is2v31Ns#LSG=5r7o`bAO_QE5!2l9w6;W +zq1-R|#9U#U!&Cy!!LT#8cVq_ShI*%KU2LJzGihE3GOTGn5lgq91=qcoT;6Va9(Hyy +zU*8Kho_N!xOI=?joGm!GR9*?+XUYyHbG*sP$+_7nkU43~a8-HQfI!$|eP7b@2!$B; +z^a*0LAU^;TZgYFPV{idS;)9ZJRf5Bm;jiP}WE-(0+@lG6=lZ89^_cL+P=M@V?wC!c +z0AOdPOQ69WkMk>%pjg-z@uZ@xEwuli48@C`m50TRwcflSKd+>$O&uT+oRt%gJ2y$! +ztRfmZQ(}pEcwx1B3P03Lz&;UYOBmSc{<=t|7NWFrJ|fv-!#S|+(~6w +zJ)Ml10fF({wm-1MS8M$t)r{wz@pVdj45h+ogN(I9(jt;yHEAt#9(p)_q| +z3jX-z5G>bbxgOH5pRMxAGRc7t7MZq#lX5@a|(0AOh7n@7-f#Ahl9 +z!yl;E!Na3d|4{312zb}(=?(sFb!aW%9-x$P`Ha`oj)aje@|?=nxSpQfi=B0Dsd=*M +zj-T#+eWX%p5}Dm_mF&iv`)EmagoO1L;2002c)xXkdjQUxNV-xo50}a1NA_&<>6-aT +zuYDAgdNJo|PCkXXZjhK)*6C~k{`yeOl3)*yrj5lm@`llq66ai%xiZ4dJ`AJ-oc|+U +zZ!-#>=PTbdthX5ISdLlaFT-iMXz6 +z4dTzzOCy1_Z;hw|-kZ+bQJdO +zh{34g78rVy@5*`X0cvjpbvv^~L`F;^HqdyDWg{LIynkzmbm5nl5jnKJw+nbNX)OSF>}NjJ49v-eqj52^i5Mfzb{SE+ +z{wOy-Vg@mgVB{BnhK2P-nan_owzeq()MU@a;~)2wvd<5PyeFI4&bHH<&a1viJfEAb +zDbEJrbz$Kj+;-TOz~|V>3n{ku>rJIso0})jSFzarqWdnU(d|>DiuVde7~5-Lq^IDK +zZI7=!kN0ayCGiBy%_?fXrHZ{2X?!14sVV8YKIZWXJ!K#?vhSls!yjJc8Mivin=fE+ +zNPfSd%Zt#TY|0v&9EN%ZvOI!0YcJ$p&xR%dOkh;-lZkovv$nW=9O2@EK6G7Xt+jnKW>C5j$mda17IsI$FM^_~GK6 +z;08tTKB-PP&dtK*!(+kjDvq<6S#dX?1mXS)syAVxxL$lXnjM@m#-Ff;W(~5z*0# +zWY~!4I`y>g9~+%Dg;$tt{eYuQmwC(kR! +zIu5VQz1x&s^PZYrV_O~m6$3BW09gH!P07XohjU56`L3pQ=md{iQ8Abe?+7bxe)@swhJ%jr2l~-`~u-^sxg% +zkIzbCh^a6sdTzY{N9=*xEDL!qTheTo!c8@z87MpshV(ewm}hf5iwPXGtsv9UUzJ`s +z9D74cS*=oO0cw77LgxC`M1nm(R)AYrSeWfhn&Prpm;%V?L=!qRyrcxu*lDP69Kv+j +zcAaeN--=X72dlm}XW>PB#%@|@0Ly!@k{@>t$9NLazp?P#xEj40T3y@scgFBG367cS +zx(2j!v=sYzf2uUuq!;bnU(m$nEhHxB{(ixGC0y0BO^M7&$^tY~P_uv)jS;a3AOSg0 +z3L@aCz83*tK2s +zdDcCtI2D#$a&5eObf39Mi)C})7{pJV8Jk5OdA@Yzy4{GLNvwiitpknomgfir4r-&c +zU;%VRSDO0pj~z1Tw9TxOl2!9{zZa3=9C$(0G;PgbOj6!!1c$?q_iW4I5G +zaeJ_RVB|@`&B}jUSYKe=iA|LQ0CNd!y||NYahAKRTU}aof8VKMlZgR>B+|3KKvLou +zE(Q1i9qX}}IK}6%7{e<9TyC4}>{s~no*QsWdP7ojk*fC8j--FclArhhYO){D +zaP;dX!_p(C_aL2r++I6&&Ej37;y=`36k3IQ)kmSL0b|7#T4Y8v0!|vhk%-lO# +z+$Q?U`Og<8N1x2)5xmn%-=Z6#WA3wJ7Ap-0*1o4{q6hO^Od8r*sk*Xzi7tGCh_6au +zx;(8p?G9LlN7mUk|B!G1zHO^}3kckijWrOb(uPBx(D9|*G>N)6+pDK{r+*PuNZalk +z{p)$~FP;bSMN|F-uCrl=r0C4$xu+-NVN^9kpbVw(qKHaNR3|K8!^rZW3UxI3at_F> +z0Q!OcMG0-GBH_ZriyXn~{T@&PZq9XQAJVfj3h40w9U_okb!F!G4#YUADKk-BnPAqM +z0EO(E*I6qjyE+^!n(EiaI0CHk!?lY!SsL5TO!%3#OnaCS#wqAN171=7jI`U$-d3-J +z`$JAmdP!!OOh1iOaCkA62Ul!r31hIkq+G|x$BTK(@DSr_d-w6s9E!TtE5b-(;}mfL +zLwZS21B~ecC}yR@4)a;L*lgSqP?Pl7AwEzzms2kV4!9FJDMf_mB{{Rp)S3a9?G57 +zu5*i2)L>$9?yY+CwT?tTEf?M$L1Us@?}&1bb(B{^M1V9XNRXr02;G>ti5}$z=Z;Z< +z6P$9F{{bSs;1}ajN`8KwFSLt!%-g7jORTAmRd#SNiO2nEpI?<+JhFFkes$^5&^qx< +zROl!!c(-9}%foQ4 +ztxV3&dwhj5bHTGi_)#XHp0+{lQjl&#_8Jeznr@v@;2_#IYkG(RC*$<&jCFb+ +z;V=D7*)VZ$Y%m(8`6cJUh?C#C|YbuNvQ@u4@{AViK1{Ok5h)n21 +zSDYW16aZE`ceWj*YbSBTPd`#~6S7z59d&GFA4chk6ZY{b-~>048Ex(COe)FC1Gy?t +z`(pq)<~FO~mZkI@VS7b`gt3F2nK{R7ezHxF6V%+D-gg=A{H*MR2QE8G>cPPrqe#ae +zIL9eTbdfz`ud}4C&ldnSNt;W{YOaZ)g;rxFFKii7XJ9`Jh4oC57iOqc_!Sl;+}zCr +z33Y@z60`(o=p}BjQQTE;v=i;TkcEPZLNoryow;*N +zhDK)Uz_51&<7}i$@o#G6o^F@JL2?sAd_A+r_TKHh$Pi?mb$}_SLhwO|ygi6&(YL;n +zd#G5Pa6H3pdAyoesWMYc$=jXk>)0jxW4KWYpo+FYEm6e>5|__MFd&vRelSD_1{cJo +z$Wr9MWFNJEgw_muguhPZrY|i&`T-H`|G6;B0>I7aJnIHyLOC +zJ-6@y1<(R)&{1z1i>Vuq^fqWvsb$-Y;skh-aTjTV=A7vZhl(~hCT!WgV@5uUDQu?q +zO7zO0uNsAhW?D4bA4!On93GDe&@!&|KDy=x0sXyjl<#nn`3EmS{F+J_BCaYEoSZRE{<5T&{t&W|2-m6)qg6rI@vTX2#%(6M=S?S~UeoWtc(S{CmIc +z(3Kz{o3o_E7Acv8UWmp{&brDi_gC%mtxM^}Aa`ZHVpIWYV*$SPf+AaDZy7h1KPRLt +z#HAE~mV37NBzbs05n5jE{buvHIgxtGzH<>@nS*6xXI~xT<@OI}RN>wAd(oUFF!f~! +zP$>wSI(67`-6J%smZO*c)dGa5M?B#_0bLUJ~f5t>{^Z)2Yps; +z!vxamtx^P7t!Pv-h(?-1n7dHZP_=$SUI%}GgVMazGxR?i4DpqIz_%J1q&fDnVS$lI +zMfv8;%*?z76AYN=%*rQ1SSduiR(hOU$wj9ge-I8D@YndDjFC +z`LvdXNABiYOz2J`077Qd>Iq-+KpQ=&?fe6q8MT=}xrj)Pez$=fTXS7RMllrTP67qv +z>F#HWZ(&s_H~=>*9x>FzPfpxA)lzu4YD!UP$T*a9r4DN=i+M#3l47N2S! +z;K<-Fwv?F-d4tuW^V1o>(#eE&+J(-KWxk?Rn?ga)IroqiR;zwk30Jbg&>gjbjKyy0 +z=D|SBGi8OBe~&GUudSBeEoU;sUnv)J!XR*L*w*V>^pHwKP8C@xWtsXi(?cm2iBW3W +zCavkVMbwl3uWL<<07KuGrxOiy0_neO{o7yE7H5zYB(qiqwg;bH86{w|NkbAYYGU*h +zcUwy1W|IbiFjKfvJ+Uou)e>;DYDkXJ?^7mF`KjXwRmcoV%hDfOMMr@L{$Yl +zvI=Sgl)fjl1Zte`Bkv2Px1dG-HXNPLh3KAoiqwM7d!(VWFU~hop_)wB!6{G~AGzs; +zxXzAiF$y#L&38J;^2s6KaNP^~1ANq};)V0svaq(?a2|{&(6<1xhUpkGi|oU3pX;lB +zwdrr;{DopOp}$*8C6{ +z;^(BeaaKPq_W4c)+bSrGay<<*JZa#R6e$-W=5e3q1v?= +zr16WX<_A&}AGQgRI;zv8{ +z0mD;+R-na69?}LjXkZ=)!nuCY|8;B?_^qLk3SNWsot*r}sfOg3=KD+B`g#ZYs!zK6 +zsKK)jv$m8TB=#pG3qSCN7 +z3X**xtR{mdN@#OgaPEAwDiv}G4j?Er4;v^k`8d(eqf%TVvk(k4g$WaScTzW9yTpG7 +z<$t=qFrTUU#VUR;Bmm9}36LI5rSL`7nQgqGVX~dw2*CMNXFh_3}R0xr8j*hity4AJs7isyLLBOaU)W{Ve>B=={ +zn#;&X^eY`(J|E~cr1(VFevu9~w|Q +zc_UOH$P0|3#sS-tSEahAN@-6#!`B=v^3IN=lGU1!)QCR6UUd)2rq;-f_;X{wr#Cdi!zHEM3}|F)WU-5$`G2<@H@kq~tpGHS$~d|wiD +z1#j|HY&CcoWqqn^I;}x%G&s?@fA)3GpHcC6hUUE)Ga{UF!c9w` +zwkD=U_=sj;6x92(nZNd5j`^R{3^NSqP{4T?$+QcoC@dq)`Cd#26QbS6o0_^Fg#|NJ +zw65{kSwv~M!(X6;a-u$aX#J}HiJh(o@B1dPBVN!k_Jk`w!f*bmQ$#XOE!FfO7F2nF +zV0PM+rDr%^mTW;dzwTPNtzmG2+sTxhJGZ~J?%b#?6z8IZVS8X(kN?h1RZPI8MS&`= +zZD4k0?R_5v!GjncT*;G^6mza+HZmbqKG-+>16no)62|Ns#H2N_z(S(9C%O7)wC$Bj +z`BF(})=$|U-b`p)hHWY^ube30olqo^vB6|kDfxerP}Ni5+oWG9JGYOf=sde=8Ko+i@6#-_UZ9C4LRF0vkV +zITSzii811+7kp}-n3Xr`9{7M?VqLw}fSp6fOTUuHf`yED4oK +zrHYp0kZv20F3CFWmSyg3%jsmz59wzZ#6L-0ImVHSGNO(_7L~A(Uo8t|N*f64i~)WL +zCasQxTI!FWpEn(a14cVPwLn|OO#*;X!I@a!&iqH8C-{4mH)Z@cu`QN$t_5yu2cH +zL|V+yU+w`?qoBcFJ^6?#;OewAj=SH9ex5H~LIf|-H=T^(g5=K&iz`x4(*qjdJpM(e +zte}%Exvb=GO%Ddd1N4C7-E-I4gtfBCa&x?h;^%RlC2@GKR{6DJ6lH&EW~7$hlWpi6 +zWeprr_#$Kkr3Q0PE9~Oak}Xf(V({0F(wzSsMgcvkhz)Zrp}Lgvg`BtL+_iD}vTneE +zhP(K^V1U!ISKfoCb$;y5M#WU!K)Kq}B3e-T!1k3<@gKb+G@W1~s#_h%V``n`*{O2<@Rt1*%Z#H&8oc;-Ezz +zdEc5Ud#rYKvOe(Idu1j@NK9@RF;Mpb@fjZHLlEY}Vb)15BUUw5CEESooMQO&qpAc8 +z=9HQQ{tUu+?>tFr>YTJzBvjRll^qd=0`_cy#7EeL;)dO+{q9H5^-U8S`#^S5U2qQ6 +z#yWH;UFbWk+4o(zm9ZIK=e^yk3_DZn +zM@&pt&$x+({`}#?$RB-FRU>2!XaMBYr~dKw%+f;L>HoT_efqF75{OUNY@1G3TB!#n +zh&X@#UYb{X97Hb|_H#0EXxV1d7c_WM<9{;C1!2NySN`e3&owcxq$JjlrH_At%3NO6 +zN!w$S6v@gA!GneDgJ=U#Y-blpzAk{x{N&2GBHY2Fod5)jKcYskaZ_7&)X$q@9PcnY +zMTFvvMs_y@<9GeSAc$AL|8cT=p6J<}d0f?#%sHkpMFzZW)j7~CRX1BvGdfd|czVGp +z`|-Vyvfme$&c~fBinB?!?zoMr^A0A63V81{4HWM^4bun-hNoJ)mSsLKbH^I_hxv)?0quhcc^=L?WEvI#-Ry#ENBD~=y>0hxxmxFEv=<2H{NG6N` +zO(fD0@`DCXNEVT(@#~@$GDCZ)PQK_sYg^2p@ZzOUXR0{Em}8nbh8NC-&y%=Ly3M7`EHlX +z7_<_KrdzY5is`w|y>BDi$iQXRvEWTjtC;*Q +zA+-~(UG4u|G6+JW0fP+ue%ZFX9?ni#V>@os?p5pc4^lo~*sNwb*@izK8Ty6gmw)3n +zG6f_Tb(#XpmhyNH(|_GNXlX8e)|2$>k=?UhyoVSh7B~h?Lj3$B$uZ848>uBRyf4qT +z(fNB=!gLr{qR*npWKDD)UihB=$f9s4cFZ%{dGal{GWJWtnIfWRdYSmBqg(xtaHucC +zGpB__zCt^`I-Ya(tr#bZ5d6javltHs^%;~;t=yl}L5J>2WZz9X=LPY`f`T8*keprL +zn_8>M_S3Ee`6iaP=rGGatlgD#HCcNBtzi*C8ffYgdWkHuX`u%oOqnq|XFRYmIF3NH +zDnLX|rqwq@-#&D0Phu19ih8m!&@rB`ynBj1^78+sKda55txpvW2W`pfxEzkZvT11S}4SAVm90CI89s|3uZH4~G +zyodf&RLK&}8$)J+tZt(*-GluBh1DFOW%Km2teL=y-dikCva4}5ps?6gu#!Fu(#yQ9 +zqwh^U+PQ=69}Yb8SxrBT`J} +zf8IyUn1mm8PVN_XpVHn#WZb^Y#&nlRXkOqw1|Zqe+&q}J{L@)(K2cEkJJhiR+FMX& +zl@ua}Bi&Hh5&?>33Yy?Sc<#sThr^Xgs%%yrCBv|Lj~C>Bpuh39^AsJPsBgax^o3Y_314CHNpPsd>L-z(Zo&m*773$*P5FZimTrj=u4nq=PW4>BsjSB +zd2yOK#GlpJO!gX{I#8@8q?p}Uq*J-RsS_jS%grl#IqJZ`&e!`YoO{fsqsqxF-b-iw22ZS{G=lGe2=n)qV`0czn8S`x|%7K>Q!4 +zR5#6gl0YXdYETh&Ekl$}Nol%0qfMp;N-=T{2$ho?Nbn-@LY(-v-dl_tfw}`}KW76a +zB9IhG=wuiYC2-6&;%D)?af??cfeSmz&+BNK*7H(W9D2P_K-Em&H@@M|P!A}Z3Sj8!C$lSf3xCbh$rueL`c)1_QM^*fE&}zO5y$Rv;x4U!+X-+_g%K>?s#Z +zZC47PL)mVdb&OWYPdBLvu5{NO23|gu)77S=D8)z&&_247y!*!aZR&rlq)W7P +zU~y@^zMlPg58%ob=GIMEFkF~^ILOF+C@Y{hd_9Qm5g;=BtxoavpB7_wR@O32oyWU) +zPh%ydz9?*w?sNZg{x_2eS!uNSeLZSvh +zopfRF{*MrwifoFTFZB78?7JO0=Q}M#ss9*6q?fuN>cuWMI-ZGOkko%&s{AO209Emt +zP30^CVha_g)|JJcSScsj9}Pw0*uOYh?$Au0F>Qr;*#13T>Qn)6D~(NAd?yYv7P=2; +zQ?n4W=sv&Y78U978h@X2BZz@^N%+S7!TS2Tljl8&S7(2w_?#F1QM{Q)f`udT%a{4{ +z6nN~HD)c^#biz?mb|dPe8l@?+3qwT;QTeSllYg!z$^Qw$7-~<_NNboqytnlz?leXb +zrY4^O`0tbydh&9@F9Ex2rRVS6gMZn8GVs@y(}#xvLeI&m6OS(>yGVGhm(RSVGs005 +z5)*xjpVQkqjzfc=^}Tub4{8NK(eVyXFIQJEN9)I6f;K7f`9MrAgswP$r)~Nk%$B?9 +zT@D=}8(gBLZaXIdzE0ii!|%yQZm> +zv%`Mhd;Bu%<9sm2F=0`}T~&}NBJ}VN@kJ4NpwB2w0R&XTZo_wW{D97VtUCC|S6L0% +zHI1#JCY-G+1!_nAeub&zJMVW*}0Y79VWeeAHKt%}SA%{mpyAeg8_&>?;OuM1iTdSRd +z8x#cCA(V^{=Zi#`Ib7}p)&G}j6GUX1A*FaK(tI0@Saq20N%5btxI-h-8Fmm8W8LDr +zRH5RJ{rr+8q~HOH2#BFo>lqmtBj1d3)IMw+OjiY8T_M1>9g}Y0U83lyhMPjw+rmFUC8ejqO|f94u4H0us{y#QMvifXBD*aIqwdE3px +zFocQCL!JLhY1+}Bj(2_8PWn%H=BZ%UXiCo4@#GB&<#AabU!G!y!QH-b*)6VRbvxf9 +zJ=hB9c0U>5VKW)LH935iQB+VO)RcQcj7-#kBllTCka{UOsuPo{}1p4R{ +za@hFa2n6WQ(VPv?pOh1ZcIhh4o-Ud!wYL1(cyzk-{p;tJ6ZaKA39&j8U?DV1m)nB+wfSCJ}bcc_HWIdc$fU@BDKNOPwwAm%&3^tdz&Xr +z@9QsOtoJlev4sFu=oe;;mH^A~X232%BQgxw9h_+bPoU7pgLo#HL8;s)p2hc~k9z$y +zIl3|S!ifx#Rc%NIzyPxF${D-(tlfLAa>bH&L-J<}*9mU`o=pb82x*u*Nl=1<;0l#$ +zD$DcHEXlBTW7Ms2XE5kN;|UWo>P60c`=I#_46TResOqB_*l&{NB5_~n`Y2EOT3Ja6 +zr;1t@IWhGQ;>^#xze#{)=6H)3=j{g#e1|3|4}AsYk-K777%8DjByoSpFa<}#&fN6B +zzt+hFf322h>Tx%{GGa781Veeys<0r5#k=G^pq`&P`v3`pUEp&xxxqgX^g<#yKA4^d +zlcRWocaN~!9iqtubZ_AwpQCO(?&*?aNY?B0MRr)=uK72SHF~{BVm>!BMm8i_A6At% +zkquCAixa)>X&e77dIpEx>vEee@wr<~)Aey*h5k3R8NgY(J}inA8zavzWp8iqSxt(G +ziFpjDEMJO?`|p)?+>ZvVvN;0AW89F8p|zCtslj9IuG;;gg@4aDpvzh(!O0rUu^a|B +zXXAO2%yLj|(SX2iGLS?As5TQY$oXFv6c(2!4YeuKh>{<$-O-m +zy8Ru|pTH)%=(0(!0V;6GoTuNqUUvrLX1BEHc7>A{5)75LTuPrWynEw6tRVE~_0?R$ +z8ArpXnu#PxDIr~ng4WS+&!D@c9lSwp7p*axqdI)XPf)LaEV=hv-M#5y#5(TQHE2m#gXlv+ +zp=Mo&!_FW=;_hg+OtobQ*I%(ibKh!$0VSO3AKdbTK4ACV=R$h%+GmpD1Q>)*ppg2d +zzP^5CVySk$l05G+VsKbkEHF=R!ufaT!@hPdI5+Osj2Q$EQETldnxrv&k&K9IJZO-q +znYZtYR9u2~=461;WYS+vr1aIrn; +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 +zAcf^}g|~b%zWrtM+{sl8*wtutnvw4BG +z_LuBV3QVPQb@j!Zs@0@ol0bR%_@p*~kucgaKC@BkYFojdow#V3SNpZ;kb^s*&uW+d +z%{7E(Y@*RfXJTRk?K2!x)RZBuX+mOS5Dq^M!CRZUc9 +zr`U5uIGW0Rqj()!o(0F46o)~+4O-GcLf?S}py&Kq09phZR`_y5zPa41fx%!2q`gX< +zu*Sv9B>2Qs=UIk5eG)CL2a&`FSPI?u+~)1ROR1>DYH|V${5_0iN`onQsA(g~V%%zS +z-f;iK3W6(;)5Ce->OE=6GYF3}8-VHtJ@Q;@IvbrrVEY3S`uO^|rYXImmR6yLQ6L8K +zV}ZRg(ZU$l{pu;sn`ojzaA>IkgpcA>PLqgTUI2pG7-2{=5R3wGJ!5cSG-@oF9xPg? +zd~vz3+E0DuU6fMy<1G?uZD>lWMlSgr8oR}2y=}O4cUg*?j?G=os +zHiZIgh{9A7p{CX6#=nZjjsLFr6_9jIX%u;RFxt}NYTM-(jjv|K{_It4y`oUs;ZXYQ +z<3|s$tNr!Q?-tF%7O83!Nfa@D!qhXUxog73`&;0as8ZDMmph{MF#rhZ_NBhxHG`!= +zPK)n-{%*a>lSh~W9T0MU2?WhL%amLIHlSDzEDDxrINJGGrdhRM +zqTwl0KO9@drT%a9sl68UC#7{OXan*xv@;-f*$oAK5)8sej%h8XN@4-VlTC9w;FEjo +zxZpG;1yUnCZ{#MM?>6{XXoK@M%;nu}uV45S2z08qioI=8Ofxj`+K(T3U6+%&AAQ}4 +z8eYUK_w9%Jr8WCKkCwjH^d)BqbBg4|1n#B}iI|z?cYTH>FUK*Nf@HAfxgSQw_V)H= +z+j_XbK_sx`avZ&*O^L?8-2r$Vvl%JM&mZwhMrosUH{HVnt9FkMteU8`jO7c+rdgr! +z_F>xfXATE3Hy-ygR_}eVFckQPUsGL_L`FCm8SHkes%4cO$!a-WmSHW*`GWStNu>WT +zLr-tHhn9+yblR(*?BH9rK8JA1J4_a7+*HuK@i>bmbK5JAj*6m$U~Ob@+z`okxB~U( +z`NcCMs;^#U2EuCo#!&9zLvLb4XZa9%lWH_S62p~-_wA^3FO7_{7q6ou?-inl9b-1` +zRrE<*JV~MC_=FQH&S=;Wg0_Uh+SBC<1sDh`~T+ye9ib +z08S}E^(rVRpyuLIiGlxF|FxjUM)=c^mZs)xX`HVle0dTGLl+C4X6}QDRRGqdK7d%C +z3f*2;K0EHFssO+AZ@}Xgg0R+OBoLGoPqvZ)umA+ZsL-mA6H~4(cT4-~>{k7V2B3Sn +zVy<`zH7k0<$pusm2B1vQX;;KoR}<@qKS^vWq{0JKLM7>?o;O&WahBfOapGo;w0vK#6Q6^1v{Si;*nH +z(Xd*I)dVNO7BYmjA`=0II`HtOP2UA5T21F-P~h+x!_%i~-Fs7|>2Y@Va>b}K4SV(i +zn8UhR?4Eu%;!KG_c-uq9VH`>ed%PTV)gS4;+e4Q=o|IHK+j7*7uBjChpmho8iyRl~ +za@n8nw$ +z8v1JJA}S5_?J^}O%2Sp{_pY93JDYbr)A7(KYJr;tqmem>*ao}V<|1+1B@YY@O{w?A +zzwy*)hSB?ea4Y6fjk$0c7M&q{c+>;}>O0ZsRj`EdRWg1@)9LNExR8V14OtocbM`e= +zeI6^yS{iOj?5`LOLte;CI) +z`D|e;agbHzVWDu|{Fy86-PYbKz1AvVP +zTwDUsCG+^__ebb<291X;jSqJzVp?@nHFY-=0ET((6YKeI&WcB)(YaXh$$H&t_!!~~ +zI7`-Kk2grle+C{Uv(u@c)#Z50vKJ#aE}EIBi8ss48yXlGtd}$%M9VyFer+)p{d|&3 +zP^MD=A>Df$-0sKx#nQyTW);fMQh>!m7Tee&>$INz?C`^CV!712@G#Krq1~JDB`SH` +zyiR5t;L56~%|c1lpb^Kj-zhYo>SS$HXTjZUs`7m6c)#~;ycj`Rr+N>(d{QvM)|%Ug +z3m#P*nn>wrOO*INMFuL|?rOJVGnnw?~0O-3VCEu-PrJVr05!HukQpjXFK96E{+zseDYv|{&Vfyl4{2UGYIh+(3L{yD)2s4ir@m*K;e +z4twSZH(neXtn)w@Nt;}=39ZQqT%AWUPV=0SGBZ&Ra>T*ieucI0m&gQJ9^1VI*Be%*xE<7cc0=V* +z{eQ7!?H_>TtI}`&T=juV9cj|NZt68zgBSL|>7RS{@f5f2Vf)Mk$LIx}`mO_(7bsOI +zUPLgAUUl1^iw?@t;qYj;wLp +z6fyjX%W>Y6M6NRlBVe)-sS5}!8iL$$=%U;~XRqkK>sIG@$HuUt!>hv}Tf^}6lhf;ypOS(+?fNmVe%2JFv&L2YN=>JOZ=J#E_6^PN@oU8{zhu>Ujdvg@6IPOdC}LRO1kQXT(147~M6b?iw~6osf`Fh1 +zX+pNLX|UDqYxQIeEc5+yvDvickD*r#sQG0ifgu*`=`s(OnBKH#!{bh;aGFJT3B=$9 +z{diAt@a>n%l~sV&uk#LZJv00Qx%gMwF3@?K`r}v~biOme*u+zb +zZv1F_N|f;BxRDN&GC@m_iDMeU`0h<772jT7FQ!e6^!bJ<4av|JIV-p_XPLhdpw{0D +zhn|GtGJp3q5o8l3l8uxhC%XGJ1xdz-$0xu+2#0P`#L>P{QdTwsa5%OVT;0j;{>!%7 +z6}fVGHiDFr&FX87v3SQBc7OBY^z<4w9BVxAllTz33&^bN5w#z)=;!ySk`of<${=wE +zf9vn>AIGR1Z>|0tVtohsP77#Se`6(8U%W-ckDf*;_6Ar@i5``p6uGz2mgFp}8k}@s +z34H>%TytSW1EtymO6G#|j0pfV-|VJ4&Cd~zfl+^7>6(l-L^_PV3wm?gPtgl&a~zbb +zvje~T^#Jxl>6_M)?fJh&4;eAQkT@%`3d}=JJTSP&c=x!vJ9T3Eb0=ke2I(Wy)1QKZ +zx^gDXs+YJokyddyVgSZ98#y0@MmiS(#B5muR3(`?)9D}b!9GCq!!ZnKjEfTVibjf} +zrhiTPbI8yt=X%)d_UcV4ZBO<6XGg+`>_#6!0SD*nTur64rJ_h5zyr7m^hFZ-EF_Nk{(jR@b(n=s%)eu{Z}G4R=thCrnUzjk)5 +z3uK-Dts=g)a&>Zz?HpTjDFb#h+Vq9W>4ArdTFd*N`pj-niHh8PF;z9U$XN~i{r3=7 +zas=a0c?9~_2{xLcfBwZ?1?J}{4S&_L^GW-amn}$;8E35LR#m;u#O*UK>-!=0rz-&t +zdO>ywQuM2eEsE{sFdv_fs~Vz-6~N9t@bd-cns;H`@cjS>D8P?>HNFTpZw9XjzHQ3;b_cg|9dup*RM`M5X2mbdUs^1I;N6CMTls}##Lp@ky1IM +zg(VG7aN-FkEJy%gb7j)D{fhLe*q0efAU=Krp5OgrHKRDP$PJy4r3&$$$Q(Q=FB$a6 +zKpnI_GE8=a!gmys2&_`~#pY=z&37y{L74$iQXD8_(8&WINc>+dfKD|R*bTzdP_lws +z3%@Lw#1L6_Cj+C?ByFz}1V_~hX;m#ep(+LN^=L3cXx2hiH55XfW*7!84N@7<2c4m^ +zw;k6rPrz-(hhbeHxW&>EObN6ExuQ&tvUeuN^_A@ +zZl=JZuUt5pRru-1h&6j(*4@DsxWgNoDM*!E77vo(_P@&48AK9uJ@UGJQP2Im=%)s! +zh4JaW7lmq*^@1xX`9bYeP`_l+nr +zr>{qhO=LZTT4SmKT2(3Bk3djgVsq|YxUS)T;|1afssgKxuGhbQ-U!Yk2ppm|1*o_h +zSOGHNV*ojNK)7o9z|X~Ya`xhZ#oLGbTpLjdpO{o8sz(_Glz(~Jg$X7EUidsZl`xp9nTtOjK0$Yu42w0PnC%zmNDUPos`c23(b{)4_XnQ6=bggAZa!IQTmx=X +zv=f_MbX?M7Vl#$;N%=?2&o$s=lL*<%E9hu)U#>PdMW@YrK4M1N08WXQV$IC}0qKON +z!HKD*Hl3ZFU=SjGWo6}h!8V7{FL{BWvCj&n4?Rt9&KnQcuTKVJc6JKF!r=|hwxTBX +zGR@3fvJH*0en$)q^u^1tw5WUjUf+Ck_SN0g%q~QSkx;;)Bf6hIyXN95)h~>6bbK{+U0B=rSM^t^xoD(ta8{gz^bPc>pEIkxS^f24 +zMXBed%tXt)>pV5FZ?l5DwBmG*%EWl@PBqeKse%HM3FihE(ri(vv0^vEhn-o?iS(O9 +ztnX*ty~EF)FvGxuoCdee7^0*1#+q|-RHq{3i?F(7LnGor;Rd;d@8DSlcj?Q^4MQ0v +z{m;4_+R8mrQUe^GLwR?6Rc`$REr;K8RS!NNG6}Y&u4Gx-bd=8FfXe|>%KHV*jtmbZgx$JvF#`~5S@m`tb2v5eQ +zrtaJFELu9o$YJl?=n6FA;o90qPvAJUb%VRENE_5EyuEUNJ4a=Mw}qK`uR +zn!NRxjG33ww+c)0l{0j(C`uU=naQ*{=uj%*aBUF`Pi!=$%>2hErwX~485mxnp~>JC +z5GB`7Oz~`yRaB1Rukdzh0J1ES5g~`HH>XUKQ{wg&9;&_VD@r<8N1vjjv%J4w36~*w +zcC|@|Qn9-EcgcHQzDd=}+kLmIui&W>lk1JVR?f1dFd34So4eD2IF*2_Dx+7U<{Ss( +zNP-W&&(9b4TraKdA*Qf17U8dV8ZOzo0;bU^DfHFVX9M%`iMZbK2<#T-J6RNU> +zjE%B(Z{YLlk;GjWP7e~-({ptVe*RQaR--dxVBmi-;9#Y-36> +z_~)kH5tSv!NjEwwUzQO3R`@kvYv*8NQ?UIwhI;M7x^%O>u@glg^ckQ`(Q&Jz?xV`V;52 +zq4LmyG(DA0u6TnPT$F^m@=I_ccp_{shSBIkym&tqA +zO9mX;pk%f&ZgOA|UTtYB_)unqa9wFX?>l{GEKvYsGq7dS3&B_LX>1YE*EhH(5EBml +zqp!P#q_-l!OTz!AfjgpR5u5Iu8oypYL%!9tR +znlYWJvEjV7J-7)oxH5!Zb;}XIpBiIshb>frWbTn7#&uq1GuO#rCCt?P{^v+~j&|h5 +zB&C(-k8T((KCW##H<{F*NhP^Yhw_MD;__mDqMtdM^jFfXra$L3i_goYCjuNDhYzI> +z=hqCXJEHTB2ym$^PSCv8jnOFd{4MirB0qgH^cqcF8AW4YVOCcBijPC_8>vrII=ZFn +z2N^CQ;g?MV9S7ByrB^hzpgPW2!yoU{r=EJYe6GLj9dYB~wj0KW9c+Z!M;6C9HI7u3CCjWjKaC*Fs9FrdfVYCp +zf4=jpV3_|Yr_@U$SVl(mJBj0$~=nWTFMb)w)lyLj*3cJ6v@2slw1!+3}=5U +z_rgO3(7xU#jP;}Z7#?NeKXE|qE{v-l<$ +zQ%H3KT}mmqw%xqvAZnz4KjHl=z3^r`>jq(7>*D?x2Tlg17=ogafdIjro$-YP4c298(2sDkrD{u?@D??hcwj*+jzr0YK{E+P%M#OuY@MgRrA_q~gH=;YhhZ~aKt$K`w-Mh~X<+vUqzmaEf~50O +z+pTq3+C$$KCh8;gnVCxq;?_FF!Wt2C;DjZH)yL}8tGQKGufo3?jnOQ9U6FLBogD1l +z(ezi1hJz1Mm+@hBgh|^Ob#W0As-VOaF)%ZW!w)4(#aWiIAdeI)XEtWML_VdgnYi%w +zo_ZPAA&Q8D46n~t{+V?zENo4^EzBbO&0!k9v$o8vSbEVV^+}tDhr3Vh1 +zJC9-an+B)JR^f01tTblZ>)%u$qa^g>3wMzdsL4?HpTNDg$;S=fRPR#jd;2zx45Y-5 +ze+&u61aGF%os_i7IpR1_#n^s++)_F$U<4^kqtY|WtX@b^FVXO#EYOaCppik27b3n7(#LAw@aN# +z-L7Trd5`jE6}soXp{0AtQ{;q1k_waGxR!A!-*R<*K7flNdX4j{o~iD@Aam03YwB!n +zW#v7D^OjC2!7aly>TABeVc!9r8qyZ!qCN^JPayWw%JgqUfSzAI_+t%Pd*J?xgG3G4wAx$$fZZpZ(?4SB{})eZ85Y$W?d_SN +zK|&g738h;~Qt1?l0S4(tQo05el}5TjI*0C7y1PpnhEC~s^FQaj-{u=!*X()rde*vs +z_lll&vSxfoV3fs~T3v0kPdUOR7xg;G!YAmnkKlvk(~Ms$(fS#PkPi2;vK6orh;oYe +z`uAsrFc}9iS?b2#yD@V@G@&w0jn61X4BzP`$@5JD0i0buzX9SkGB# +zv)G?B=T+U~yy&5n>L`|BX(FAnel{@Wo29n;p*(3-w%EQ2$-?r6bRpZKT3r_fA9tbp +zhZ~|en7P2F?{hIv^`yYbf&YD0!hT7mPZG$+1 +z{y+g7{W=q)0idx3+Hv5ne{cm+Z)N#nI$R^KI>wcV2jsEW`qYVu<9AiW?JGH5Ubu9- +zYD5ne8tQJY8v*iSF`&;VRu*42j1tpi2m~-VJ#>9|&9a0z6{mBPSRR +z5XoX>9tDL3qhFN{i*GDc5W_%7s +zB_#m{4t$=>QR?KIr}lefVrL1TzlY4~*L#KCo~FC^5JiZwKO$`JvSbSa9k%gASy4w| +zcB|9NK3u>UkG*x?i|y*}(7&`TuoE+*4QQs%XqW0T^e=fDqF)?xH6GT4(B!$2orVyj +z222Pp>oEh2R7lhPT#<&3&I|upQ+(lz1XJSMRU*R4J3`8$kg(gm%Hj1iG@K28Lm&Fa +z!;2RbykW5zjg@r^HpK1CR;JCX!)S2Y4f4HsE)QVF|PobK%oUqcZw5U#zIHuZ} +zuPt40oi?c0h|@1LCuu|L;g92EmgO)vPK0Oly +z%3q2H_0$i&;(sNtXH%#rU?5GSGlUk&T3Y-rQkp@smr3Jy;TC)I_D)h9)6>z=cEsP! +zJ{0h^tNDA6h*QUCSKOnlIOZE9dj_z&nhh~9^t``?@N`$@`Yr81ItB@-;K0eZnURT+ +zwak0b$y1`VOcM%BZ9x2MppYcZp7*O=$!OEMWz`4fGC5O@Xag*^kc4AFy|WyhuEl9lg0mFWki~o+%Dy`E$-U|Nuo8=^(lRa*m{>O?4-suM53q;YvC@x +zA0LmZ*=BLkMq18Yq6mcDVK#myJg9HWO-z1j_0tNxP(TnfMEy+4^j?p8h#V!& +zhiH#>2(Wj;7fJ7K{u%yZHPF(^nl*QNa0Tu6`P88#3UZd$U5Vhlv^7zMYBe*xOAxi~ +zWZf~EsOLqAKg0c@;gws1kOI%`w0ocF%3;MYUm6v+nnjf$3aoQe1#uAiFV-O0(5e6r +z_9?4C5~@0M#>65E2~N)FnL22oag}rAoYpc!>P|OZC7;b~`Tt%>pB8}xzn*RlPgDK@ +z5+X(V^seW@$@VW%svW-!NU~6;t`VdMX`KS-!}~T^nNh%Fm~Qd;H=N|F`8mBKA(6$Y18TcXB!1Su67y5>WlFtQq1ik8V1n2CqP1~ +zAL#x+azG<%|5Rrm;H`cA4_><8_PO6Kd0vVo^7tkV{q4yLk1BYd*BdVSh3ai~&8`Ml+E4Z`CHi*q!r}$vIb(su_*(!0 +z6KW+cnp*Ee+e+u+Y6Z+ZDMC`J+us|*A=(W`d>B-Tbh#q_ipHg2?Z8wd3(}L5@{#ce=+^`7r4fP;%zutRh9mUod +z9ZehEr!Zjy!sj{%9lA>8swM#g^nCVSg%Bz_G-B{1bQjLN$`~L}+{v+~lG-_nya)~9 +zJWl&^eW`tfqGv#umL?|8y&fHO2~uA8!tx-UmCF?5=ImvDMTC3Y(4QTWTvW8b154D! +z*ETFpJX093RC0&G36wR_kW<^Pw&q;5|Za^HA0hT3UDdSk`^k$Ki+c|t52Zn7e`9csczz#TjG)29-S6$HT +zI1L)A^h=M$eXn}}DuNjHd2!(qlFq}P6n%g1UT=LLRsleHy;oc5rRfikJ5rd{5}z;o +z-jpnOA3}uB%HEh?hwAcrPdyRdoH56gh +zF)h!g{Qfkx+(|O<#(u-u`YDRabNyY#WzSFNcF(Q81crzx&r|!zCa(|-EFDlHP +zyR6qX@);sxTJQE9oPi)vzu^Tic51P1c|s*58E{-;-oHK(troSgQ0;uwj`4^nf6X?A +zFS3<3F~11ANly7RroijDt2H)K_hC&~=e|k$<}sdihFms0FmP<$;h1u0_7?CQaSD8kX~S>!U|v+FHL-d>ZRogzV^ +zeAOJD8EsCSM4VeF&Bf`{KmMN88{QbjRM%H9Lfd;o`)7s(<_+*W7BX>GewzqkRM_xRO3$M8bcEzuk!iVN9y&boTsXq>WdA`f>Yt;L7k_h*@>*GZpR3EUX +z94d6pi(qpfNmDgAZvmpqEY^3Q-h#z-7I%0>0erf5a4_~onnxzXIMxi01DCg4SA>MF +zv)5(Z`nnm%@rs_FS3?RA^1wC#b*=lu=r5OR)lGG;z=~yzB?gs>0Iclec~?C>aecLf +zLEDpga}dqKcwi%fm;dji$YGsU=honZ_qkU6->$2%MjbU_0G6Jdyg2FSJdX(Je4_rl +z!V4fL`yL7VtF<9fwi!-Xl|0@vF+BrWozlT*>-P`z`0NeK{s#bWlre&x(0p`T>3orx +z*Z&4zjNLn&Du+US%~Xc7`Aoy}Zy=f3!)VsV0RU*tPQ%#9?v~M<2L)Wr`eIn-biBM8 +zfUL*q>G>hG+rm4G;TGAr=DRp{Se;~=pI7;lrE7N;L^76NMqxowbVY??Ab;BvB}R(( +zn}ngN8=%-HQsPdJXLr2yXVwKpvp1S0lproT +z*J?g>Zy1BTgL4RRvbj9pHUGBi7s;0>?X!iz3=OoB`k(bvm499h#t|ZN?|nv{;Y_6s +zC6h>&U$A@clIWnoxz3&&a2*M7U5eI}|ApQI!d|xF(v(eCIE_zh_kxEQctR_`)iB%Z +zQz)j+!}NVY@f}XpZbW_cz!2Nc#lhfKM<1ga%{dkP2hq?oLRKWnUD5Q+%x#iWPvTcb +z8^D(3d_Z6Jy-WoXkzaqu5K{pW4!`=N&n{>}e(W@6Dq7u0_8S!^Oh; +z1N}PnmVc{C!hgT6P436d3}!Q?i@wZJ)-Ju4$u$s=Y58~SlIXqfda~~>(IbJV(?qo1 +zdsVah-R}5reDj>{1*+)6scFCw)03?bP3(wB6*QC$Uy!>$Up?iuUl6MQo2zfOhh=K+ +zYnpnyM*A@GR^m4OX!=b=WXS!YPp`aM^kZxbOwohN{cxBWvJp=rQ6MVdRGYo38VXOm%bKHyc5A4AIJAc^FYcffwtC0%|3dHSkI*z#t>?9;2DvJCT*G9$j<<7-N +z!3)j}Q=9BdOf5JHoFo#;1p9r!p(3?{>Fum78Rq^U3xI!=$-}&Y{R5I%m&M%mzNl)- +zuzSqFW1zCBNduYOkS*Tf3bF5SZ1{G=iBD+7iG!%Di!vbX&rq5};f@~Zo~&J`S_lg1 +z@AFki^D?tRH{x(0q%GBc?;uSx_2;@7-hU2ytufVAPet?vYi3n-ueiBouUnu2V_=+8 +zuFzE<*jb*^4TE4Mp(oNGyIMv+W@D_hK}F1n4DE{NpAeso;*6e)<8eFSFTIiDNDg8d +zX@I;gqsL*@mMZ?zZV&A#LoE8ubMX4kX(g#+=q%m-CPWk4<%iHhfBy>;2pK4W9)qfZ +zRRD$@#y~6Ad6gy4n)y9lMfDo6vX03zmG50}u+n;8KeP4TCcwC}FvuMgnYKPGHJ(f* +zD+z#~+SfMjiAx8cI0Lp2RV^|dhsO0NCH|)b_9{*N6z$cXC +zw9!QXlhPU{reL7>m|OxB1sS(@WBnTor$e^r3X-CcUx6}U+Yy5ajNj^QcD;(;Ta5Es +zBmpJ7udnFqoXXttQsu~X7Smp;xoel!b<-td?JS2j4|?2EbPuR<2>7*pTl +zB=ZIu3{xunZF`=Kh~>hal~9pXPVm#MO4W+Ssj2CmtCpn9TZFB1_xU9H#`SYf;taDi +z5Ze~>ix-Nfe?$VU9~P$9k=MOu$fT*K99^FqKDf41$0JEUmf?x2kYf-qamLwB=(l`p +zA+8}JWGu~)ygobFcellxumlu5>WcIK!+lp}!Y5^(G%KO3Y%${_-?%prep~AMD4W}c +zjs|$W1^mBi26*QPQu=k=xN@(J8KcLSAl|HGYH%l#%BMfI{3 +z#Y|~w7X?Bu`Nc!s33jjiaHQ?lhczy(&$-Z1$DQogp_L`W&ru+9ikcAk;8F64TsSPn8E +z+2gcn*co5k5bg^JxkT=+GJxN$a`w_GY0!YUIKxj^1+c@0WMW;9+aO}{Hg8evf>h96 +zHDh^Jy|Oj0ezHA1pUy*u`GSa}05n2a3yUJ-@!#A()4EgapBSs>(ScTFeC^G|AnmOu +z8rqqvLr#fD08Q0v74xm?B6tYJAG92f+EzEw3KW1>)B$+5vsVfKR2P2E2czIN>&}NN +z2OzZI58W)T(#~}Ev@iO1a_dSe6|hD#0^(9^X4<*qW{)V0{C`?A(|8W9gy#A8@tuO +zw&@|?sCuI1?`Zu@v&QV~-z7B+e6!B_d*iOJy~6035`Mmw7%cYKAi1UqGN&@T+GU3X +zfpB$|kXj7I;m{>mCgp-o0Q>4Q12?U%7hRE03ZUn3&ZV^nK1&YtF2}#9R8DAJGFp}8 +zuQJ~y7VEbTrBhGpibtRM+PGM-hBnkNr@s|L3XDeBVq0rX&T+Nw{D~zx){`ukjn>34 +zav#CW25*UZa)=EsTUrap9f$-v0Jck#gyxIHu%+)DwAfVZ~JkkE?UV+V1 +zA_g6mMn(G+_vY4cOF9Yf|LzZcUD&yex-kkL`*B?!$twpG4o=>)iw+Co*JvIq5W7|9 +zUdyZ!GozA0LR)4U2;grh*82-tgfnM=ja)L0*M^JMfwyV@Z|}pn6KBKE@o`}qwD4^Q +zzZ>uBS6~npmXn5-Zb5l23rnxfAi#xc;yk090|ugi7c8fyM%83WpzkZz7J%=ZW6${B +z*g1wUk`m1P`ueRXsLn(Sq4yX4Y(Ga5Y-TiTaJ8gIFc+?UY!Fg0A+jex_3v7YuTWKjuGj)L?p}%BCole0NTvl4N&~;@g8>Zzrc` +zYQ4*KKM4hOKfL3(l4%JoUDBZ323k#Xm@wnJHCLm7P9xV96jlB +zBWFAp3=r776pfhf#$2TZ0EDg$G0?$RXH^pxh$84KHr66yJZkPNBBZ5wafBHCA2wgm +zF(>`gwsakk5u^u77wx0)Wh!K7P~Q)Y&f@Uq;$W6tHtG&!H7nXSy5*+iQ!u +z6epspN8DB%?cZxqa17<|xd`*htb_HTq#)53_Lc2+oCP=_$gMg~RB-`NyXylQ3A08C +zJ1*~APxoJ;#5u3)oVGU84sBNO>i$_>Z8`S_ZuRNTXHa6wf6c+k^4^MGl$8{SpbDXc!q^$$XzNC5dyAFd{nNbs +ztm}WXX!EU**ix;bD2mJXYq*;(=w7*7d>eL+y;P8X_tibQzdqBwd*SUFxN@U81Suak4I+4;NoglZe-ME-|Hswb4 +zI-6Kd&PgZFRDr@|JGzKK@7L&=3J +zKah_0#^oK|owkdrp!iJ$&&8~__@T8kJxGE@N-DjTY{9h=CT5!}Wx?I*Xt##|&dW-q +zKs61+dtg{QGOwePTvG%e-RDpY0ck5kqEj@j9$>=XHmT^XDH3KUzk +z^#W{$!jA~85VBL(uyXj1;sJg%@{%{Y?{cQp<9|)IGvlcwgL{x0U^h{k!sFX81!Y7hRHBLeJc()5X7in-Hvn%WP$0j&MHPqzuzOx4GC2eP +zTTg6sUeENyO=&2Nm|h&a?sJCAMYTd3o9xU?X{4%nrCB-5=eX1PD)u4L|G~R}%6I*# +z*8(t2&sCRM_|PgYcE=M9vUJkT;Sw(`NXzQ)=yMth-pD9kFg-q*{x$KWMC_Kwzl|;u +zO{fu-A5O*ng(-eIh|7EsL<WD^qn_h +z87g=AS;-KaI`s{|E`e)W4#~6r;2eU4&J*2t1`Iq%8Tuj0H+ly8MUq`tL+A0w{<^7o +z-39s%3W@j?Y(?2}q^|6O6W?LUI@!myl8v@dO0aYB^Z`_*>OG7VIbC9_Shc3lw(wJy907{xl>7;BI8vb{cDd6?gT3EF!JR~R4G-$1Z +zHECK?1Fh}T>AGIW;H#yzKI9Y{f1?Hy^!+R);B#$bG?6<6j!Edp_5%Dd0;Vn-}@WOSGg$s~sc>TH*0!S2YRBGq4IGTu|<~9X+lc(2-XY}gp +z{1gdeL>x2C1OX2TA*CLa^&GbaDxZPb_6IW48o`AiMl!_dVY24sl`>**zXcTbYKB8& +zeImY2F`m0i{UQb~Ig0QX=^I?Se`#vXGWrDQXyg~2+rE*juC!zq!#IA}N2FF0ZljwS +z_%M+wu~$m+RSS)ZeOPlsPM%NeN{*&Y6Gjud-VcS5hY2lFauwj?KBJsuMHY`qip6QM +z=e#~MGUUIn%2f>*-+wV(&=uH4NY-fVGlis~GBVzH&AXDxVn4$V^s{^#XUM^i73E6Q +zJlwbt1Xq9&3DN`k-1yO&taAI@1Qr5&?8lT4b`p@%Rv%FYQmH+JJ3yZ}rqQbS+c;{5m8iUUBErv<=_ROSyBbRbL*`Z~0O;!AgxZe3hQ(^c>_XeJI +zHo;ipuh9GRu=PeYLKNton-2-N +z(ID@TyN-HtwW|&Z{=h~D5BfD2fPSYDhn5e<4jM*n0P$H4PG*ZcIboMW2YC6$?p#)V +zbPB(&rFKS72bi%(iPNb(CDWN}b>P~M@PwEmnu5j^i0(Q%3mfhGzsj}<^)a@h#W_)B +z8}DmTM-fgy2CtSv8{yoE`nBq{rs+s_r19PMI<*oJ)8vGL-rTph3REHH8m@hPBQB;U +zCONrr|EAenb7sl>cfXjKFjJRBRVPe09aQaN8yFP9cL<+7CDhec=>VexJN`KMh~`GTVCq`W3X;3qIcCpq&c +z#owXFP3LsJ_BFV>%)9Is#orlUL3ws4`(e`3pBY~;SxIo7vaIxaLv_Kt(`AJw0%(o_ +z6kD9w1X)V5UP(h_zs +z-dZ>CH%m~0Bathj4R7Q$M2Q#?p!qC`bY(R;WqW#wI;4n`dn?2LP1hp%plk>l>E(=< +z%2M=ZEx$L>b7L(us?kxhR+hm9YnEjVJw5unn+yBRq5k98$w|L{R)XQVCMJss2n?F( +zYhft +z{M_KS0Zyc_#Q^#F7>N1Nq-JQIDTXYrd?e{(9uxXQ!dof!Wc^aibm(UwI(RbK7@QeC +zfFV_0;g_1@cgfm#&dl(2ye- +zuL8u(9yw5Cj)iA((WGDmgCxXJ$m$?C)Y;ZD?uD^!u-}u!V)xc{tZIbF;Qm7`)Qxu$ +z=rs9mj&GYyb}K|f{<|~AG^Oz+X>F7S%>6y_*gtn`nVbes5gc}>Bv9!W)6F&Z!VdNZ +zUV8gA1vivpK`t$gUjnZ%E)GlJIIxOWmK3gAyxjuzGS85^>|^3WT<%BaW9>9p2l_ +zQS4*ODK3_#<<3V;3fSzQ$0Zoko`(3u*&r~s6!)i)B{#vHr0-Y(OGL|ma$z9L?}p4wX=D#Fv2m=n11BU^=#TwV@ks06lPj{`^h0z9E)v?mo$p;Biou|Ah&|*7S{|M46k!J&o-pNG@68Q +zAxYwPB0QA1GNO888{$D9BAyr~lE#PrSeG!{a>a^G5Y@KpnnHc6=k1)T_k5JHpZVsX +z>i5Q!ZY)?_F^RueKM$V-^j3vR%a98RZ{JgXs74{+yQI#yVJ`_a8xiK`K|`GHRkJ6I7=4Rco1F`EQ-Gz5}_ +zd=-S#(rpFGu7tkjk)#p)#|g$e!fP03zYW?t#37GFQhjkXACw|EcI*z_|FsG;aBEa-c+O^4h^NF^g*@T)6;Fg@kBN +zc~vAg9P28*Qz&4j7$YD2WH@E;NiW$je@d@7j?;o5l3oFCa7$Hhx9E6=h-?*_ii4ReiX<*^<|YE_wkE(T3B(G0%Pm#MOI%Nsa*c+rE;Q11cIIrQ`1M<|^9DRid*q +zroNF}#;|Kqc9D#Z2-Dmbs$c%95&Z`w<~7}sd3A~Q%4U0ji|{5i{O?~#gZHmR{1^&r +zuh-qjZD8($jR0>QLNuJl%V(}PyTzk0@7LVM!_Cvt5>6VjUX{r5Msb~zbK6J?tIm(F +zfeIVYE2szT?%LD?+JgDl1wxrUw8BD@9(Qn=U8O=*%nI+~Gz0?rk))`Oa6!l@Ja~VvT<+Z$+ +zYzBmIM<`3z>I$jKqDvt^d{$JG}eT_g8M8I<$B5WKP;K)hDMBg+B6x% +ziqD1tekxAh+_mJ%uH2&RvJ*f14`^{29;7K0ykbIf9uUuUFf~qUX`k;jDa-MW}2ZUdsrB<8eb423iYo@NHVum0-VuY`lZ2V^D+8X +zW~{>VSoGdL`RTD&ub~-E%|emqlY$&}akKHJ9^7D$OcJMTs_x}p4jQ2{2aquGf|=#y +zz*ZWT0^#=VeH|3w>fP;R_1&A}II|rXOSfw-cm1aurjy5h6qV~yrL3+4iZ%1bO2^16 +z072*hBqVIW_}C?ROQ;7`d21k%AxK4SdY<|vDjufW>v|~*Oc?5`z*i(tz%~9j{>2W4 +zTUgR|fs*(yll_NNgx@o(rLhCMhsH7V3>HCzQRkqBx+5=2b;wu8wQ$Pyx!YC4Nxn}4 +zd_4TDK3dTq`QMj7;aFumQH!8AfigL}&yhyxN1(JOSISg02lWSWKX=tlGy=l4A30A) +zAZJ2xLXzyZcvc{N*R4VNg2+-v>^KE>C+y!rSWzhn`TnMN3`6*i=1ZWLNINS#b@^ip +z4jFtxl&5MtZ0@T_(b_Vod=jdWv|-(sLYe5KEFPW)@m0+7Y~e_k@^Gm9PIoN6(+KJS +zN)tTU)+`=vHIc6jXV0|#jCuJl)R1(Myc*Q_O%=Nf8*Zv6L1YX(q@q+a$cBnCOV`(6hX}#LFZJEe*XzoZ?<#prpiR8glof+} +zv_ogJQ_y=8#SBuxLG)Z$NtAO5mN)P-im6V=8~H^8W$L{D^(Zb5A3h;u5x6*&)P?=0 +zESAK42{JPgP5`3Jz<~ef{!ow9Cbj#*uee@``{Rg{jd;Ud6{W+a<_!QXiLa`{oyDX! +zBQ$jdh9-S;)wVeq8Is+z4y|`{ffH^oCc+*QZCQ0wt{pFd7UgvBvWMQFj@e74jW$geohdU>;)nu&rVVBlPU*Z23#m&h@zM(kSrWU(HlfPWKLA8UaX3D +zEA*UAGPdT +zh9`OF$>erioH*WJYT5|!a?#<2ke42(xo8b$(U`iHKyt}6%BH5K1oH!Nr?t0Ol_g?h +zCv5^z`RhDQGG3MdVje_R{)w(PCp2`(Is#yj<0} +z%r6SiMw5NMugMd>bu(}vHCV_%Qcf$F_`oWaEA--W8f59G2LtZfM6l#D4S|%1UY(Qi +zdBdrR*825PXPd?KC5oAns;Uj?VS*u)T}!|fJDd|erv94u{uQ>l0Z1htoba7s$ZMzt +z1@W5LNSvnB+AxzvF}9s*BkFipVfA7M;4%oMRxYGj~<> +zNu<4SMudbC*Oqrl!2m`A>NAXUn)nf8?3(iL0y}ZAhR$_5K~4&c~T*ac2lJZ~%KJRT=Sxz5*0yqikO?ZEQpU2@ynDllJu +z?CQ^V{imKaV!&RZ2@(JaA|$IPi*)*D%1zAycPOQ+Kv!L8IHqFDu*!u{U?8qG9cn^X%yum +zpyXJ{g@|oNCjbgind`TvLoa^)6l^CN=}z%F@3FFol|?~-LD8q+(Wnz_m67#T#Q-bz +zNGPYkHv#dMS*8e1Ne=D5>m7_NrNtATUi}M>soc|2D&}tFM1bUJ)hre8scJm5;(Y=Z +z0#vOoG@J?l9}Dm*?Y}%02QjAX6B=zrIv2n$xct)0c^m-f@NH8j-pNrjJzDr*1KN?t +zO%m2qGk@?zi)UG#U0kY%sJH(5^@ov@;?X^NHsgwmajlP=U!2fxJ!(cd>!33EMee}r +zhk|*7G9&((NL>w$OgKeoGUUcF36fj{+K>kvg%4J`QGifD?NQLTA9aY@B3I^i@}(c( +zj~{Nr@B{&u`PK5neO`J%UbfrO6Y`5=D|05QAj+ +zar2aBSEeEF0pu@Uq(SlXNLgl>3FF-xwA%X)G^o)p#b6lLbs;ssm%6= +zqvM@zQFNFgrgrRzy2Sg3bdWB4R|=9n2d}AIF}jm<+L*l%rgrDzbzO>q_;dSPa{4x+%bPs(0{HoE1@F}|SfIYxBaL0zT4QPjQ6{HfBGAPSJ0^S*lb5LR-}EhEFuPnG$g^RO`JbC3)K8g_DoDB2r|Ae(B +z^NoP>SH`wKc8~$A0~;J9L%E8!R^=0O^XIo3ojM)0{$$6V%pe{bc(rlk(mv~&LjmSCvPEQ +zNwcqBn>IDUT{ILAKO(N}oW5^Tz;)#LCX9gNv7il57M1kagXiwxId-x%iJ2F{6iv*~Uw{;giai!@R@A +z@#&q!wD|)?$a|R_7;28Z2CC9i@=iE)s97lNr8YZBi~&zgB+4uF(7?}Mzu2({>`A^f +zrGM9szAj%wulP2(blV!cyt#|=5?fwAMUIywrv7xR@vb_((=MpG +zLAnfG-uMpfEG^&oq-~vgT>aeuqa{HUwI(llNfzWATg1rd_R_q-lIE|9v3{gmUdaRw +zY~4&3ruh$Jrqn)DcTfpyi&sP)BI2FYyk8i;gOPvq8NT#U%WBP`?>wiy{o+3o8b&R8 +z&$F(sc10JNs91np#^IfGZ@E7&#h?5GiYxVAME*8DnfAY%{&RIP2y8^Ef0?w@b)zxw +z1_XFK({@E{QEARGL4)HD{Q|=S1E`<8z?%+3Jw5Ua?;%EB)^~v-vo)sRk+YUPB-h8c +zl8Oy}8dNTCaY7fH^Vi0;QK$k43{Mg(v&XhPB7dc#9iixERG&?!2!cI1l>*E+e~0pTxx2m+^xa~ +z8^Ys(EgH!pWN`l1ugL{s;e9P_#<}5hwFw&PF8BFbG0%NI5nInl&VhoAXc!gcRNDsT +zlx=7o*&PcPD&ST(OZqxfKR;V+CCRZzfE~D$gTH-4Z`>I~(7O#UCE3c#$w4Yo@xv1p +z4ff8Sx>Bv6?ayZB-lah7F2nzAQ+%SDA}j>( +zP4%L$m|c(Ew3FX_t*`!{dcamy^jELwAlmm{;x6x@>MFSOUoe+Qjp1HU%gQ?swOWyX +zCZ#&VMNjjedK_TFRlAI@S|$E{k=Rb7E1AM!X^j|`8w?eXZEjvnQow!=|9hRdg7Gci +zAk<9~cV!~!YXh0}PwJfERnQA29@~SL!A9FvrmTVLT=H~t+Qs=F=jR)LYV5ecd0We1 +zHj-SbZnkg6x6zF(k{FLb-&W+3iTo?a&PgNlWwL8TJ_I9x>`u8@g*K7qJKK`^^ZYWo +z?_ +zI^vZ(A(e(;2-6#mUF9R7d(BV&u($DchivZcP3&z`Q%3@h5Gm4eBrGlV&!`16My#{v +zM+TV3ezRB;qa&?WwuQguu*b!D!3Qu3rXO+Chuajp57DKE@4xN&pEVw5B?5DE89TVjXS_kD&}Y>Q&e +z4|j+7fziBI2FvFL$Ms%p)>XSNbLuw|l9NNY0`E<4m0Hh~2CHqSSJT1l)f4AnM)L`) +z%kfWC+pY$9(aZnBmjB6g0-{1j^Ei_epOz8v^ebe&03^a2H6a45N`V_wXm}NC=($9H +zwJqmg>3K8nU+f8h??59_O%~Zjz3CQJ|6Wz~ +zoHg0tGQX76>vs~6+l7DztUmFD@l~V?Xkk8~U=nIZ7sJ4EX3dZ1nZ-#9T^= +zk>jp0Odqdb+9*+zS8_U3sljgTX{T(eOQu#rrIAt8(9rl0zL2FVnaG +zZ@cm9WG}bf<3z<$OCvLnGS6<&rKQ_{qDxP2daICIcOhqRvi!&^ctGKI-@i|RPl4UV +zX~!P2D^2v#!o$P21H*4|V~$57{P>@E76y{(M+9ybbxbI%6M~w&E!gs6Bpq +zczh1uY0huPv7eTLAC+|DAuixLEdUXK7+RrLh~tLB-x{8b +zx8(|DBivI(SrjLv9oJnHEeloQ9c12-nQ>2_fS))<4pmH{^NZi?rGoN537*&6D(#>e +zVBzn3wZq=med9#%3nD)37CKvxnQ}^s^72k-L36&<7?X2$-+1{ +z?(ROCS_33%lL4B$DVq&R^(jG~CR;Prh$yd~x7pzKl3#WqFI|Jzj>*f3DJ<0aVE!Zh +z{p_UN0{o-%&+X!;elyYWM9B;8dBLBP-vslS>o!{#cKc1K{%O&{wd_)4$Lu^FTg%7F +zfhx}phi`$Opy&=~d&>^0SQ>DlF1#70;bSnT^*>CNco*j1G9p2G{!dO6Lc&YCfAe1F +za{KMdYdXF#&+L4jtE+zhE3WT3O-{(E6501>HP}0+5&pMpgKQs;gW+;p1H-@(xxPPN +zn{0U7Y54jt@hrN`9q;)7N^;CQR;G>9ZvWeE6#IaU?-I9vt(<=MUOb+|#HuwDS`rT@ +zTn{I5TNabC6POd2KE1MZ^rw8oOX1fYwml`YlnlzzZAxV1#vC=TX9l>xm;2X5P6@8P*7N6I!!c$sLyUa7pVJWkb +zB)a!$DQhA;uk04c`uXr?G)mUZVzmSX)9~67*1XwBftZ--7I_}@(6mvzJ0jN-pjs{L +zaQ*G;_K-1e((U=dsIGh0uKCH;cZoZMe0<44g<*w%&F=3*(g5tl^LpU5R)z^z-u>{3 +z-@mLfZTX#MXX{z~y#^ql8o%8ezPCG_c(0aPw=(>2JKXJ`P|Tul?HC%jg#F5e`{F7n +z{a?@~*L`QJM-%F@v{!H)Xj +z?)9}RneE#l1c&kv*M;jQnLDcAy2Hc%=Dx&*=`Rt;GsD%8hALwJRuC!t=Mbie;(Syy +z0$XlY1L*AV2Uxiovlww8S@}LEj$yub20`G8Bop8M{5b24tyTxUr})&YUwI1l*hN0s +z(rBof2UUP(Jav^=3`l%#J +z9 +z(-#z{{HsYV3ngL@3v=h0_3N|(<>PZmPE``cN54$d+xPURop-hSRr;6B@9l4_`IhFn(R0pDp^G+Y +z4Svdx6XoRZZN>n!o@mj@+*!0WwdwPU~UrLC&41$q$i~N=!^zFY4ZHyg!o_bEE)|u +zdHeAURWEDa7KfN}k>`Gv9W*g?ko16LCdqayq~<6F#|nJD-&QFkv#>nA&{K|@aHVNH +z4HizQ(cY;wseL=zBtBkpu6ZgV+B&nhci^r+QRUAe$>G{mTPg@&5~wJ(&V?k)?H-+V +zKx>(TEu+1ER&P1kcFb=U4|HZ)P}lo2)t-l +zaRht7FWcT;KgVQIOrIG32_MwF{u&Ux-Y;57(#=_bgw1cajW|gx=V!t6f;1J>qu%Up +zF5Q2au!DdVmu?B=k@#738QE{8{AF?_+B!ijyC`==Gbmq%RL+N!@~x?~+sR+(TGxGy +zrdCY)q%o44#*KX1DXCcGU#oKi=2|ITR3hRp!q-g3vU&-h_|wvIuRb+*o;Ev%W|b4o +z5}7?Pmp6RdSRLa^CNSw3(GhO?ajMlKnPjK^12#zc*ag3tt_(vJF{{^c7k$r8Glk8F +z(|YmgFaLZxToajL=f%=CJN04Ur!9WYC*y)0iR$TQv1V?vq@ZIB2c+i?Yf_1x%FR<3 +z$0a|SV$6vK|GDrw4ET8DbxJ{7+maYshEa=t^!zxH^_aDz=94hIRSF}$4L_N=(*?V# +z`@fZrQ(4a*Qd~P|E3fhsHTH+}et8c3hSlmb95GP<=cjw?M-tvvM%t~0ZLR>!^+Rn4 +zbLS5Tx?U53X<=qu7$k<}M~#-(YlMKB0T*5=nAa9L_^Ds0#|e$Q;K%q2FG2|JboOch +zz013s;PM=k{)ufXLF-WoflPWo(iki&DcUQ1lLF@2BN(k|E&ATTV +ztRJE1l$#>6I7A+h0Xy8)q$1nopVzxy1h$*L5PWBjw<{|ZTEXHpF7)hNGb%fVg(kW%dY;3YCd5?95N7_;0l8km$xbg>z!xM;xT>^*rh--sCllshI2AA|oZ +zrsCx;mZj=Mo?dp)e0lMO^*m%)W~|`VNKn>v^?W6TSc2T0YZ!M$RL?`hMpga&0~a4( +zUmX}*II!tsfO6?|b7#9paTJm`c{9MXmVt?Br!ol#3X~*%XZv|=RtBA2`ktc+i% +z#C{U%%S1Uhrl-{~DodJ?Ah@*1zz2e4LyZ +z^n}^AZR~E1>~8Hb4MUU)GFIliLMN~73LH76va4Gj>rbJyRwH{|GJb#2+#+0n@Mlje +zGN=w3-SQ*sLRQQ*i~9N$Cm`uU$tgDZ(7D7U-rWO|ymB#{ +zJc_)cNSTUITtogMx&a<1Lji#$@7|`1YJHcMqe2ce*6}-Te*o1$?5A^(#<0MS+A(Nr +z+8&l@>bu_#bun6^A}lbl=$9@8>v4PX^0u}dj)}g^4dSzi6Ed$n*fDy#UK>KAS=Ba+ +zi(_57i)Xv&?pg!rAo;ZG4m{8otsMx)yF{9C7K+Dkbx_CHEU(?V043)Mv`f+BsZ#zv?_A#~R{% +z@~V^z{}W7M?@Au!S$2;ziMmP&OpEJme8D#N7TPL;$q0xR@xqkX9;&RZ-mV;pc3<#? +z)?As%{uS+jaNY{Vzm~J=5RPQc?C+0AKE$srPrckmip5{3wad8}VddjEmYg)4E2YLc3{tzd%!Ej{V9=J|K`*$!$Z*cx +ziJQ$Sa(NFM>^!`eSiXEuBXGo293Y2zxBiPBA_~kG9r7nSRP5Sew_!BwLYD!9DQ$^g +zmQdceCoqOZvj8he#X4m4(~6j#ZW_a;L6qG(+Vk}&RHang +z5WmcmJRKj{j;viLct3l2g)HC^Y8Q^1pLNPGqFH-iqF;r_-=pp!!n6BeMC})eds}UO +zs*6q28{9^korWG>eRhjzh3rx(2wo?6k#a~I<~X5=rwQb($69l-tIZ=_^syjGh2`aa +zB(Ub*Y1vgzEFO%Z*eMUNKRi@MzekyFqL&kqGPqOv0C6B+R6vfj#D>f=G`4Yu>D5`E +z)Z2{l`9-FA4Y*+7Yx~=hR**nK9h*#GYCG#WgQh-wamswjBXh$JLPwUS&sZ<9$jt2Q +zwruh-aCEy&8WN)Wm~2BPpm_}ExZ(@JpF=YJ3JrZYE-H8ly+Ue;YDiUYFyc4RfT$U| +zc7IS6_-^3hjs%z6Hct&b42>@C{^m56H0odVm*SB6&S +zhQ2QF_m*VZ;VXEue|k5C>-@*Fc`*P{c2tM<1-(*F=7EUywE~$;iM@MqPhzrnbX*7} +zIIGe;mtIyk2Tv-GtW+-&i$c_G67MJf(2FmwI@h)r5e8Tl1y6D6mMg=ZaEM_ir5kTc +z+ry=IpS;Bm*7I#!ZYFW;$tu`cXl-a=vIe!AXXeyEb>ygO)SG=l1L$2B$lj)p=WS)c +zG_n#qPW`E&)pyox(nS$2b$1l|duL}!i1EAk%l=*8b)$P753SJUt^8K#m6e^+VCAY5 +zaqS*NvVE@HvWP(p;~aeMW6s7&NNE5^)Y=MyR`f=|?WRj3aZV=EaT>leS_{JeD-XZn +zG`e~NT-pMRQyc#DKXBS<|;Qv{0)_5seF+12#5vwW?HQXwAlQ7W)0#~> +z)EqHs^4>`k8il{A|kNZ4+H4|kzv|1=Gk4} +zgB|4vLNFl0{CDxz_?9zS05=)k8) +zE+*unN88H2EZFn#_wu60Fu{{M0b2Y&mOgxd^hbd3CW;_ocw7ZGKq@~@&NQm=m0tNX +zE$maHz#O*AlfeoI83gA9mRDN28*~a(EPZi-od7Jowd#28(%g8@ +z-|n3^@6aB@;#U$Lqh=Lq1^fFRZDGRW+FHRD`(kiSp6NoW(YOQJNtT2r5p~{#@YLJ!tJD +zldm!y=Br*~e4Xv7tfJh`$11gPbUoU=`1h~ub(_7TRg9Z{B&?uQ* +zBpD89v=W#0Wp3!CEtS|MZji?J2CF+?OvD*I{U+zdwgeW0r&8_Jv<*VoID2t_r8*61 +zZrPGlwNJ!vjxxQ%9Qo8$u6KN5q#ogbdF-Plqd7TNc)ICALPe7x2YPuqQ9_RsR$rFh +z1To~#j;Wz<*P&wn*htGRlRzmkKq(JI?q>$2c_t|u# +zMeQw|cwP3OUwReG%g+hx_r%$EeN;5|mt^_)?xrX2`ZrzN0?nk%9HhBy^D*;M$(57E +zw2fE8o>9RoY_2h>x?{x8enr9m)&f|wd-@o%@41<<`~zh967V6EpMlI@5-6>M4mb0_ +zsGtfm(b?WGd-i}Q89wB={5T2d+(xtX)>2PcLMh=87(c6g&o&5aK!JuSLnQDWA=YPr +zQn|Z6yarb(CXlNYi)=I1=ejMY0Vsdq!+_(3vI#DHvQP8)*Fho2DBp2swcuM$d{DSc+0)1#!c~n$KuNy-J0^S +zFn~d2&TB|R^NOZUoNw=FFfx@=5ld$n@ZK5R4Ry9dHncS{OrP)N|#)@q4$H5-n+ +z0W{J%b{t%AyS!xIR0QadO*V^Dk5J9b#5DWMt$kT3DS~Qe_&mC~(QU}CQRjfBnO<6N +zrg*2DnoPzxG?1+O%H7|El%Ryu4$_;-$8o+5y0o@1NzTuPY{5lqmD^Mz$LNMvYujUu +zu(@ne!$rz#y^p{TPkYzBP%7{ri5ZW)|F!j`=C!FwIc3H(TUoU! +zJXV-bctJ<@eycXh1zCYBF?_vbnp4sbq4XRZ=M%k&#!F_+)o#A9Jz7gpaBxFmBO$tG +zb0rFT!>y&8GLH}bOazJEdU@DMhZvy~&%8+@zuXz}X|6%1@`IUyh8>2VW-WGI=-0f6 +zvsi!n+(jOEGGtMTde_BK@Q3U*H%ZM|!R)F_*pzjU*p=XKNDrISQ^dW-ldJ0fxq^ +zch%Qh1bDKtWPJB3L^o`jwnYhj_~HXF#eizReX9=F4X_0)E)Yk-Zl^<{UG+m{m~MTI +z6~k8eha?WU-Cwv3|J3x!$jsC!&&ailAD%wH{ClXH*QUG{8QasbdV9E87P4Cg)d}9! +zUsi)qMXH&W&#Lqk*9O{mRSRt^1N}IHH4i*%% +zN`Sm&+pN|k4pm17j#REjWNg}S5wa3SLgp*DP#;#ki1~Aph9dKb+4=s62>1MWqldBI +zlCKGw7r#Cc!`09+N6fkyQX**C*|le(peJ%TL6p~HRw(c9ORXYQ2$q|G8_@1Zihu5R +zJ=8#0c#d|fHDiwn*%WBu&I}*SqJwa`%*O6#4yh(`}xr@7`pS3OBWI5@_=0bexMz+N8@|XBa=_w(W8c +z)!9v-6bGGuI~8ArNZdYt5LWr8;Fjk)(&|s-rj}d4j0OAMZr$B3M4fMF_gj5Kx2X3J +zV;G$PsI1#PLc;2>B9MBtsHhhb{*EEVc{D&{=d;N-cBNC#7Wr__8Yk!v;p7E +z+87}}-)@JPz!G9;hcyo{-UcZnnZLNob~wUjYkK|8^>xJpdW9s(Vs+`=6#Sg-F%%>X +zfEG=3S?0|QLvoVJFATYyJn|3rS{HalUSi!A5tlvGpPf3~A23H@HEOqTak^Gld61^- +zXbRF8<-P5od$v)kmxF!~rCL$#Gh@Z4rBwZorSf}*<}tk>BP+>MJL}tTEFUe@)7YZT +zZ2#IgiO}p>wiJU25Puj?ukjqP4ApU;7+}}0?Wgezc@fZLUsELp)DN6mSF9dfZeY_k +zu-q9CKgljjX`TtQ8d+`V^r;z@isg_U@-!F;igOEDzQ$5o^N7@}{J}1JH98qPjajTz +zLVIHQGHT#v<+5wCDpm6-(x2^jTkaWi4(DeR-|YK)Inf$c0}Pz=4?GjG&6pjCw|9Ck +zH7muHjJaf>-hwDoIM*}4Int<3dEs_pC)TcXvb9) +zuxNDIrsPpVi9*Y2S>_XQ#|{tDO~-!}sYc>BqFC2jyH=$957c4zQ4KrS_F2b`fv=&f +z=r1blS)2ziwNX&znB$r@sv99$cld-F9qai1 +zA!Pi{ZITb?twmn;A(SvZLx3syLZb$*dEw(^J0n%r=xRb#PNO6DD&X~DR5F+e3ak~= +zWwfziNiDK@S(I`Yz;~WiTsd_5R44bt-O>?i!qU^@&2waAEQ7wIVao5smFgU`ALKdD +zbPnxyHbyb+@*9UdC%YN>mfN@iBHSUcK9z3A&Qk??srZCku(`!nB4Rzgetz}uc$rT5 +zcZc6Z<_}Mw7yqT7)O~pRqU*|gZ;}D{`7C=f=owOI^(3QZX(m#<=D%KU9bx*V#T?0-;U2&=JzL^B|%}K*MHhXyk%Phlbl<-3`F+Y<}GK{^Kqv|o=9A3 +zSVX2FFX`_3tja6e&yQ5&dtS!LDU|YE1L7o}#Op6V9>LCYDR}@9>;6osEbO8(ozp-B +ze2Jv=w@uI$Tewkis^$}lk^;GOg +zeTv}6TmQ2!OCUjiA?2a9ifLjO;pyjk^I|e+=~c$^8bLbtm%mdd7~Q1=mdx9PScDVA +z%KWqL#biy>-?`F&Ef+shFK7-ok;#$N>d9-+AkEo?E!=ynGoIvn)QvOG$0@t) +zA=OVmSi<^W0#UZ|JTgeB=m31h2A+=ypTO7o>XGm-6MQ_UD+IpixGH+cur6o&jD8+1 +zPX};1n~{ffO#&IaacWd3v8i$RYv4~L3|wgH6r4oZ$r8G^VQEptkLxzOx+_bSfIGFSYpK=KC<~x*IaWqEcZqVz7esTuHf5 +zVUv!bH2@te143WhO0Rj!)8KpWfBmX{TKNjGTk8SzowU=&GJtLZ*8aZKWwY8Q{Z5iVWHwZ0v5&WDGlvkyCgUtw%`C@zYpctE62^ +zOVx0;8OEX3Vo#T|Gg?pO{gHqXsq6V+*V|whheZ7$)R5P7IEi +z5f;AuY(s<6pi|EH2a~ZAC%Jmh8AW>=XKobKyKpT*kCUY#ZyjCpl$nVjtF%iQv8_u* +zXpGW8NBFRG1maCo33zbbM7(do5tE}V2aWB2+gX~~DU@mOS;JA7`_gQdZmaIzn8?7Z +zo^LRP;qa10hzvMW0Xi%Wt(Bx_!ydIetfn2p%n{~p1AJz)5b&kn{o3bjW~O*L;;2as +zB=Pq8Cb0kSh&0j%mdAJ?=7CptKr8Hjzw8#+tPMUgenOu`x*BNZd)KG5=5{-h +zD0Jj^vxo&COCZIPE7x3$(97V=t9YWDf!-9{xSD@rRCo+j)1dBd3DMTI?JGHY +z6He^+km};{9G6)4VZW_|Q|FKN-2%9JJ1@TLytlpLnF<eP=FJ@4D7&Hm7DIEXzCG +zj>`!p?2~7Ga|2Q)>8XB3S%@inw4yUL+mYExC@uCpdgmd?EYgW1xllWolC(th=e50@ +zt>i&#NhaTmLYo82z#f9_~Q_s&x^JN3WdxB>&Bap`FiQwcyv4k{cV|t9!2hX6Sq?OxG*Z{b#Ph8CzQg +z0Q);dc3ZQ_e!n95m`8-fNv?Qy#vlderB21d{Jcisy{%b_4-uL5_UV2b!TX@LOc^NQ +zqx2~cQ=PYtz)qN-dMYd^eOBE?{~835x!ivzC?OF9a;@o=V#6kfn$-Pv+YhX6K3t`XwYuYyY^<# +zyET=kKIWxRJqb?49b&l>J1Ja2E`M#S)uH&oTQv)u`lS$fD^%7B8%#4-hbGGMTv;x|(x~hx;DA7KBPI2MU2LD4r`#7}eqNv2`PtMUcViDtES8k`5-wb>+cRu@Kk=Tp+(q_D@Dd`FO9d3|Nse}M1#SQabk+Ew5h +z_-2>X6Ncux+bPtrn`qqpU{b1nK{{4ZV@+edpu-iMfKvh)LwFVF|DLhZv(n+C;~24g +z4*7iX4Y%@lS(7V6hx@wcymxo6m^Y)}UVmFx7Y(EaMOElSa{KHRpj*j9o{9fV0S; +zVjyLqn2->)G&hTbE7w8ay83LZc6_3*;eZ!1y_6u$+$^T1t>?*i>N@Q154Jl603CH+ +zu@8G~rPw+>(mp>F0C_j6hF%BFv98Tr6tUSFsTOwW>*bknA%ovPsflBBE<33cv72Xf +z-dxDwWXa`L#s@@4_gfLAVcSt^9Ai**9Yu&3gH&d0vj}Y;q)NB^ig9) +zf6eiZ=<(z6vsq(LXV-^gez5XV`4ms>4xE^%%bK^ygE# +zu~3gkOW`aI3C$k5v#{Fg$Vbky6S2)gbnFTTaEUU1@WpeImt{s0&Ef-L(8?9mH&V!+ +zI9W+i0w{nrloV5wRc7~c|GOd!gC;5d +zlVw&}fMPpt&-2Px6&o8|?d|mx_xWsCq{W6xIy&Xig~iL2KMQB(DURR!Ak17?HnQFs +zf{r1S=cH@kaab3~R2b4g^sVR}Fr69w1~7)iwc&y=iUD7;Egv5L*+0-Giqj6AgusNS +z5UjhbNlmnc9OJX5dOJ9Wk{un%tWd5ul}Tv|d*2xK=Hb@id`UUK-)kj#ZJ^=hX4n>M +za~|1WgIZ?wEBU{dh}h?qi6a3c64ji}8Wv;*q$Fw31^xxhj`3P61a;t;2b!n#mO8-I +z$VfCtV}@$*v!kQ1UT%L+nf{TZMShs(C)|-~Buv~X3OCU#o%$7e&hIq^AJFF#L^|iv +zZrSx=1Uin)F`PuE)~NRp_<2eKmgD0YSMR!95xf02JlB171`kh(5>2E_{+owYUc-rp +zG>Zfz$h=yert<=xuVZk^K72)%&2{ylWIXYOUEndiBF04{`V3ysUnyjG9^y+&`}nC| +z%oAfQDu`-T9Ph~f(QszaR$Lr0URIM?Iv}C=*y5v*8D~Oa9Y$_1H#la0Z!NoqgPoly +z;cI8#&cMV#YK)su=1fqty2Xa)2fpj651p_4>6*|04#IhL9Q(@kNzn$ +z?J#N?GSVEA#ao`HVx3z7eWTQdmB7HaC0I$(zu%%3=FKZN)|N|zFL-XC_53{Z6Vk3J +zgGKeZb{98=C!|0)w&(Ps^JaeFw&br~PTizt^m-bytzQd3H{#MH&&g(3JP)26rwS=?{IP&qFDd#~&yBXGT`qx{` +z|F$|=9*LXZOV7Q{@lD^*OW%pVm$evX +zH2Uvv=+uMA%dShrIMeE%p<(9@@0R~57#L~0Eq3{v>C4}J?v1}kethfXJCAcM2Ui5C +zJL3qUQ(@tM{N39-8IQL*tIuKDBxEGmv+cY}DSa0U7&QISm?avkvsKw_6w7e7YxL8! +zeZc!iD8&k)+HrG2$Y`=$O0eW@hjVyU^Ts}k=h|9grtYuNCV7hQnaHOVKP)}^I^+e4@Y!XyEVp-SEHFN^jNK;h +zqHF@GfxD*_@yxNd{;r;g!gnhrrMF%z`vJWk(?Lgh;;^(Hl}HDFx4fZcLM9UinukoD +zzmjNZ+Yj_~<~GXs!5)kf9?Sb$-K4y`V-V&koP@cn +zgWde?B`GP?!IhQiNz>7%R>1W(g@hmrp$}~5Lg|q)zcYEekcFZ0Oa8v9 +zs6B{{k&7JT<9c@v`;QplKhJ1pU`&=}67_?G;tEjs!!jp1`3~p +z^jCb^pk>|!z0b9k*H=j20KSkbX|?O*a9?t;IvJRA<#}Z6+QJ1i&JI}A7S0GEwq0~8 +zx#Dct6?EX$_UT=On!l`KsHi{|hB-Bo;%2*hv)TV7=(^Nrb$X +zSOHm2Qa2gyck=U>FUwhe^=>_8-4{)@v8hi$J~njP^Yg7ENbQ*mW@JK;3zvzHv5zx; +zgmOEJ%hw6*$7x8A3ldyEu)N*H3~El$ib?aU{O{+kYo2rd1ewe7tr4mkC;w +zoV1TXRt6!tpewPBMRyL81cT%IsauZRORMs?9|rI%9d7<5keYuNk*2#^oqXuO!4|@mPFn)A*HOZrwG!V)Amw*3x{`d +zC4aA3XjJ(7{NZ5;q}rLMu2%SQe_W(b$AKV#wg;!UkWXK$L6|tHM8du*gdNJv(Kpi&1KhlB*lRmdj62OAPX%o}&u{^+=-=4K}AO^ZgN;|=V)VllYx;l*0 +z?0z|L+O=C@Gxh?7ivMrn9LA%drnI(q_nrHZ)n)oAlobixL* +z`svzR8*b`>{R6*8-e<+ltZuC2(z|v%V0y%@t{|uDdX>v3=}r9B6-j*dg_)PkOM=IoxPwhiv!$CF +z(fhx4WZ2iPG`~Lo?$WVq+D%8B@aTqkKIgT-S0QWYT~GEeW63Dt0h<3?jP)Nu7E4%jC6-=L +z(a~OVf+^A}>Z~uRh0bt0k0Eq +ztCb&&#KOsJ6Fxlg4oY^CG~7LeRr1!+9%I?m5|J~EHCni{yx)L|^+R7rn{ +z{pN{5L!(};!%8y|Pmf_i1+U1A^JzPPY}>z=?Yw1=oC(2CM66f2Om`XTr&>kBR_U#k +zR^=l<>tVJCKacSwVcTtg!xJT=^QS5Ft7xlh3wS!*KG1>PG)ru<>-_309BV{!_4YhB +zj+jJ9kVnZfe&4t2aB`@MfTmHZmI(C&!1Nnn6c1b!V#1jNtrkC?{qR9lpGUZ=Ka{gt +z<#27;91F>rpee~|I4vq~Hp}|M;D@#Q2I>8A{DPB(9vgAt=(^hwxM!*Nw4v4@m!rjO +zaS<5$^q`ebjyg>*7S5o9!CWqXwfE@8LgPXec1-D|(~Si487^ntmp?d=yV=GxWLP$%H=n#eA=8iL|*C8VFq`Z|j^ku{(M>vU)9Evg70#gvr` +zScJr0uvNyvx2iEef7J?BO@>i=pIp!FfI$@n8r)3d@!T`xQ&TVEc04O;lcvFpN5+y( +zI-y`L`n3&BqPT%)mp?sE!RCujOn&Ia#n@X1i~+DmFUErIJHy1UB`DXs7Q<1DxHqwR +z3%#`DN;)Pi&RUp#o}j0^=$(agA_9skD|^jrSSJt`OX(UMT0%z4hjI6b-$wG#AqV(vioBG&UEA3DI&@SqY))rIo(O639>u^h3#W2w;rGvoFr%B}Ut@^5nBY~Ak?jN1J&SVnHw6ETOON^_Mo +zAK0=0rjOHcHN-5&v9D<|C{ +zp{ExQZt7K=(pU*{0gzt)K@P%owRv4IjsTj_6eHMPOA=IT`of?0|~*o^SwVPsMP-kW`;lRjwx^uy@bKz*ijJdWzX=?|gIJ!jkWs +z9atV1n-%T)T&xpmb8&+E5#Gm&>TVsRX&{v!I50py`t5+ZbB>mdCv`=m +z$>O#Hq`GFef+*e}7Y{2*-z1)TdAtVTb@SPW9O~JcAub;(_jB-lq9>Sb*^RJ-wFub% +zttx&9W0nYbP3k)y09nJ>je6bz&+@=w6@BXl)E+mE#q$-?uoI%nIbRH@cGWho9!=A6 +z5pXV*XJ#rs-7qI39XdPn!J(-n*Oqf`mv`BQj{;^rX)fb)K5isMw$-xTTZg$ywb#Zl +zF$kaH*lvz)Ym2e#?Uh16-H+JK+caG(%3!s?T0Ur3(5f5Dq;Mi%^rm0!YZkYl4W=Xi +zkIvsGZI)oYs{f-~Gq(c5-1#`(9__t0-v|j5zm2?e^+2o&v!)}K +zj=H2qPG8?&1`hqzmZ2My8EFXVUZo54uU!>CZ3%U|z1b0#9yz-6yw%=pue6%B`QUBFTS9UT#dX4m5=g*;0qo?pq&jy&G584Itz+U>m +zhh}#hwz|?PGDGZZ`u@98BUjtt!{&0AHPSKl`rKTx+RH{>{t9nZ#`W@7usA)PI*WYL +zZO|8t+-jOg@G{M*B%r BvBfBf#qYsOjs6P9poAR5tRfya1WW}1F>LCwApJE$hS +zl|o6B)XPt9s87(Ywj)J+r(^di=eG1U%@5*4cPqkIpy-F^Q_59xtrY~BS5Kvqw@)+oJILL44Qq|nJ+uh +zvi|-Y=|u-^80Orbr2oE!+%**)T)39<^xdQ_86<2nc6n~ygx3SD?b@*?TI1Yu5XV5L +zc8z=H|AU11e!}QsYL||16i96Uopyu@z&NZ3qkOIzPy9QwdRS^(>RisPW(TWwbOxFd +zTV2cJ{)!{qWSp*q&E#XdyW9RcX+!Vm`n4N=+K`U|vOc=4pCO`>0^#fxiUEaUOw9&8 +zEzKCxibuitBaI~f)k;;dKI$AJSb~t_>oKoczi{!XUk#cIJW~ipfNFh-G2=puUho6! +z;t%1kz$KZsS?m`1hp2GY`7l~lI!Wgd%anEK*HQ^x@0gx%OE-AY6qlN9!reAu9nGxQ +z@ugn~OW}lM5uM3Dz+Q7Ddfs8q31$tkz-^a}lD{S@+Y$GhLBCauM*gnbyqc{3e}Iwy%$j$)J8qKSdyY%5Tgt@J{3uG#4RUCnfZCuTY|tE_ERuex9`BnO)YUR-#EHUxhX +zGOlrxGGn7HZ<#X;d^7U1ZPWp$2kXtL1K(J6ozUtSeAG{#?V=!L(+3iQat{Z;D4N~+ +z_Q}Am*KQWoyc9OMJKywgIY#@0{(pJm{^N}M_jIqN!0!>4iZN|({!NNQo@*CVOg(cI +znGV6XnhK*fE*_&<+a@{Z>gs$z1FsM6(vo1cjv~-3TmCee#~z&dt)fv`Hj|J@PN#*d +zXiAMPczqXMieU%a{2d-TN!01DnkIYQC7BNBD=X>o%(v=S7 +z16uD8B%cy+S|D8MhWFYBIOUnV38JwYgUdATO=c+ozMJ%mC7&f40r#D*pF}wP&(Hla +zFoC*8f&O`FT=L&;<4^jtN2bnr=%sJRRa0i(PLD1&1?x{Hi{AS(f4~ZoBz#6Aarsl+ +ze{;edrlMaD5yukYL{qR$*%lUK=YCt6^!M_|}KBYXPA5}Mb((eU?I +z)xV80|6_;yk16iIx^uZ`zB9(fD!Vb(2;IH!9_CG-Q$ku9ccM+Tz*Ar8F5fJHiaCOM +zk}1X=+*S@z>YGCfEaqHtI2?Mfzox137u|mJs55$sBBF&*(i`5lc66*_>9J{^CTixfE{WK`^YgGyDYF?j!RQtbjdqXJgS*g-5rlx++hgqKuE9cbY +zEvx?UuJLhG1B5!baw4r&l%uqzoFSUf=Quv^&J;R@+zU91tjXUx+`_y+0qL=`0{qme +zXo-gR2HQeEuX_Jzdcg(X0}VE5t9!TKs5c1Tf4bm~j@Eq{=r=3$s{B_3{OH&Ix?V%K +zFFB!ov%A{xYxR2IPx+k}K!A)HES0h#2^temBVH;t9KQ#jjUnFfZJt*zaxQQ^;PcW{Xwotk(Y +zA#4F73rMB?o(c&)=d{h;e604~yStCF@XU2axsg%7V8J&jn=07g9`3v=bXiB|06x}zpkHAte<`bt>Fv- +z__I8CYIw6|`RTs4$?J&0q8@7L+Qxg0b~QvY +z?Twz9?sRRYN)R2wARtkv0>8$G^*uAnGpkl{8Skyud7}#FI+>Uje?Y28Uqq)_Rtmk9 +zKHw*!FF**>U4D?PYi)gCFehXK@-PqYb&(j=Bg}JlJG6sbZW_UQ)!QZ}^{(JzftDwy +zo$Se#OG4vz{EIKr-xr9qv~-+*2{|;^ZcnrD5U!R-e7>IEKj30j?yC>Ipo9p1aZpwSSh9LG5=5d@SmR&HL+n5@7c#$BM6LTu-+1=9*9uO +z0qKDstE=8&St^8kqWRT;CAGl${Tcjcazj+}e4_mOfRpe&=TTwdIG<~xtgRU8DG1=!o>i|e +zX}r#!{JRt~#7nHQ-WFy7C9LjG*bG}DXomq4Sy@<2q$h!bS +zdWgNbXG|(A(4jy7%3%}hYWI>Arn`pvwLW4WAH8T9>1KL;~bRA3sgjyd>dFlVqNS;-}b +zu=i_!`0Q6pj;1fb1SYe8uF!HD65oZ02*6_gO1^3+PKa+Ti=m*CQ3+isiXUtF+Kiv+ +z#w7u?dHNJ+N9l(FLVPzKB(w!&lD4F;uhTzwSv=PWotZOc!V%qbf-lB=8;Sg(I!&7s +zL~$JRs#9R%W?Mxzpzr+8^AOB^Dz!~t_>Ln +z)ORPc;{4-eji58PJZ#o#Z2+w5@<1uBH~DN*(|_Cx)s>$QSuyzbWf^A;yJr}|Z{aIG +z=29NPHVNp`bhJECR1>5vyS=>y<2R5};Ojnx54BtBUY!+55yJJJ4?g|@t#rQKeTw;A +zPsIzbyGV+r&)mRCOA!C|XtLuZGUF6_CAdbomftEv%pi$88>-%KZ3?um^K6e%02-%szaR}g&z%mA^B*6$LXz$uu@QH +z@3ou{fz2p9($kE_eVo@M4U=26d4mE)hrni>tQ`YpZXzhm+t= +zafd>2E$&*}9fG?AmzH7;u0@KwQ=9_9ixi5xJH@q7iWYy<`+4s3p7X!*VP9ABDYN&U +z-^`k|);O>K=@-Zyxbzo*@Tr31Wn(_VBUV6TxPv$UNzcNImcGjIB_N|za +zZH$r$vGCxT)yz5vm0)|k&bPL`vy{wCEET1BS#aPL?O=)^`6tg;>SDD`nRC>IbF84i +z0D{d`G>4Kzb6B>a(#A?NocS%3s`@qNVO54&MolXqZrHx|{a1)dHp#D28>*Y!9XAnN +z^CIlYxFXv+ZJr~zUHcrb)<+RBo&aQnm4x)G)D!V|s3As%!ST+UhWe&?3JMDE`;@(P +z=J;7Lhl%BSSOl+;WOfHvP_s955K+Fa$ha-y>7K^4T)gdOX}Sb(VL^fKP>B-ZP60)U +zf{GVRktrFahgeqd3K1PPmDG3(nNry6;x$&v%hv^7AdEWkZ3*^EbH3klbQ%(uva0Ez +z1E37vjmF?Es3Oq2u?D<1&#!&I_BY&cO##L8pV{*N=u{mMO;=x}r>Fmenej^I}lq{{U +zpIlcZzb*F;_r}DbTri@#K@r1rQ)nS4#mCSedfv9ngOfZ +zxOm~btHcJE(IVh|0_7v0$Z6-+tBy7pKQp@uH>F;7c|!SCMJaC~}q +z3~q|X*(J#{JMz!;25x?Wl|d72h+YzPT%K4#r3+u?66a=0iLU$UHkRzWN*Gc$V5UXb +z(b3+CsKA*Tjk=FqY%@k7aLe_ +zJ1II(mxHg;bRSY`F@|b4_pw?-ASm{@BBWTUbSZ(K9O#uJJPD^%k^CXJ!sim1H!ddv +zy&BFkDAoLEHTNahod)U4Onw>MS(4Yx4VfXxa-D7;G-c;9#-}}WrT3Dz(R5u?4C_+I||oX&wIyvi{RSpT0<7kuMjF7iin>ylsP$1r3OToChCVyRN%p +zd}WS|f_31UD}^2NqY;TlR~HL@zz +z3$Jy3Ewsh}B!s*(63kZMiek+d=0GsLO~YruY`z+2r@=NXUDdYoZD=LI1~0RRUK5Lj +zq}T1V4&cY8#mp!tJCaI_NLV6>1*zqv3KBoDnj6EHTLVD~@wEWiy;dDq%Uv&R73Cv6 +z)<|>sxSJg7{jk63VRI~%yDkFC0AhmE9E#%h5szZ-uQCobwlHZn7vaaCU>^R@OKX7~-Z)i( +zm8Z_V<=sPDE6@F!4lec2YVgIc)-*}gdfoADU)QOaQ|L>y9XSpz;0%jU_%fO~BAKos +z9f5|hm`4Ln1;m-W4k7Zo^NbhON^#glfej>o>|^T5%Lg+Xo>xdaYl?7ghT|C=QKezN5eJAd7G*4_?0|DhI8R#x7B9gx%TmuXHxmymGF +zO8v+DBKr9$1^6y+0mBo{QQ%G3hJW*Xy$E +z*kDP;d;fv;qvEc%@L4&v!q0vdZ&jUZjL~Tn(}67~%i>TcF}Zmo5F^)tU?~p)PlzIx +zz?^2a5`QxSYS5=`lQeXcvIbjirHT*ZVmVH_+%L-W4kwpqR>+}c)fgzc(Cr2tu(Aqv +zZ>-((8O`i`DDQ%e7eaWnWy^~T)6>iA(Sd%l>J+1&aLXPYi#i>iEbk;Ek#(hAS`+A{VT%$BcKC7k<8Ks%z3cE)iGCsQi#J`bHcy@O9* +zrEt0C8-WV6@-cREUD18KaiHVJ3Wog^+k5^h&b&%qK99BQ2BOI|zjrheF=l<}8Fnvr +zh2{TCROoJ%-^lspZ+C$pafUFqybR{y*K>?K`U`;ih|=aWoWwu>mRNrnmbf>+uh%xfPG(MeG88kFPUJiwXhdYwJg3k5RBX#Z_$n{t&6y9vhF5aAoy&wkNOu834yg^- +zo7?l&%Z2uA%@QyLDx?0%K7K1N)Fm? +zbo3wJ^r^=-zDYzD6&1wY5BDv*KDP`K+20j=K|Q(7uXaAs_xhd4b$SJ@&0NR+uVW6Oo}A?D!HwBW +zA~cnDH@{7xF@gu$kqwkT>y+m~8IJ`hWk_}O1^M~Oj$hLTc(@B0>oqjR*CQ>%<^c*P +zPsx~0=@Z4|j^kJfk~XCXA;oY+*7jXjw>L|S&2zgZiX$N7YHW)(pJU`rHQL5m5=dn +zA>t(x&6J*$oU%k;lrF{yARKLuJZ5)rCfkH2JhQC?3Tb4!MS#M^FfsyvB84QI(`m(v +z4Estq!@xJQ;Nsu8S8(b3{EOO)f4NU^?t=KkCXT?5bM_z8{tw&KuAQgHou|h08jOEg +zl7jcB8u_QAV*=E7c3sQ<&o>`_z`5yKeUK~hj8eoTq|2jA+M&TW!xJ-SA? +zHK2|m-A7;lRA+X77p$7R!v-{a$>pSl6SIz8Q>Zb#Ju34n-%1gld@O7K +z%F9QJEMq<^`q?N2s(!Q@wrPb=-EGqmzWoi3*y8*dc{z49-lJ94b~v9Up`8YI$o8J1 +zgIO6D&tYhc>6l{opmoi=#>WBU0Mi{887;OZ5T>4yN=@bCuu$+guTHcb2=|7!AP^*Z +z*l^tfm%L));A8{*&y?y?XtNUFefhw`l_q6mqaeqEX@nHhBur4+ZYcH{rjw}tj~YFs&*Ay;F}%#Tdt4ugF0hBzZ{2$ +z7y*INSXv6tI}u!N%em?H*1fgW_izhsFe-DXZNYlGO$084U2kFW-qJbV5zKDg@l +zUR?6h<0D`cQS+EvfXhB>xy4pE(bhRn2tXy1{`P~C29j^RL{V#_gC+tq`|Q(YO6-IP +zb4g9cux0n7CM_0jxBXqK%Z0ARe&R +z1$utTSz93as}e$GMxq9%q)+PD3WS_;LV)OV;bs`#aq_jYHv!{9QpJ(aQT{#GqJ)Mc +zl}La{d-p1DA`wPEFmGA8x6WCY1UKg6_Jcau`FgAPC>1t$9t<*92A1;L8pC4YGcpon +z*$v)1dk!`}gn-Af(cSXx+$;z=F!5Bj^e5brP~50@F>KRi%nmjI?B6abUrKcyOh6-g!lCTV5_~DaRcP-6FHsD$|Qu;gPWq0|xQSr>Ob-PMMsV;pKB^1Av)}msEGvdpwB&Dy;zR>J>4y2BL*0 +zyoc(MhTX6rq1jcXrMEwn+A|uc;jUledw-o7{_lq;PV%}3kq7OigQPZv_``((H9rU@4p0onblhX +z{Hzvn`07=!8qZN7Owj9BQwXfe?YF?R%;&aS_4jree*K|FviZ-ryO#u +zUutzCM@DFpP3D@aKTq2syprw{{$1s#RGnWU7xl!srk7RJ?DkB*vfab6Udm_#wogv& +z|A<)rqbJ;OqLU1`=%aRf6>6P%@Uus&p}n2DF-5M_GB|vuJp4`$gf?mahZ{#joz=xz +zzyMvh*ps8?`+KyeadnxO95qWkc)ZY!prD`{QceG+dLn2tM`2Ct*QOWf1)iP~OL`$j +ztX!&uRmS>|q;-u|Ekneya&)jZbpF(|Eame`A(WXpS2CudV#?+7=8xXGw-!QxN$?EQ +zkZE~jesx!ugs&L)H;2!K!V)@bAt7*f+KBtfb$-+E%ouon+jlOi1?83&XpCUaNx+oj +z=ht_}1og12n!)faa)|TI{QVn46NSv-i{CvkeCtOId!tL9W^_q+@Eb09n^ECel?cKQ +z$2!|9Y5_!ceiPU9HTy_Vhz+IV^(q1WOWqz<)@oF@m6c`6KJ#@aj_Fh%(9JrE*E~xF9uj +z>Qv~!V3?skK`V3Hr31A@TnQhE4b$F#rW1}QEI>YoYSHhf>1S1@m9|~^N|Nvb(1s}z +z+$d?PBB$(@^6)k=F)wBBqjfZR#t0YPJH|}Y-Pihd0m_hJn96Xb6@F&PI`?mPO7vGg +zV@*ug9I9!tNwqV^<@0P{)aYeyEk4sTb9Q>kWRTXpr>_0nZl +zETS?aBO|d$405d)!j1cW@?kx_aJX0~I_U2yc0J{@-js +z7Q_<|Xvw!{5aq5d5G-#+#MR;`>A0I#4}!#tT+FIDt121c$QYq_@RcW=5WOJat$2x~ +zNyc1)FKCUUwtv?Ofg98=6tx^0zF(y1%j|x|g`5Kj-IA5PGE~$)`FJ^~lH+ZnL@$Ui +z636Zxk7A*29(2n@8(nGWvfz_;wbga +zYrZsC!VS5_zdv!IrwRHL(N|?-NsVpK0>8`dp`0WSilfE +zzg2D*zd&#~TA$j~{Em%R`4VaL#5CPhc(t+XU{a&I+)sK4DP7BEuB*w60${-)M)vZv1$qa|u&iv06??7(z0tk3a?nrxj2u;f; +z%KoOS=FQt}(~KDl8qbneaay&_lQ}Eo2OZy-J}LyI_-55KL!&J*3cG32bV8&T!e5@L152EmJ|gYUPNRfr#G$N27S)$#x(Zq6n@VhL0p)D)9j@4-pVLfAWKoPnT>E-6}gGb&9bDbF){Xo}co8fLv +z2$o>(v7A(ma85_T@`gLye6V}h498URfFFhX>*^BmAK6Nlf{lkAN_{{q=;R9vI^xx>euAw-zl*-$-O4{;JL^5opbAl1NGLeq7QO^ZVp7hv`F55{eEVG^bGk+ +zcdliI!*IDvbjGFe{mlfD2afQGA+|8{*MVyL<%v^)$0&Vy$IAin>$-*q@0eCNIqUu4 +zap=F()qTPsv&T6zXVaUug}$^e!hgXdsytNK3^IOwZtPu4ZjB;_y%P?4My7JVn4u>M +zza%Xo%g49b+A4D;&8I@f-%?xlH10Q56uja`IdI!SyMKqv%T>8xxhG>Ly0=l +z@uq=*(T$f^baB*cI#z1s!O}gqk+FPeOGi=NJuFvHUt3*v{Oc}UJ%Zrr>!K84Ly;Un9F(P_ +ziEciB9cFc~ZN5<;#fgE +z3S08>*LBTsL+4;F+5_cWBhgkH4%@XOPi5CIr%uQ65DICD#>Yv|At}LI=dsC+p-U}u +zpW|`q?+3ga+K{>WWkyEhFBqAt2*depijF0DS=yM;^k-@^rY||wO5LrQ3cXY(e2#Ee +z$E>ZL3l)*LCN3kbTp;97(_y{l<@D^EW@3i)PQG@7#L4_j7BGRWwoo&TC +zK9gZR`nuD(j|S?U)=Vttrd7Aovp(NDi#dJ`#Jsrai^05E<5{2@FDg`5jTNYUYWJ?QD%-DnV!SR@kO7*43nNK)?r?xS_v7s?XW5i>BCy*$JxfGPK6gX +z8!{P)>d68LNTOA*2^W91qV~_e3g)AM!P=;P=T~Ts79ztA9q#UZ)n{pf<)|iyG4d&m|XZp>V&cm+{fVIJ4fk&~_2?esCNpI_iPci=;Czp$1{m%N^L3#1%uXl5`fv@Iui2vbV +z_sG+9IX(Bg`oDt8`_g&;yu;M3BiY{(T#K37hw~J+l|NM2i(iD9M$^IjGiMhUK34ct +zzc0$_YQ|j>c~bL^oA48u!8?Upp&Ah|?+NEzEn6D5i>^78Yu)i^p;uqD=qkFWBN^AE +zFo;SjLvZ{?12d=9@;bzb_e(3#I=jETF)i}?Dlb@RUp=0|4;!%-=j +z`q-#-0IlWIb~sUGafFk=xo&va#p-jE`k%epaSl76@r8;(NZ$fF{u;+>G<hpp7DT<|^D&sWM*9J`kdPts3&aKDKEO;$Qnklny}KEug^uV1UR +zUw?kO5pebCC8sKHoa_6?ywdH3!r%jZ2N%!AV45Esi~QtrtuxxvU)t96rDeJ*2Sh7L +zM^BKh5^EM|#asmEvKH{}8muj1HvS&I)LE!&Z297nlADqicmJk>Fy)hC4#-*OucQIG +zRE02l987=<>u6u7-nR1JCWFeO)6b0vOTgXq6b5n*XGOJ+XU{dwfVQK38l~HoM?a)U +zuT&^^HDN=7Xi=Rxlu0`x68_c^I`^;fzLUuVSCe;I_WP+4H1-OPfm`p4pbvHR03QU +zI<)x8;hxPAz!HFIwmR!>O?A^;YdI`rT;2a12c*%pxBF~!DI+!lpYF01ne12mm#8ba +zfa>Jp!e3NWG$!)nc6_h)`Kl|h22!51@ON}z0#89Sx4UMKU0EHE9eYQyu(_?#%x$lB +zv^)gqygX!D0K$=AaPW)6#%{)AvK$OYCM)p?VY!OJ&M2Blmdvw~cRNRSzTE}K^sx!J +zK)HD^aC8bofg`?f&C-svenQiQ~1FA)IMQdXVai +z9ynV_s@apg1 +zQ?|@U8h!}#9ioF4kJklFe0eWVyP>!bLQgHKV+uTC-cI(($9o)Xdl}eSERIdDUo=OkMyX$A|lS3G1AmgRh}3TZM^m|6bZ4iq6^X +z@3JOrG%==$l4vP1XtI47(bo$)l8(Q066%AwT0U2w0QMqRt_}nJWWw*gp%v1 +zB^KFBC`+oYROlqzdCKtps;f1Ntl0H=!aT^|{-Z}P2;Jd}bJdkrV4Aac--O@b$n3Ft +zyl84&2njPpTG<>MRbIjr1h9tE-GGRRT6zeJnQ#kgryk^MdY23PVis{)YoUw_R?c8W +z0SR@!DB&5RJC#bj_76J#C91Ij;hhA$Tl<$pjZ%y3oW$wmWk?=V^QRaWyEc0bg_4rI +z8#u2xOzM>KvVJfB{`rM-^&N$dr+Z_La^F!0kLU0Eeu`7;Jtc>{0YWzvgDR|%P3eybV^T>=TVXbmMMOJ`DISOck3R|dU$Q@iEoq}PbD8_Oz&l=X@z)^0_Zj?xe%1@CisDmUFhAxc9XpgUC +zD_E2e0C5_+O$wB6$OXL#hF-q$_OHY{4vUJ3S(gNBdzJ~WXy{kQ)#=4o*Xa1bI_jx; +zyLDlD^m;*ri#<{>PoM}4rQ7MGYOK39n_?`E1IhdZX;=Y8wWSLakjG`@VR9lHD%6mz +ze!z7TVh55>rd8($xKn7&zv){pOB(K|pLAjws#k+V^xjt8T&0X7{2ShG!gLL!>lIgtoFAF>>Iato9`LUQ +zqd?889x*!l`Z2qYDW +zX;!HD4@p`W~gkd~4|B}A1Z)sHxN;qj%+x_y`{5dp6 +zPHG&SlK)~ed#a#=D+^rT_i0g}ATL{HysFJV!&3BtbfC2m_GZu<>ro)0K8~Y%kSc?b +zfEiTf_ljylpE2D^rg07M(KrSq+%0xnCW^4ry~Px#Va@m{!qLUko4#P;rB`Z?^jNi3 +z&eHGq85DLm*lFpFiiQTe;X!43yT06kGdKzb*#FT5zC +z%NNPpLO&`;_I7H?^1lD~`PJ5i23oYAwpHrr#1ic<>NK7Ow1cwhL6R7{Rzc|JtAFs+ +z)aW?KXygw{g;e$yH5C{`ovxLsg?xC98^&q(aXn%n^3-Z03ka{6K-ysAviAx6Y}s=a +zN#R^`8Xw^&Fjp22Y9tUGnuv`Pac0v|ev@+`i9vr18~6 +z%6(+J(+%`}NV{+$C#nI$!bTvdwBUnn?Wyy{5|&kg&%NTjAc^ +zP}e|l@zJ+3&!_E4tp$YF$L*jRDC-6~JQe@Fs0btd`J^UDf5L#uXN`-kY`~IWl`u#g +z2ta{gl59|PPHvlnkFm$;Iq}|M2!0Wj%MVFVT2^}Fd0(%qLw*E%6ytq8kcH`%O|g!1Aj?T$n=&%x3A`=V+U7}P-f_tdYtZ9 +zF5_!GP1DkXa?E^O1-)jWnH#)r7bgepceC^3Z7U+}*0upT1a{Gv1~nywB=y71U_N4E +zZ*v7c#$U<9wW|o%VF9()ws +zo+Yq}?SG^DPmsBo2{vK`#)-oM+2oT%1)*%q6Vt|TRz+CLWH1P%E!a8Zv4DIn%ArzZ +zI)FED+2fZ|maG+l&S>`W47kQMwvdDNWow;*DUqrB9$-Ktox$wei!vU&k#jOb`~>NO +zg0Bz$Snf#CFnKHa=Iahb;lZT_+>zfe3yniMK;t}gDQnn# +ziCCL_`@qkeGLsD +zUyPm(o_v3C|El=-FBf1Zfhh5%#B>jnA%4j5mK!KZ&?wXztndo@UG%bLM{s`p3dja7 +z1W-{_zRZ$Q3{xLRiF9&fJ3~JpDR!V=F0jCoLgHSTdrdIL_c8bt^kaYVs;8q +zXKK+D+rU*@T*g(Bl4*Cn0h{+_b8q@Z= +zKu;}YrD$INj9`_j9KXIc^lkT(q@nj;&$<=u)+l=Km@aub4+tRO^~DOca$W8{uwY$P +zFHM$r;X*|!w$Sbl{-tcUbMt!U#Sf8)(QM^Y{I>s_GeSX+t5cV8)?0GH%Bl~$6+}p{ +zHgX;`$3&`Y2E)I8+Rq@N(E9T0;O7uXz^$Juh{=46Li$w3Edir`?ydJ}4Zt&W1N2#^ +zO%`Du$Sdzj-2r_M_%^GklSX!0w(2)No +zPJmcQj}34xXnCvd#=m|0`lNOkRW~x}E_+rdwGx{j;4k@H95zr9qQ)L8PPa?z;jCep99mA}<5MWJ409vdrOjZ=T!AsOVI~>87`EW!M1hCtnV+E5x!E)6` +zn=IT#?&ASz^*ki_87yWf?aVp@ov=?7np_`YKaJKMKJ95j-}NKnhy9dY5U +zZ{I=+NGLSo>^SaTe*25yaerNqVNgE5U5t@0OWZj)r?YN5%tq0cmTY-`O(!t +z;X6$Og_Q~G9)}<)n)pIdT;d2$=-QjizR8qaAUy_M#xrY19A1MEcf`s_d^|Z +z-!9}U3HK~>x&xm9H$3Y1iDZ|{9gdF9`uZgAR>0SS)@oN>oBkjETQ?+02Q8TTsWvTI +z#wgYinT5iu2qzz;gZTTfnTdp6Y_V5aX7(?`rV9Bb`!%@f%XPG5DELs^DO3O`*%)u$ +zz{~F7ZZy$2Wr8lL33^(`Q_C5qFgL+{j^ +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 +zSW=!6#^ag)+LLU@LtKrMQ@l_&%=60VnE%M6 +z7=qIh(r))9o^P=hJZ^W>MuWJ4K*~Cgd(|g@2&UUpJ12X9u@gl +z)iqS7G-eOC*+ATl{w0m>;gK0jcJwmJwNGiBWTj}aUpgM>jrGZeCgikA|+1${6YnJkTpkhl}Xu#IiCa&BBianHoX5gGj-p``n +zt9mE7UM^cWTY$X95>O+QGDYlG2^O|y5~@1h^7Q5-H<}eIVM=ICFpj^PPDR8O_+!~M +ze;3j!)Y+0CEu(8yF$o?l*PUv7)W(gv3g>6-%?v^R3Cu_(MyCP2|H==`ErN1o)?-7b +zD0+Y2B)tdtow9CV>42Unr~v_QuI%7M3M9!ZQ%vm2tie3@ij@N^L;a+=+%({hrk?H= +zdc?l#tQ7r1lgB8htiEfWG`HUt^oBZ!2SBB+mCrN$y@#Y8T#r{N^$=fB_F0VHz7OEqu>`8FihhDEe^@j)d!(X2( +z3Kbk2%Cq0Czpr0$X?Gr^ziTvsQyGE@0A#2lAFuyEuKqe8s_*+Ahi8Uvl#-B;kOnDf +z1`t77x63pS|#)&YH +zaRf}G>x?4$Ff!6coNNHC35L$X_|u#}5?o->`^J1*-u0qZ1n9j$=%4*F&Neu3)6-As~MESu5H$!0@%&V3HC +z0=rCnp@dSwQPEK+>y;Ks>S|izYS>Q)K|>(1S>0O$4tC}dPowafoGbIiAt2M8LDWu@ +zONjO;cXCPV<($f)4O*p$0Nc6-m|IMVSyqnF)G>9q4~l0VyZ&LwWHcp?n2@(^cwBg- +zkNU;r<)@dvygYrixtfEu)u?A$rfbJD$`AOHHOvi;bl9FptusBNPQ4g=dQx8p03oMa +z^7Zfp=Wg%&EVy5H8r03LR`8pyO?i7f>SUC$Z3`-JSZm#3g5DDK@ +z2k2J?bduNU7hzf~VTs@}EY=?D{p`=+pl`SDV?(y+x)`HOST)1sof#~vmi*ogC$f0b +z^bn0JaUa8I;mOGJVF_l8`rZB9JUNizp^zl|8=b==M_%cpgNbNE{v49G3fU5z)c(B| +zL=Mxm>{Je4S%O$d`*&B)Lrd&%=BfsfT=1B%pFaGE*$2YI|5=Uxhv$50UhT-NSZ5`V +zmr&ph~=wYd0hV`}4)`O~`5djXE($)5 +zh`2!u<@{k73)-i?BudO&&b}Ck1T3*35#I{E4h*f69v)Jq#&M@H4|8Va!0SR1?g(^w +zx6RAaBgZAehcUXN;ZX686#A%G$btzdCNd?w`-({i#T#y1IO2F@{;LmB6<9_+eQ4_$FQS6e=gGJCgG-ga_^*ryE3E +zSe_vW!WCh21Ur84yo6YQU%^vOY5MDIps!*5Lv5MancV&)nwlFvtY?uTWO+KDN~#0C +zFIL5Y{Hc-R`76Cj+C5d6P}EDrTXN^bL^HQoq(b|4f4*K#0onRD&6LSjSiBJtm?obD +z6-|?z1(P6ySlF}b6IPmZ_zV4XO8Tu?22Yx16TBuG8 +z@p1Vx(N^Wb{k?Hz<(c=&HlLb7Z)O9pOdI-hX*Z@>JL)bl00mbCv2d3OAD +z?{VSJ;jDAqZN8_tG8NS-=YiH-O4=B9dU1QfHPpoH)*i*DT%Zk9!QsdnngA&j9pv1G +z40&UMU5HWOfp()W@e_IX!usTz)WofxXZ7_^PV3GHzM<+NZ5Nfa;*v2E?4lUn$M@Vb7pnIN?hfBgE3qY*z$ZR*>RZ +zbC(ikj!6m0*rz==)TRO)$*~Cu#Jso(w`UpuN*XYhGD@P2-Q5@<*6!~tD#A9D%|JrW +zhT`Kg#F%*_5`|;xFv^5UJ?9YN%PEuTSnAksLF8y^S^=s?$eOqZUjr?d;Jkdb=FS4u +zLyDTEgoG*<3}WQ(^A}KrPfwW~rg(uw;O7gN@EYJ+PE +zgp%&121JpCSF(#%ihwPlI3Ce3+&vCYq~Cr#GYvzUQP$u^7>zg8W=MW}_$7fhdTo=! +z?2FLKA*Elf_5O9A2$#g~@GAtLtY)_tVCX;$hriS>`V0xaRd$xckbcWn7pWGx8X)fA +z`hzo`Ubw#1ms(fhkpl|jg}~MN?O`hiw20_8I1em-TWhYtpcyCN@%_69^rnGO~Nb{5iKCtgd{+ahmM{_Sy|ExbbV-`M-A*_=^ +zsf+;yGt$I`ONeLOJ>Hdmm1mN&Vl6`l5GEIfv^R47@Q1Wt6N7pKt9#?Qts4Scomv`v +zW}a6lFaDG;_G7{FSoNC7zRC!YM%A;yDGK%g(W8 +z%ip<}KYmUDr6v$5g0PhR6rezh)-fn7o_Eq`@_)ftUSFe;9LsCjK4+@(*tjJ46i$Ki +z#X$sYTD6Aq<1mN#=IB_a@F7l6wz{0Mc+DTx +zMt=D&tn@CGhw#06;h2WHsbspg*tV7B{zx1q>K)B>wbVXAYP$2YyDeGcV8(3GX6 +zM2Zd1j$5ktnYzO5;bddy?Domgx05wZ$F9DB9#KTR0N6fsfY5z4M$@$Y3sJ>#sF19> +zdW=tf!^PUS)n3EfikVcd9#@?ro*hA)+O#txDP@&|;n>@+C0f{nnXn3yH`7_{?--#wIp=V4{a; +z+TYZ_O36*wh@lOEv~PvfB8x}DO(aY<@4D-uOq|6>rcNe)%x$5LJ_0ERuLq=&u!2@o +zGD2#k^PjYGmpDiKkfp#{AhT8faI0osoxa%jxJnIU{Q)kHf8Z&vY +znK+FqJhxgUqnV!suW%3z0bOTd+ryv`{pQoV~8_&pAX6Vn=?$rOmgfXJp}TK +zI)Xw%M3;H&UsMCFU!7-t(A5m{aV#y(?^(0SKsCI+LPO0;XJ2uG#6xkR7(9t40hQ9@ +zT1owZGvUkVMnlW^ZebqiyU3U4BX}=fU}1s{2-DLASr(J9+ceOEP~R`$#~y2-^wy|?)#J&tvq8(rSzm?fu#f%r3Cu7&_uV0usY +zgno-!RsXqvJr^3leQ12TbqX;n_X?2uD2zp4^E+j@KEsZF5Dg|PN)G_BsH->QCLY>G +zyIMRp?&^iV@d}58$Z+Ki>~lyM>H&m;+4&ldb0)ZwyOgAJ&eD14^fBWFe@xTZf`OA# +zvBQHw|JC`5+zqYr0;y2ZEg2Lyj%#k-JG&$Odt%KB6ntp3;fTTGv*(;Tx+LZ$eh!@Q +zi~xVZ_8rRgbszU2w&8J4&kB~|`G@NTG_kJlnBJHOXoikbbl#op+aMQwm)96;8I>+& +zIwM(#1@CR+(SADcV2>2`3F~cu8@l>W@k&ljYJWXp(az*$XPDn|y=W+r9hvipr$5Kd +z@COMsFI(H~u^Q$&Gi-{^mRoTq=C9^{ACBtTt$Df@rqa{1iY%;%F{d60Lj+*NP;B>d +zzM1re3Mt7Ku0RVIF5&1g@0Vw#P(Gd_ns|-siCGP!M+fB^bi_XLmqONAzE49_zwV&K +zW#KQEuB1<`9$t#~yM`$pv{;Ho%o@J5^u|{1u*9ud&aU}HLtry2YOG#(E#8EXA5Uc5&@QPX!^$pTD(TRWLO{(4VvCa~aB#4=CD{{KVnlpztRw<2Y(YY0Z*?$p|1CjlJI0yOatq+!vwOgDe(8`vnrFA +z>%KdhRMiAM;euxc;3AE{=urY3{#3QUQpgT$gm~3?ugM=e^He#!;dyi8kDl2`gdw3C +zYN8*DWNm9)!Cu+WT2~8N3E%q4mlXHtQDoKE4G{=3ct|sxdkrk +z9{WX{Jbb+luAxs{M~4?@?c8s{A@5>_Q(9^>K_O$!{cv{Mz!vL=2=77Vto(#xd?gNy +z@CKyo$$oC1BGMK$jRaFT=T5KM>D)s*3q5ii=+3PE9t;Ad#&Y$>v5kgpq9t!HE>`>> +zuKN@<=B)4CO~s(-RhMOMGK1Jfw-V1JX5KZT0y3%Zmb_E;12@rgdSv9u^WW~7H5}>1 +z7ns;8myHBT}ZFO^mBua*PmKILSO*z2ILfkMqp;fDM%kk0UOFZGl4|%6|-RF +z2bd9xyRLFF{^b(H=${0U)d&x?e)hbXGvSv}7lkqmOXhWaMx@OhtSv)bx>`uejxO!3 +zH*s+sL#LC16TN2jFcnWW?o7M}y@>ZnCa#V}<(rS3`fXN@oR0dWa1&?i#?ww@r=tCA +z4St1Oq8Tvl99n%EXF?_rRRS){_OV9FKq +zNRIB=6`KqskBC`A3P~gvqq=-vweKOng(y^Dp~AXY`KyV2N?n|j%al(20L5*%T_*-q +z^3`Gg{fQ`d-0mw$W3-@SDOBTjKA5%-YSzeTq+bgEK;8TfR`L1s&Wz#!uH}Wpoe+EO +zk11-E$-K?%-^hDhySGDH^Z-28Ao-SE?Ns2uxUvpHcp&iSCjl?v>DByQ%k}M9>*U=n +zARBx_qVEzhG~qwn7ewWwbqm}fWbq&^GfY(H_N3IeTUAM<`upTM0Rm0`WHhp+=<2Ki +zpMyx@5@XswZE1@ll%)?*FGdDQuKxtQt-~!b&@~UMSq15MlmjTxrS1cv8(4XSKMnN8 +z)vP8B*Eka@``S2yXDr}LaVD;X4ov`sa*`nPFjtXa!7ljGqF`)ru5q@$h-@Vs?LdC& +z=_K3|Ag1UM)B^fTSQU;ak_zkTxjy&cm~FR$NQ9@?)2ZVJELO=sfrtiN4wA1zif +zRS^ZYNl$Cgw+HB01Z_X+s_^x(^N0Zv4>$_PmKF>4iSywjGjtmx>yhfv1ox+ +zcyC>NLOXX+$-uIwZRRT{fu{nif>cDN)p!kyZ&+3>Bu`6>hqaLR#+uU)LCmfEd#KTTy-P*6DhHGiwY(qB_u +z&15Qi)W_{~wOiX;(zsVp|4l8$*2bo9TG0D%!2|$n56z_<2Vq! +zk_@0JN*7%eVJU_;3n?bD?c*&7nXs01ctKBv{3kPue7{i=*K~(2&jVz4rYUUuKQw-~ +z2lc3)paSbcma%5DGKSgBipYidx6VS`=|6X{q}9TTSqJw%ud_ar;ZUX682-`@I?IWn>emj2#r>=V#5%meNMkm>bzMD0UKRu8|!y8+snye7N)CM@l{J-3$Fq +zy&FXF>i;OCJ~A6ER;(BdBydan9A{El{-I*-JQVxsHGTDi>XuqWM8s*e*ajg$-QNgJ0ROB%8f#OXt!fDRoxjYA=7U|{t+!x8uMp^u)ZJYXrES2dZs +zkChh~$ky@~hUN-kpLIJgB{<|?!)fRU&dM?yrTu=uBI>n;j7wL@ApFDc*Nr8;(pEnQX|8cy7po@ok(o^sEMVqt#Q +zTEyYB%=;Imzvji#7U%r+oGFdSp-x&XYlltBD~z5Bhfd$zA1D`uTOvL7$mt9kSlfyl +zrs39jg7FdfN~*;1 +z$f7xucWa!&s?k(#qpe|<^uC2v%wWwtj8a|oV+jH$N +ze<+alvGNg0Dp3d0eyoy-&x>JL!)8x8=MZ;-Kx7s +znyy5h5yEQJByI#{crfiO=SrWoHGTt$7rKRD2_P+7)pKp&MhVZjGA$;gdP0#PTEaI}=BWN{ +zK=RZ63+$l2&&qS_F8@mETKkv>Vl{-P0H2Wspm3<0Np`s!{_AyoE_? +zIYnpvmnewLd@^BIVAK~GGrFvZU}f7_%CEfYfS3tiijl$2q>3cRkA$7TaHE(}$xX?( +zW*lAWeSENZi~g7&vNA{|iHkxBb$}2GS|H7G(A!AhpK0+oxxjXZ`1B5_Uj(XUY;aQF6b=1s +zqpoKkC12Tgzm~@}myS~d2-emfZ?++8FpiHVpvQ3u$|^3X@}snb4~LD({l)vdu@CWGFgU +znde)6VW_L?d+aSVB%BY$fLw;o1(_<2-7o__Sp@EaD2;N`K=Uvd5RNb(jO +ze!o!NK{{#==wC$P4_dTqtO2j+Jd``ShN=wKMM8sPKp{?GR_krQQ5630eT*#Tw72h# +zomd0xKE=`J@`yays({e(N$~H(BpH`AtRd!YkOboCG@bJ)bgm2Xo9;b&r +zJp%WF_^B;?U!tWwu;4?B9a1^%+>rBk&<39UEB7LdmqwUKGn}{c$Yd)LQg&T?y70AA +zUH7ApGnU_L=+H6JOgBpV_pgHE!xBQ(3D@#CAK4g(JaJr>v5~y_1AyeBtBj+~IH}#X +zTD+-3Und2e1E~(rqudxT9Y^+!JY`M|`Q|R3x(WAt2c@BciXt^}lDhuEr;|MP*fLhG +zZ^){%BwUR>862cA(zE-&1~@s3p(htJa$xPg7Zf7;g!Sc1XVZauXRDgEBRHt98owLw +zo?9|?PUL<(EWHYpbjL!pT&F{PHCvE?Wzf<^0r66Bl0!+xjk`U5o`7f2ncDp_1apb9 +zF`&}AVFs>OF#I$WfPq$oYa9oXG^VJv)tX}_=eL;IE~{hI#fdfn8|s*V^1dpkM{kuq +zIpI~Gen$&K;_PaAH#cNhZm1g#isyIe=QsNdP7r8j|F!jD8}gh2uj@rJo8Ie^=IO5u +ztXUxYkp5z_x81*slF<)PhlWcd$`lq@jvaQ?58BPDAi(9Xl{vEdIuikFJ5;$*Co={} +zNg7O0aM?w<7n?+uw_L9*50wT>8F9yW`Oj%2gMK#TC-sK0K~uxiw8_oQG)cTson3m+ +zCwmMBI)<9XS1Jx{tV5jYYm4ru5YYPiDoYbM?0u?`7Sduh@75UPYhAE^jZUjPmia0@ +zBoTbLrm-~OgnKqkvGa#!!U7YU>-iBGPlmA--DBo8ASISMKM`uTxl8`5Gx{iwmrw4M +zqvNT7z;z~7%)|s={qjH~&-_GTZ^`aFu}{+fGQ+W$MSArrg}p%9r1=owX7@CC98Da` +zi}e8;CnpgCM_LSq19HJ}viJGMC7Uk9f*G8$rQHo%R{4w^!%I-m=+LFOFWtEJnT|VMQmu6?tq3Sg?3WH=DOlcmLT +z9~PVi;#*HZsZ=p9L0x51(ga8)%%0*Nq3lyQUAAOh?5N;8VVP_yFMa& +zVrsHCTd$(6&D7uDUtux)#ACq^ZRK*iG)@vvL``gP_1hdywS8*|uzE$!5YXcb*Sfca +z3*Y-8tPbT%f6lGOwKPrPSjuHf0@uGNp0*q#y|4SU##}+>${^H0FAy0?dQ!c`9=KKV +zSdavoH*UuCdsNYNI=bOQEXS+rDfPOL{45AcnNfQ%l(9$TLV +z>zV<0m!elk;P)3SQWt0T&f?94l>ihD+M@ID-I!TzRCJM}dtwzxm*H5^R +z4pUF35c?N8^u@k7wIApBkX5GKcMzQAQ#;Rdyt2`<5gC3Hhtmc^Q-?neS1?{3S&$h{ +zHShG0G(70~MVol$MdTXa$cK*(V>W*>nuJk|li1eMhw#b>+0ab}7{mQlt&Q7ObeC9l +zutHh0imb+e2m5zJ(m~|ZIYa)xVjUHyv6O9L9TzZGb_;Fo@)80~qJ{Q!7RFB@-6&(6 +z;~ya7eKSoC?D#<~Ae}lNMt76l*FaS{{==wNzULAJg*^2A%Z|-z5pbJ-G~bxQsHepw +zJ>@hkzFr_Sl^`-W@N+uND>~E@u8p4N(J$ZgquXdWP>a%{)H}>>s$%jB(_u>ThK~-M +z+AvWZ+1lO>r;1}eERm|?Ly{hKlBryTqo9zA2(&%b6$y%?g7HOq9GYTyxPO%-g^a5O_;te+1XY0 +z^Qow*(E+h{o!1gU>X6vgU!a-`NAzI;F8Pf+KBMRi;Q&}NXsEE1Cto_dEaux8-T#~BhkURN*$8%R<&dPMnWK8qFbdW4^RdOt$jIttY42AU!g&t84wB+Xj5PdnrI82CUH&=7VLVg-|!9yEw_H( +z-YP3RSEa+8o5CV8bd19}z}D&QksbeB69j|L|&83f@P-bI31?bdd +z?7blPIjM)&$^>cn0idLHmExn&2)=VUW2Rf`n+Cx_525IJU8imGIfQyeR%|dSO4|Cw +z;j%kk;F@YQMsEVgM;P7JegvIlYki3&Gn`$?V=b}cF_^XK=BC*nVjDj3()5GQF)wlm +zFZ0##u@904G(tl5y3^vkmkF(?BpRXSt`icA@1qC5te1g2!Fhw_yvTB1j6JxjO +z52)c7{GQ5y%70@2;iO#8u-Ks&$BTn|D6IB26)kjGr-&e)K|XHV0ndTKBV{L1kEEGN +zhRBIqQk-RAoho$MV5f1v1vf$9y0IhoensLxV1hynfyC2l!*~ +zR&h7Lz8WlA7C_1V!&VRZRs}%?x*l9_Vp?jz1K$XCo5Dyza8$$Jjh^q#05y7F0;&mRWKq@cOX +z^wu4u+^`{|Q%UypRq?>tAp@NCtcUCZ@nB^vE;a>;s|ToJCJG>S#sQ`uePgRJ1d_`@hAms?6W$uQU5YB@0V3Z}+i*SG23gQXra!MnD +z1DbgPI5-g`0Q$78UAJ>St5&R{tD4YlxjV5{n@;Jq;R8` +zglic2^ztq*=c;Vv!a<`y5+$uU9~(Kyl=h}>a(oHhiMe}wJF@iV<~i)uFfDVBigv8$ +zr&Be89Cd7Hw+>N!cWZHev>F#L175Rf>coFsfGDq5F7ZN*;*&)jkGY7PhSBvmu*eLa +zd=>SGo1V2c +zp>4|uL;Hy|kUNM!} +zXh6ZTu>8axr_HV1(IJJl*OG%>UO1Dsn;Y2m*~AUMhKoV!IyzZ2NktK5N(eLteqQIi +zfjtW@*!U3K>%kwh@!7N2Bi;UOwoh#T$FJ>Ub3F0uDGp&n18E{4ec9O87C}kvi3K)5 +zX|ht(GXeDJFw!p$>@Q#0d3y_<(D@z?$W^UmANFH*d +zR?f!!)jEQfT!GEjY2@?ME~5;?z1I2UzWkHg#Qlzcc!7EybEpF$Nr)!pep|F=%J2}Q +z{`#=j42bWeKjMjMO}^W$o&*T=Ng3?xh+Ec^N++KJNf~EBw29OJ7FJq+R~2(XaA<>iQOuAoYQS3;@~ekJ5of8*3mXAoFGLm46MrNnw74fvs62(=igL;nY_=B)W8j2B3Rz+Q& +zOl#e@UmYGA&th7Ai;B@W{Y_B(m#AmvCE?_XR#obsYj|na*%Kl!XRL6ffgUS*R9!~R +zdQ|W>jISCt?ca6BXY%c+wz8c|!B|tbXuksT +zOKmKpuEB9|-^yF3{z=V}5l{R%u`-}3fu?_$lfuL+e&zw2v0@-PNvq45adt71F;=}w +ziX{vxTNuEf5#|x5Q$tzu+IzrhN96CwIZSwNmbyXcN?xt}no>Qm+Yv`S$dM>0ik7R< +zn5R^wdQWb{Id|NZyFGOX=3taEJe=}vWt?xj(gas9vFtZdNJxcMdxgyuuP3rHc^pT~ +zZHoblyg}C5dw$b39mmwcd$irm0*^~dyEZ-hS_vc!FX6_*HgR9W}$C +z2#F5kq69d8<(*DBNlEa>+FyH~c|rlprp=t?)P+44MKUSxx0pOGs?9K){Xfi5H$_s6 +zEJbond!Ol7(qtD=!N?2=(Ul?ajohi}(Lzs5<3t*Y@mWDv?s;G0^bJG9ycH +zN-*TP>)ha!9LNrIjaQdM2duRZ%y~ejpC!bODn<7&wrP~2Q<2j2CQm76a{Yz%d^$XK +zJ|8ThQF*A%{E|FpsZYjEd+->&8&wBSbOXwk;(w*USS%v+E|tXaNY2vMRukXMH_HpO +zsP>dk^O&UdJmBY-o?~s$TU$`n+3&k>igyQK`%A12tjU3afuy^Kg8vWH@MeLNfG-VG +z08usun(7q_K0nxhbPcRhGFmLWE*a(8WWak$E5K0pyLHmW4%?ak3& +zijcJs|(#n`Ndo&fxd +z$fCu=Q(3WPy#31BrrY=Do*oJxubf8vYkPhlt(#5a$v8d!GVgFVbljiz+4_33q_xYy +zGw{k>gaMK1=zV19I +z_sS!N*pe%5I_b5OmHB|h5IP09r}x3f#BZ6DbatTMZP +zxpUv{-_lru9z6ut5>T&JenyX~Zss>_SzTU418^Loy_Zc9=JCmirEw}iQ&L_VNG_yq +zI2sTNo5mGLY7%JODkxkTO}#ztXizt-1-{+n2Qg1_3_KV-=a`+QjNo>Rm&nVinW28c +zEoP|y>`S5YMHGa64Z0M+co{>0IWt_WF3D7aM6Kdc)l%~^`59`&!&3J407AA<$vh@W +z=RbjgX79a|y(}n=A|{S79NWDsQ-bT>;)!185t6KgSgK335C4S226`LLJ=qMDv(jrp +zIPBRWIqLmRyRMUR=AOX~Cd8C-{7-QcH9XkZBchZ9wYRpnC1e~Fve#0VwgM)|p0qYy +zu5*Q>+tI*(x}Mjr=ETNnc6FzoyWu#lny=7WY3(eeLHNrqKJM!m9U!|L+D~-EHB@-a1o04(FoJU +zBHo>3;nj?2-F#6*b%q!RgVN1PZpX^23@pX0K>pgQ9;`vJI5yFrmlz%)>+8LrvUta; +ztE%L!$lq=rfv{(wN;nbpwY-#rd*DujPJle<8u3w%(p*@Kq0)RJ%%cHpzZbIlD>ACr +zd0JUFd3RcH*p~+AyK?;a;NqTb2Jp+9Jf7;Ew%%Q}&Q}Gkq3Zh^&H^5kAqD~xxAx4H +zfEX7f9!-s9&_u_UcE`ET)>()XFW|$L_zUWn9yyBQK2(MdWDy-3|5&qmxMn%fXB2eyP5#?i`q|G~u3S0&V)FP(?M&zuDOk}SgH +z*@{%PICGT05*?Bny2hPU)Y=5hV&fy3?98Dylo3lv`PqW-HPx|h@ZZX{Dm=h>z^8yy +zvI&;;#OpO);dc@hYV2&Nm?gkuo1XD|=3?^rdKwdBI+2wyadu{J&nH1cQashqW>Eg4 +zk86Zb1JNFiFj%{ALG}?V87DsWXe7>o`hReDdQhGi@Cpho;sIy++lt0wo%-=5Zzacv|1!e@(u9+CaToG|kIkkT~?CcN+j(;UnN8}tbf2z_n= +zZtDoDSyGJXHBXP!P>2>5rG9Ys)p#Jsk0SL!N;lb#o+#3agK+nJVQK!r+IjQv9P$Q; +zn0mYaWfhqXVWa@sP%$k9Ke5y6OeyaU!>E(j`9%Fi%^0C<0UwG$56S>qR+)5Ft`fb@ +zGg$TM06SZo$*$0jdli{souz^&R{G$_ii@J5+Q{?(ze|b2hlM|T*58XA9d;hiA%6u+ +z9A|#Qzgnlb{be+Eyl~`~PJ`n3(W@$~M!VenDR1P%nW%#gaJ_|%OUDp$&FU>LLIJWn +z`SjdkzaxnfhwnN>4ZW-O%>WB!{Ivd_h2m5K3J_Hk+@$lk+{|4Cx?xT}5flCUH{b?n +zhk*{w{Lq^7GV6s$FVk21OF~A?9V{1+_`#yXgYz3?P*jHsz9VqfYX|R2*N8?L_66M# +zUduP@_#KwEqUT@lYA9pu-|3$c;{3@z$4Pu?2x%H`m^eQA1MPig-Kf+^dG_+^{n~nn +z-|~i+e~ZeWr9AG;q@^SIfj1l4BBu@C$|JX*LvlLJ5=V>VT3yNQ%z +zkBF3+n)YYwdHN24^>n~`9TwK%ZVd^%--m>nb5i#)<+C8T2?Y5qgS!Y8E8X3k#!qdWPR%t7?Ge;{i|m_aAVAF@Y@(+YrtE_X+$`-N?Z~d9U@($CiZC +zhr;XNd&Q`t&}JvGpyx(IsK +ziC{>#sfsfP#^>U^G=cXPfp*KQafY$LNRBWQsjj9vJJh~%XR;JzV|3VS0G%0+w)~Jfa4R_ +z%h9TbiHT_n{?||mj1n#tG$`E +zl|XX4sg08Zocm)NfJ6B(Ky+HL?|k0{r-%flUflr2&II8t#*B-c>#pl7lGy_n0R#k`7IIA`vwb=jt +zC?_09%^`?=Ne*oo4cwxQn>pWp<8yV|-^H7RMy#iJDy9GlRHm%2_U-@hI3 +z1auzvOoBm7<+61kbm|vO$XAnX0Z8dqa*@xSxH>ufP8kp*$Sy9n6)7FyxEC-3z(fbI +zG&`NMUvAroWrjzqEu?tvMP!Bw%AWrAv`6Vjv=|e;*;MNFoWC+aP(iZ`3bxqJyaDk+ +z4+@DMwf``J7xEtwyS5aVu3wV_gZCqfr^9S|?W&D=ne=YPGBPgi`74dB-v50+rv(_l +z>K)}3?q8#rq9e4hv>c{H+;PkiKuk|~`@KIaFAPD`zW+&AGUA0tXUy*tpZ|LjFaV<- +zmW6PERr_-LzamIK1xde-j+gbfm)mCDk@Se(D+rTHemC<9kba>tF*DEbyg1PRUq{6# +zgt@XxB +zNcWb_kO_JG_%WhJcX6}tTj~*?dNsT5l2Aqaw`6xbsucGFSICBoeQt8)-_8Q!r&qw{ +z%w4fPQTWT3F56`ME8hh6K}mXfFbPL&Lqmgt`B97Ne^X)f5O6pG81`Q{y8q3M(Jqnu +zT7vn?MrK$n9?*ye(e~#x}O+X@4QBhIr{a9@HzqOc(CUWSSjoxqBpF@1)$CLrO +zh&%o%e7^8;^{|&C4j>NIR#&o=HmQgL68RorOS0vt}_gmLy3{w~&YbHk3yKIg;yP~!^%?M_X4D-ESwr*~frt(%>B%BfkNKO-%!eaNT +zS;WM=1YYVm_xrz>G|JRi_`*^WZe7}}5h}FDpCIPjQdL#erSN=?E+i!6u)5S+LG(Bs +zulVE^ak_X+HvXnZq}x|jQ!mGKQrFS`XI&*Q$s94Hd&~L;gY53^&WJe!u1XWs-`nds +zs*i__ZQ(kz@3k(3(88GzD0kJ~cR&MtoiEC4x87aiCDDHt_8AhV=k&QD;b^TtirlVF +z9Pn;Ou`Gr8`4Lfyg0FloM^jr?%YFWLoB)sbI{>2l0jO&D0a{-LXBM{^%iL-^`@@v8 +zCh2#xj?yB(@3k+8pB6O&^SND;kc!A_0>3PaU_3y$&+<-6mWzuEYn%jN{Hc3(!0saN +zX7^6Ge|QOeMFrRpPIGvMA@}wr$jHgX^#rJ&Mna60l)_R-gWHjxR}>Y=BSJBO{idU= +z+FDJY^B+__l%6~3G?h|PQYr=pEgcDUic(VTf<npLsI9C_?d|RD)XzKFwbUNG3e*^5n$LdgVq#&f0u+c?pwzX;R@lF0!6JJ9axfOo +zY(j^wB$e9H=YLO6cupqN+PYA~FPn-%>OEp3@!H)Ym~?|)Yutys_P)9ZzicN6xlp`c +zPN07sV#YrBpIP32@;d61BqQrkN=MI4lJDjZQw}GsZG5{M!*^s1G8aW7)^EW +z&^b2=-IqQ;MYw?p*W~wG`3PQR@tTF`P!HcwtvT+3?w_*Y4W*thw4fXh~E +zDr|ZB*SYXLKpEMr0BCOYdN6+ +zcy8Cx-mrV044gT_Cu6FKCa>aIGcz(Ij<{QanoF|@+QZH$35nM8b`FMaJLg91sySe4 +zoq=0c*ZvKf(+shWT(u+55zU=SfOSNOiqZmn0Hb{Nx4Fms?e6>vfVnCmPmARNp4fgj +z(1hrs=E|t$?q+{-NC#=EyTr!aJXiSUc+^^NP4sH#D5n>Vv9Y0{qI1@%m+fy$mOJtx +zI@5UHeZVOnYD^~X2wq(NXOx*R$+vbcr`rF$SQG@X#lrv&FL58BGgU8e+@`hr$jZvD +z01Fa>X#55^8>Ivxw-QA69eeUGxI#Oe+SOJu%FXX8a2FhadaOt9DxxVO_)o}7SJ#tA +zU0#J)kbT0}OY{F?2E_XFG66@yV8DMzK{gx#j}XOlgu;z%K$h|?AY1qP6KohQP3iIC +zho0|Ap<%aO<1Pc@T$-*lFFm?d6x!usBd+qgICK?t^GhPclc>o$ytKm(`h5 +zcQ1J|>ZhAlqFoikSdP^5pHKboT7c8+glblSLW%tEj(vKtc^^3fuDk2l{2nJ5WvVPZ +zZ@maf0=9w^aHREQNCms>qNboxIKY4#WW+}J7{mZXvpS(`9}@=9k++*#fnY%DxPM3(XH}>PQ>63Y?90sjFbn0phHtV%?T&$ZHi3&eDEsX9jL~@yN +zFY(YKzH2somqZ#DAQTgFLAq|Msv9nXmU|2!QPrVlKxa7bsJQcMcxdn*!^aCFf`Sy! +zMV9*yw6IV>GGDIr+~!=J+AyAOkm89Phxet589Gq=9!8}yZh$fnQFJx`Py=oWAaXO8 +zQB{rN;o<-n8}>-lKK~N5UA4TfXh{8-@yBb9$Ucw8}a=S2mQ_Rflmm+e(%X6tM!Rb&2gxUx8jwt6=c8L1e&BV4KcE`=26K^L2K-FY+T +zH1RtIGlipuVHNG{U2ld+kLjR*l*z=k#8H{v(V35jp`@PTEInw=mV?f8d!`OM_l1EC +zX>8AuSAaS>e-iYW9m7RMN^AW@m><>OLl7RV3i!vKIhFZ;5rC>L*qN)lUie}q%C&M( +z_~@%fY)I#_)3~~3H_$_m4S=k>kMQ+L)a~jPQTz9^;s=1kyN*4#Sr$pyND)^Wjpq5`R?{J*WT~@?6I`JRi6~!&^mn=(RYGt +zv^%Ywn&=P5=|mnDww^J4N;$mcqWN%Y4|Ebpy|ss)PG@Kt?92Cf=8(vEzIh><;;3f0 +zFP~rdIny%0A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 +zL)S&|de;5!!DCC#wjA!~Ms)9=tBXF0 +zndBRL-(-wv*Y^B+sM0~mF%Lgf_a^dZ?&?#PlUY?XZ2N}QHx;>zu=eVb2}f2usHvB) +zea3UH^igzD&v53-pDmaq8%oUZIwUN<_RC%++!affM_y$J1Qi~{4G59KnM5tQkC6iy +zpgyH|7;Pp|I+0w~G8S0-vL?kBQYeB1qqt2Tr;ihubt40x5%T(KciuZ#Zv2NKGSt&( +zvXb}GM_(xJ6b~KUC&Q$#JqWY0ty_Q)&Hgx6 +z9TjSP5$}nIO<2|H9ptb)*bZUf!+Uh=Z|8n$E>xh)ONcsF5CP{jm1WwgGGX6Bh`M$t +zt}u!eXZdDPqez_ky~QkUn`WYfw<-m2alS)wO`Vw$(hA3!oL%YcTnF(5{?1XO93rW3 +z?3Wc4%oBtGn5vjDTwp4F!gDE|ky=C631_+89li1*rUeO%SyXqBY{6O +z0g5(If5Um848@8FyGY%i4-~)dbu;rK3hwC6M+%nqM^7jBOyC)MR0|VhI4k=47C~<^ +z&2}hHiQ1KYWKnSZ<=yclV?>lP%6+UHLHk!k3pnrxt35$rh}16#yRE4t)5`@vY*m#aonfdq5&-P)$*;$@RxAGrh3%{An&^@naXS^ten)GRqO;02gF~YmDxel5GAn*IP +zEa{4V@Dll*L$e1nKPY^7sggc0moQQ(_IdNs4J7NM&=N*$cykU*@5-Jze9G^}ISilc +zb;g>^E8+;>(;~wXiE70K*p#OZ2{&$XFy|^Qgvi(fc}gA8Ykpg_LaY#WXaD8N +zD^vUJy<={V6QY}%1)r(k`K{FQ`0wdri6xoZ3Ey=e7aK4IuvqsE;iXl_degIpK)xjj +zg&I{L4ir)wmaIt?Abs(u&++Tf^xuSI7nkaX&8qV7j5LGpdsMr +z{wcH0k05|TKDhlUuelO8=M`?)DQUm|OpDIhwQxCl?AKNdnXQlRnL27tFFGI`$)dkl +zc@Xl4H2GW|;CbI8z3tC7lClfVpzimlPFj*cFL@IzD+Q-neFky+Y|q+rwVC;4BZobH +ztK3b(B|WmO^wH4%;Ry@Lf`NL2Y(JGiG0*dUHf0F2Zlje~wxj>OOH=~5!twjgpwT@p +zOA8UsmWV*Z!0d;4osdtyonSye^}r|h^ktjICUK7U +zlqVey<+%TH1%ltZs^a#t&gjXqMWp>BcsA`ryn`#+RLXEfOYPlSRW@EhB&#ry0plWG +z@(!ho^%guzIa&)hyQTIe0((J@E*B*r9Ty6nkse*0G~Sn{QTXS^cbAQ&JL6-(5jw`)5gDsz_1v_5~Zf?Vm};#tks8_bz+ +z8r^QoBtb<1jZWRrnV#S`cN{!f&eCe?iQmv`Y}J-9&jv +z-CSy@0)HuTm;GVVy>&Ik61f%_to}y&cD+1!F}W_QcLLzi7hxu|ZubY{homsY$nl8` +z``_3Qy*dgWuQBb; +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 +z+AycMI&FQ- +zZK|vInlI(fJ5!6G|4dv)_&I?0L{afaT#Gdvf$PIPZzUO@5|!*3zt_U>oNy$8-dv%3 +zF{lS)1RNTu-EzIFbu>THbjSCcOV6z>{7q#Y*<6WPf;Y+?msby^r5h^e2#J&znQis# +zZVzuYh#fqS!#~p>Jj`7{J!CWfefd-RCDYlefRDiq*@H^J6177LFhvN +zWv=H0?xnN!8^I><#so;gDff2mLWI5ix}4|rxL1};z^rP18S)RVC5*WJ!+xo>=kgrs +zI+k9t=`5~&w2sgM4m#z6;HI&H@*Yiuf4V{qtjzihZr|H`pY;Y2g_sv>ujy8BX=!P@ +zf8*z*ba1$|7|eaLx1`rPt@I^ak#_!B%7+Ih=|;!OYo;bA(yf-)LLK4n9w}rGEkhdS +z?dk`s3((`hB3eftHFlK0CT8&%hB)rc&7#CrDBy?Vvl9#m4k7kb5epZQQ`$pTqaeAm +z^x;H2!-(CsCRe@|eY^`%dmUsP&4eI7#O-!O^F;RInd*meXA1|!|7romQi&u7ca9V7 +zV8g~njPvlBIwjn7wsA<=U$AN3kyy{2V@Telg)(@Cvx4SkIumB_5hwmSfNvXl-(gOQYW!$&p9*fQ0hr;o2LHinSk3- +zbAfspi|rkN@yar_}(?%v@sKyFOGdg*!P&Z6^Y4pleOopf$)j*8l0CF3hv +zqaNAX?G~y1G{jT1t-&=po{TPa+uRem(jq$>LY@s +z*($ee!_LUf^19madtqsyMR&b6*7BSLjf^-5`mB=cKk1_s@@LhP$*LdwzZ?0c8q9Zfe8 +zXj$_w)R52vIWDu&Z|HJq+&*AZ+mrxk@9mK=>j$~wXM~(TNAr~8M1@dwLpwXc)!q?T +z3S>6-5-fyl#6kBB>Nr7$z2hiP$&ShayMP-jLdQuYmi}jHtX18q=TBzQsl{2B`F7Bx +zA5?`CgfCAckd>x8{zJROWlyJk`}eAE>62kth9M(On!wX|ornmx7?GDL5=s;&6L +zDjmlz-{Z+cY@fX`+6^!Q#(XID>w#!e9X0Z+r)NvBSe&6w!8Gl_@V4!eM=X$)7xkAH +zWx*jKEf>dItj;GI{^Hc1UE8hH8f+e|^`-iuHl~FvU>pzTBxRs?ty5yKTAeFXYGlyb +zZZ4ZwkoWwc=o)`y`@3%L&(HW%Er-9v1bQ(zVxyn_=A(e5%*DvQsIn{l@ZGqXjKVw7 +zVx(kYM}QD4whvBzclCJ3TZix@D%Gc`!#(&=^5n$;&5IZCsP79x(q3h>xcKRcot_h^nj-}k_QBa_yCb1$2#kX6w@rAAWoyjjJmxil +zzg}BMALL}!29mW-<33hG6-g|p_dzaW?*QlI$#3D`^@3(`A}IY6_~!lR)*`WWD}lJ-GDIi6lt +zYOi4Sotg*tlRY7#P`&vr577}bdX9pBrWxcqWh5tRKi>bd<3)4ybXA~7V6tx1tIRU` +z=k1^M-wE|z@nJk>cg>b~s9V5I>4I1?l0^Kp@fz0R +zt&>y^dN@J$eK0pUoO;y49_h`Ql`NinJ^#K0AotE7WG7RWjXEG*MhzeGruppIA~#{W +zH`i7`l7b3B{tTOLsR4LTtqSsjGvD0!L`mKR>N8d306?B=e%3<(p +zUT1W%z79(}r;^Kg$dfY6y+f95F#=tfJJOx0`-|kFfk{iEJ&DYc=^vb8k`O=kZ+>F6 +zMK091v#T>nAT>m2`y=6Bm|hQWu*~>dg_LeL$X{$>_DkYWfl>1_Wz{IH(9ZR(wxQ~z +zjPqH*l%IJ@zHl3T{`w2QAQywp*!(*+C_{&T`WjLR7IGFEzw4`qw&SR;KNnFqPT@sn +zCt}J>e!rQXYH21}pv)U;WN2hDXu0$Bs%w +z^lqv`aQ+k`?%EW$aWm{dqgj+pE9FSehOTQH(j3ozOYU}UfC5Ngq_(y;ptXtSsgj)n7R>%Wg0`ieWHH2C3m^d;(NngWy`K1bd1;` +zm*meWFA&r8Z!D>X!**^aSQtE`~TfMi`1R#j% +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 +zIb8fmcOO0ZCT|JjOved1zLC-Y-E27H +z&MC2vV}t+E3IjITawpM*{(ldgfdneT2^`k@12mFm)*}X2!Pn9fz)uKl`uveFSv)Qr +zWj^s@gAP}@HhOb2^sZ|7BwQzY!(;Xv4zs}rV-&~E#6YXg^A>{$Ij7YJ^Y?A=BYXKZnf_QD}t`2Bk3@`mu__;gcqcEn)Trt+>Sp;kxd?3=7L1c4fH1 +z_?QNb0j;y`%kQ*u=Z5l*d?>mI_oYpDo52m2H`VHoD(}u+vihvc&VPsDtTo^%V{XcyA>jPl!fDnKk($tIQRKQ!PB)MiTj +zVEXVB?{}`8CS@6oO<7Km;6T`P`1MYqgR0T&)i%~@2CsdOP9c<%G{)1ec +z;OBGegg@!n4p+JjTid{3o0v;}N^PCHW~!hdgd|e4e441s!l`4G7crY|&|Lg`&LX(E +z5FF*X^~+W|Hp|g(KDJHQI3OTz8ekt@6>q-2D>3Ove+&K)G*5`ctad*y&0Fae(fBKy +zE-CmlMWa%@elUA05MX+8K_wORD)&jDNJjwT=62I$S)|iI0LGZH%cb*&0IK#gs4p^` +zDyKaYhL(XTSd06MZB#EfIXQ8#=~aG$Hb($2Op@#-eL$9tR7j{P-0{}DkRqDtE)aNp +zD4;7wahQ&7@qn7Lc>^hM>kwb~Z?udb;;j@S(};8n+PF8SD(IPX>Ji;e8jnLqur-+2$f%iu`W*zh$xdEiI-l80wY@~GZiNbZH9fG4 +zE&+_Q^08eqE-STq1i*~Q7&a4t7^c}ADd&4v4x+_eeNA8Nai!E1c&W?Uj6r)S{zJ)! +zPOHDLDS6NLTjo^@HL&wl3hyd~p1ASTKG3YN2msb8SwYE-TLP`AY~$GwBh+zGYT-(9POse`KV% +zGPEq2y`Lp)WJ4+b2L#;4r`)0Zp~}cztcD#)u=<9EICTZQVMD3c=gUz-t(~2n!5W~T +z5fcl`DDumLl`W3Q7CT)pFRx|S9I0y%VX)dSiIrQ9_d|Hjc@J3&)5pgOH3?s*(kfBa +zgK;Ar&^JXi?dw3ZAK^UtGgg=iTVtC^P$|}X-S$-~hGN%A)#4RJ^e_0`)dt%5uUU&$ +zXvLwu*3*^Ai0H|P)ptRN>ip|IT@aAiAhA$?GASZfPYLU#RmxoelZRMIq};Y>t_mdf +zUNk`8|GYfiwd^VsxvxA<;>*mTx-u!J6 +zQQ}f`YYfH5#k%_EZEifw1iH&Jo6o)sJ*@?!#{m6?fa0+;TUUkDAWMsQdvj^)@Lc?* +z_(8e=bRPu$pG5+YC5&$Nyl$mQ!kSFyXd`OUP-eeWIS=Q&sY*MXokIa!&P@EBKig&y +zil*TxocFBlD0n4}UM+AJSrOkkNxf9zl+fO;E-58fYcO0`qJGG-Gm96?;7E_{XjEe~ +zC@VtT8;|O3jN~49L&(;6k$ivN%HF1HPFJ}Lk?8wP<8n9D49|;ABMcY}Cc)qgssXgZ +z3|XUM;S$m%1QD%gYk$8uR@xsvOcH=P*Mos5G)lSQJPC7Zp}ipWl1%ZM$P_p-6PZvY +zWHmQQd<*HBi{$@m0j_rI_EJdmyK>aNRDJYKHAo^a%a)Ad9RIQ&uV03h3M!_Cu7Q`< +z^8+iiLA^sJAg(*~R2YAC=f^|t)+L?DlwADIjka)(U(*g~wkbTZKr|QOV>(dNzvy_x +z9V!@@Upk>sX3`g46@8v`WCMCOD&z&v;lI3%XFLDgTV&KilK&1xL)3*951+2*{GEba +z63as{1Bo^LP3X_7^Fu$Ll-}EwB&_aUK4S<=L%h({{-cfGtFZchFrUmw#Os{*R$9N? +zZmz;|d>K#g|daOQMum>3x0TroO) +zYs3e)g{}!ze(fw{`Km>}a}p`a-`;t%hJQ4OT?@RFAhjo&6V#@RD +zYb2{VFuMvM>$_p$FTG_ph$0af{QTN)g_F8Ku!mnUa9r?cP*j3NQ2|tEbr^^D@=~vJw%(qq=z%z$dt0rxS`HfaWC_2Ixx*1~~m +zoNSIz^Hd$IePLsWZ~w5d3c~T}XH9dZ#!u7T54w$PH+EQf+-9y@3iAI4ZmKaKR&pA8 +zJh`Wins2EWqPvWg$8{Rqd=|-FECElK8;lB-RYWT_?gkykW~~w+u(tYMGWW~#_S$8H +zE4JNvBIv+*ZNuJ$&+F5Fp8tO^6F>PulV0}ZWo#dLO!x31QP-T_DRP=VHE7b}Xv3mc +z>0NoHaj8}6YY7}w?;erBuFiV)Ay|{xf-}6Dc#7+YmHkhh#;f51V07*Pmo4F#SCd(( +z2Nv{@Nxk%Exq$&XheQ+$*X+m$yLN6nC)J6Y#g`s2NA&+e^g60$4Ysi{qsk}t08<<@ +z?Cy(Mc3DCo+>O^Kno8I4g;Em|{>p0VVAe5M1H_e>=?;tO^}h;pC~3w8Z&c7>_i%Gq +z>57pF!v3MolXAYoML6#+89@+#^@V7f9VX4Dk~3GV??+45@oR`dxPy7v>}m-Riq=%7 +zp9~KgqG+GcK8;c@ic3l|(|B#)8%Hgl1@Kxf@!xsnozgtix%9=qxQaZ=?6rHHszQZu +zGz>u{NQR-q4~7|uhaSwiR~69AuMT%IxkK`Rp?N6FT+fBHw^PDiU{+E1>T>AH?RR5 +zXSm}Ubk?pW4uXYC_CMkNOHRHn#Lsm&|*^rEtgO!D%y*j}W +z+5!>`BjJ4~()>{r(b(1ML=hhTm&aSC9XV%4GzVl@rG==H^AcM&eK4zpA&HpLTqbn8c~&AL=o{Eq+gu8HOgJnE-Ja(zdOyoLAO(n +zd1K@*bqPpgR>;2INK|YCb>TIG5{1)I^<~ww+ENgYYGBwMMf4BxgyXTc`UefuJfPjL +zudfduF9Fe(!~?dR_y${A60hrHRbZixZ=cDdF0FLOMX1s1)K{aYVznOOlveEml2=Av +zr?H>kvC`at;DI<mQL +z+1_|8wmx2-UBPvxReG){mn0ImS8)`1aFK>tGaLr?Qi0MSxls>$KC-l&WW3Z^T1-;X +z5Tv6lPVK(#JJ$b;JV1x5WJW_8oz_@4o&_&BRdRC8LtMO)39q9l8p0SjB|r{=Jj23!M6=w3$ +zhf4F24v6^VtqZ6i>Q-8XfRcEQ%<8I(tO4{NGn9dkMn;te(G7Szun~(l9?w(atufst +zR(-<7ykq3AwALL$7~{HnrCb8W=-_N5$X=0?8l}6XyE`{6 +zsdP$rvnlD2EcR#UX^3Ws9Va0iS9Fv9tL3*2fZ76&l2!bO7ToLU#t>OwKv3cZc4 +z&(AqbfAOLBGw9S7V`g8~I>~#=R7ifJ64U3W%kEdwHb}@G114_ilp=y5#?2_FZ8P0f +z+~TSIoPxY8N3LYjPd3Im;IRl&RiW}CSf8jg+_%mtptSF;vWA5!VFcYD^S1Br4v( +z!pGtAI~orU59xwR+2bDUIdK*8d-w9v((I;=2Eas*<5(h9B<8ky=&z%9Vud9N4Uw&Y0pYHYk*ag)^8Nw+k*#X_yE9$5ac-sI;{za1(s!|ld +z({Ws7oPjHsMuwUlxAm=D1ceBuF^7%Y57U6AOv<xpJ66-z$?Sz3@dv=U^$H7wUwdN +z@xfMBq?W{>;FIlUH)lIpbb8p6ipad~t22!fmF;M@PIRglfV_VfJys_?a2XhB=mKg` +zrG*-MdmaR?ADrJR8FQet8*3Fv&j9j;0@N5YsN$W7-cv8#LA80^^1z1Rt9TU!g)HGmBqt-m5SLV@BBe}Vyj5~* +z@i4?#Y2`=#@Z@#uj)Ow8-`}cEe+Z#)W>3|6n|a-Ox~9N9V&TO5+!oj4kHFwHsw3$K +zDP(|Mk>Y%moO6e?ZSCl%|}#@+bDK +zkd5a|G0A1G3f+Ipo;HL(`+Vjj`0UHO*%F0bc@zJ^zmpLV5$7%k(}T6rj*`RiG{}3$ +z;PqT!*2cGq%}w`T5$He&6R9?>4L#?q5JAd26klNfyN3mRT}^wCh_T +zHiz>sD*g3}d~I*H83=)+;7Wi<5K9Y#4>u?r#+*v!tOy0vKrqe}O`4UKnGGrudXBqX +z7XN(H*IHoemximx{dPO5n7O+pfcwVZdfSYPrRfy@T(XI(RuR)d>@A%(txxKk$k^zs09aB2 +z=dgpS8<%HwrCyVXIBj>m89|7Di{ICHM^_al;E4h7J@EDX)S$G>o>&YwAL+(-Rd4wH +zTd}$ggIuFDGLRVqA*MjY{rMY^mos=MPArewttw>8#--hs))#-uP;#0cH)y7?Eljtz +zoV;pz@-)AC5&&ED)79*!zHUCKPxZ`=T9$;b|8tz+k?i4J1Z*Uu8dx +zKRHOrT_1@JrDu6fSxh +zUu|z7F+Q4g8GNA=j`3ZrnXlWIVORlZvb6zEOk +zMvu;>)I~qXRuIfae{A54HXi-iGQ-hIE9P>X#!_v~5^QRX;$`qt7x73p%EFp-R%v!| +zG|*ORU`k^V?H8D@m}L`xBr9n-9pco`cm0h{@90#WAx=5f%OgJpygg~nw+=g87Y`_N +z9C)Fyy&0lB+-{ssRkEkbwK?BT5pds(;*Affrc3o$8=Y%QE2A=PTr_Ch@T8x-7wfb; +zM8?q6%V-(brkq-K(>eq`rSXl*ar^Pp?pv4HA%r!MCBO@m;#QGlA}^#;llyNERmR_N +zi~apaAJ9}nb0rW2YmC4auWwew^$7^225Qlt7Qn`J4%i#DY(LZ%dr@^LZ30O&T}kJL +zD2X2((leX$^9*=*9(EL9+H`0m@==5CX@~3&?xM2(%{JuM2#Jj9Nb03(odDY?)-&)k +zbpu5Qu|e?EMf(B#A&0n;-?Ky*S8ox|DW9~n}tGD1~_#v9eZC9=Yx6HPtk%Xd6kNyxG<|3e^JFxI-E +z{Gv&PJ~yc3wv_YN%^F{$OcgNvTXcW)KlK23PF(i$4+TU<9F)3ER}bz=)O~vJN26>&OCPx0Tc2{XZ;Zm81@UxH3_1tGnI(gHatd*#L&s +z@Hfg^O~lv6y3aKiH{g<9@#k$f$^=XW3g6j<7Xo~%SVsh);e!GgEmFWh>*@KKbF8aQ +zr2**SK?B}nKv!f=|EWm4Pc3IqyzPsi4}c?>4VoA@)!I{uZ%t3uT&Yb?h<<7ld+e +zp9Asch&3*BOMG*(903R_!^037Ngy?f&G=Yg%_WhFzO+P52LQh(4#B=J6scqdtaSxa +zv@m&JQ6)?Bo&(3`jJF?>vmgQnR73!9*99zfCE$W;TNC?mA&aOwLXrR!9sk_w^lR@v +z?N7u`^=$Na2@s#q`+1I>TqptGzW1(G(O6$mq&o=nOnz1*iBWPwUrfcnfiL9x2+Vqo +z7{JLYFmL*ZgPF3TVeT)Om=3s5*bF1KtxnrWS}+mHs-QXYjy7Ow6?d-WcJy~bz8RQx +zl;8@t-s%zmg7u`Z&ZTQ5#tv&Om#+^Ze*a8&{Gc{q}HAsJ;T(B@b8&v{&DOs`=KDwz(EzNdyX| +z=m)PVrs}Od`pMN0Dd|lT*`))K;05+C7(G0jRoj?v4RmKVL85P)vb&holApD&wU#_3 +z;Nm4VpD9d#`^VW*Wg8NEV9P8zBJ5K@&h54JW!qG;tq?&(Krd6Sdfj2rO#VhZ#+tJa +zis!VSK|Mjltwe!G8U*&338o<+EhTc4E%@`x3{j>dg{VupESHUO_qxvG2;j|+Ea3#z +zZ$rll^dQT*5619hQRI*0gDiX0E_S{sRpLICRjZVZ7*Mr;rSw$56qmvpGJaJX_3Tu4L~?;J_yE*HQJocEJjpFGVmUOq?y9C5^}Wxv>`()Dgn +z?2*e8JP|sXjmLXu0Ze*nz>t5(_!)LrgQcAe4vjGKHduext>HFu%o!a>w!OAdn|Emx}2?*mK##yW8mHagoU>X5wP +ze%ico^p;r87wmLlqw@!nRt)*c{geubda0d{qfo!i4L+qHi;s~VB(M649ZWNUqK1s!&YZCBlwP@X +zl}CEt)QReiclWi1EC6YFpi(=LP+#XZX)oq#{GPG^49zdy)^feWqO$HYlWozbpSMh* +zf^H~rjxvASzl^fjrza+5H@)PzNp9GPLuE7L7>P4<=Tey@IB+mx!Z%d#+)q-`j*556 +zuOM91op!ob3aHn}*aGjNL_uxyUq0l&JMxt)e+FJcHt*Q5hT^2p*Q98?Z9IriZb#Af +zXl9+4NdbR~izU8Kl+_PES5v2T!AYiB~-xpr#u +zR%*#*^IgFS;sIiju4kjf^p0657Vu&!P`K~d`Y8O4=i8>YIOR$y8Puz_aqY-1aXST6 +z#SlzxXC1$Chi^UYQfOOBDICrCI^Z~ld2|>?TF26rVq83oCSLHRN%UJU?M6e}gnN?? +zhWSyXcy;;8Usn(sV0VzaR(H01T(r^g)Q@WhrBoCvu{CMR=jDb?hZ$2tG +ziOJOcr?s{nG3E!YdFp9*?{k8f51SOt#^v=o!uho*Af6e_&!T8{z7by^*mj?0*$YXB +zWw|6{_ontusRAqK=2VIcmtsI%`;21LP)J=Cr0 +zY*(~j)4n+#b~|o-4!|_l%ufKM7!bfa2>X2Roq)WV*_!TOeb}wc7lHR?3x=C;<;yxx +z7U+xmF_vwb(idOyy{9c7ps(Uy|IW4J7;S)uhEAR5RS^r0<90NKQ8ZNO=;+I%-HrR` +zva_m8o0xL>qr*mHhz!sQK}&a?Ga*{4O_TNh^uS=)>3hbBh6{S0czXTYf>uS3cFKQ+ +zh7`_)%yR^s9AnBgi|?f{tyQ30Aj4ek7S(o(8^x`0)E3be2$i4T;pj$u{W>ae)3KFO +z{FcJaZO9HfKsjK4h~EY#_5xo* +z#RiRw$&&5p-~mF2^mnM(v0y#@c~O(1U4)NK>Nwh$OZ{ew1i +zuazS~P8u#_3{dAV#v;oq1cb-UIDw1fo8Q{Dx*;@_#Gw$D1_v&lu1{7FU*OR<_kOet +zoW6J#)NQgZzdh%*|}rRiIbt~p!l1vCDP5b!wqKdCyR!94qU*k>5tCf +z*f{XqaV%%g#`#5{t(<-}BA6G~o)F|L6OBhv)3g?edo1_201P6h3gp`ab9ra77;yAx +zI~hdij&E>O{YsG8Xx=YHlOiKLQ&qrgTu4Lq8kifp)9RjFl9&HNKS*;%-N8vso!3~z +zjpT)I!NK3pw=bOtu^v4*Lf^>@NgEXyK)Dge9T-Fm|8+6ZRJk~5QG>eV@w5-YNCE0k +zd2H5|_3AQyCTg_A_7M-1xT!AY$p9VxBsC{q_eT8=b8j_Ha0n38)aOB;@z>yJa{}$LZdREAP1k``AMA8X!RO`!$$LMKZh9ZpHt7+MnU4(TYiw1kP?rav%2&Ge5kFJjg^##xeWi!=X&VwSIX27k|1uOb +z7|$q?+j?86e3BvJtV|0&{~s41TzR5Is+#X|fZRXpm(kD{g7z*`%C!@N1!aRx&s$cK +z5Hrrcj#q;brnT$W%Pi&9ODh-u0w@65?+03%d8#b40D_rt^Ul0B@eURAMOLrBp2(B9(E`K2q$fO< +zCDTPM5T$;HHe?=f#$;~Keb*OfQ-tN_#L9&pHp@xJT$-_b=@+sN +zc-ROLUCP;*7m*z?c}{X9W&!p6yIoEv5c#X5>KXJgeVIE;8pJ6`ip(2cXK`Y%r +zdG&%5j1Es3z#6i{aTvXOH|7nZ{b4hUZJu~U^MUL3dN|*8V8fEahT}E?BBQd++udO+ +z50dRVtkL6zKDf3F*_?7=ral&FREq&&nwDT36r%sjz?(?KnFKb%Kz +zjFNULeUs1>m3b{ddWP|6aV1$nIKvK%=rTQt+2nO@L1-H~Wz+f26IjL{3&@7#wYh%g +zbu(sxarl`a>2~?}t&7&Xu<>%kb28>Ltd)1hZzEVzi4_Ek(*)A%uXdtft#Om5uzgXqW}*2%7_ +zEhTPtRB%lle{-^{J55W%;g9LNG#*H*&yA^((dIdm3z+&5VnU$1T&t+f)Gall(YWO}vipA}6W^}d4-4n)?vub#;;Sb6vG +zARC;Ko|GmTrJ-5ix`ryykv0af_6DT?ET+SikWc;H+QzHx>Qm+!_7I&tN+1k7!`EQx +z-3u{tc``SLxtUZw2ODTf{7PbGl@c8u+B6TF9E@K;#WOIP +zMu&E^y#O+3zibO1v!f*UY-VmV9Nvm +zVqz;|XJEygQFg~gtYt&ee}Ix)&lT`HF5vqa4=Y4yDf(MJxo}B-OgUb=ZmZQYDA7aa +zS9;|J&0fNMxG)}>W#2DZ4xKEC +z@7`O0E?bI5Y_bu!jOt&h1a;<-`_WE%2Rw+3Q`%W&-F4G0_zA*3ijfYf)>ydD)FshM +zXVQ=;cM}*4RyK|NqMnj1$d9bwf%=1}6ye2j(Mumf6DZHXktR9T%qTI>v?~Dw8oLgI +z_JhEFsATF)-XJ=3wm6-Usz2!pD=ri}|0zI0aq#c&Csur0?pE+>vG;{pDk-Y}r0))0 +zSJA<1s?@CQc`LUr-Ygy7#)~~%%5r?5MK7o +z#`>^(+?3NYvt((kBeBYij5!7ly98(EBbzD&Ey16(er^Y6cB$R?=)!x+=I%+v6uTN( +zHRO5S<{qpn+;e%z)RFn8Z6oZ@jWDJcZpRMy7iL^X+_=l0H{H8~g@Rxt2HhVN=*w2B +zc-m^sJ5DRAaW5yWIDxiv*HCZ-n;*rR1`)qzEN8CU5^5V0Er>tr|VhA@Dnaa%EfFejYVMjReHk0oq3?3er~omt +z*1ZqW{;Ed64j1H{0Txun`(XKb?SB2}zGXFGW4jc=sKsZ!7=m-`2IsQs<04oi0jT@3 +zzz@I6wy4cHnRle)^{JTp?oa~K&(0jCtsiK{NR~r_b9lQCwj_6rM%KQcWD;Qw41*NWFYBKXi;#F#FL`gnP$(XWbM63=iUCDyHQL}byM3lR +z)voqMUZ}I7JS90M3kv7AF-YUy294K+-QA0RPrat+ppFEj#NeFNAerFga_0HI`d;Fm +z-V}-X(_jc8ICa;Lm0P}NUqBV$uSo{)s6jj1FA;oCdQ-jNH8JxmWpFEdiXnDYU`>T1 +z>zCVOd=E=e5B6RDdsWAKpW7VvFUVwG@GA)53#g$C2H`qYx&NA{Jm}1%Eizd>M2LIU +zdoLX_5epE*j4nW+)cL8SpYxW9to}d-RcvvuwKEH!Q66fx`#!%q@q!nJpzD3$(M&ET +zEdOeCfw{V+BRwqgVZX(zt9>sA&yb4ubWaTFiQ;ymSoilTc~3R5kQ!d#^|=EZjDw2{ +zHm}B*G?t*FLHr?A2UUv}XG+Cj>kis{r|N`>iYjMH9HjRdi1boX3VG^pb7K* +z+Zl{_KP^%Rb;c0oqRiRwh|G>QqlCX)mEiZ%8h>Nbxju+CoA%n6B>X*k?#pkIH=ok% +zkGMW_BtK8%oRDT~RogHeOjj^@q@*3ILX=$?yl+KYB%+Wn+vpqi(EOFog0u(}Sh|CY +zdY%R$mSXwhS?m`d>uc~%;o=VFr!<6H(0 +zhQ<@nIQ+o&IQ-H!;BV#K^Mc_}lj6s>y|;tNRg?oQKQsB{ +zkNu(2V{irsOW}Zp6&4S8AhyBBE1h-xPy;x5R=IeXS#XBd$Q_8#?+DwuiTRV@5Rd{a +z3W|%7bKx-zr^3!)yjh^lbO#p8GlFsn7bEn$EiLIDymAN +zDiz4k(%=3TDfAtap_GyVErNEFAnc&Yh9>=6-FYdgTleN4@}DH(v;y5AsO{b7xZ+QR +zvrM>YU~=3Cst#(ezI?FrrFzx?N13@oS2yxY +zqsL_-K9SI<4q4ca2A@a~d_X{e_(a}#DjCqd^(ciZ6M^leMs%VShIgsX9{8urwN)$6 +z)j!Yl1Dz0Lq+yC<2hcNeI8Ec*EH=aP%g*&C=D_F4v>h})a6!VK_LEag$ftf7vj%uM +z8*}#&>>fMbJ>r5NmKV4=Z2qz*vg#A++V53wPO5TUBS_AGB-Yo~{0GZ!O*j5zpWR&a +zoE~b1Ub0!QSfQdBHY2y=y;O0=gd|yf5d88Jp{Qk%{b?~8U)Y-uiHpRaGtV4fe-So% +z&^fBXZn+Dv2CXuGrq!C~&$n*Tz!!99x5--mc77%89=R}&r3}c%j@rw*udJpV+_$N( +z?(0*$cTi+B@ZGcm1uOk~uUEGz;C-OADoN+hW?~8UW=r!%9I>uQJ@A>xXGcFq0QbB( +z*K~HNB?~ +zHIgwmc{pzbN{9Vc9%1VzkmN4ZI$EPZH5sY?AD1@Eb$;9BX_6hd#&fBs<2d65r>1@QmRmRYLV}>!SF$TTS`_FlEpTR^eZl`?=!xy3^ +zf=hN4amQNP+IgM3qmG;Ba(V(U@E5rB0VEl7>)|{JsT5yWw;>`@ZWa2o_;pFO7XDIP +zjp6X0C}cFO)d%H_L?xeBCp*jXG^VED@QmHVsuqrRq)$=YF&oO-?fE^9sx-V9ei4OD +zdsW|^IW7fy%2;!fwNV0leD@D>ENiO?*kI32N9n0lI`0^|vNgg={21r^GEo9o3HmBKG*78WW!CiB> +zS2I%%*CQ?995~XMMPK+=sU6E?Zm9K`$XqtRJWBf8W6EhJLkt$=#Z7=zW4Ty|hjz3Q +z{du%yea`T=l%l;iGX0W{TK;DjEq;epRN4($^cenQcB*U*m$ +zrIPIiEp{K`3$OPB?F?$wnN1D^GmB_l4`Dt=78W6ZLT(L^&q>Tjo3fwxpBiC0DJ~gj +zc+V5eoxpDnj&fSQNW8myeC%FaBvRe^*)t7I!N*-jbi|VI$L$Y#qlqD@u=%+13>_(e +zh4%s?GNsmQr6nawgD5`&-G*|?F%GlW`mJutBp$0Er+p)^v@EX+}~>> +z#4b70Nt#>jJ1v^7Auy-DhpR>m+lVdGcsK!qc>g97Lc_tr58)Nl|D#RMp7se5Z +zwcEM#;wT_#{_xAJO4Oi+y!P{q?9KV3W4p;ViI=1FsMYgF2+B)QZ6Ug!{Xd~~kv4f< +z`=C%xU%5e#TOW6Swo9C%jXD6Qj9tAt3bGQvK%3Gkc2}J~Yyd_umRAx?OGu3n?fE~d +z&5oV!b_PQT9!ZVn*?i9SE-;T)8}I-LPrMK9ADTcuD{()yp9TtABkLkjJ#~k?f6j{} +zw9b5(jEMk-HOnJ-cP%t*vp)~`2R^?OH7=`8q-Xc6sNXKaO=V^Twvk>+BDG4L<16y +zYq+q`>G{@rYO3B)^j0JlEkhcNCt4=>Ie!PVt|`_VubOEe_8CyWYQdPFmLagVf1ZPc +zeM=s!Nm~;H3M6z{zKGMQs`38iya#=fU#roJhcq_=%DG +zgHZ>f%iS+n+DM{6|HnMb`9h&u%<;H>UM93tuP^3py_zKFhqYk?nf#o|PreBH=^7~t +zyw`_d;=q&Q*uV}VanLi+; +zb!OH%&^)-*~8SSjqmZaw7gJ)h4|+lva +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 +zSMx+>sy@Z#$gdAg)%Ym5;X&Q$zGVZy=U +zGHfxGqa0p?)sPXrofl>gruLqeGgeQ8MCaNu3_tm3VW>$GDyf_`*@UaxJz?)JbvgQ< +z5APD_f6c3`^o7`f57CyQFxgXjClKQ4i`t&36+5hhY-UZc#o^9>2qQ)=f&_ +z@D$3Y1st-CR8xq?!1>lg^=W}$ecxk*$Se89Ci+$TUXXPpu`>2-T +zuSi22D^&2qe{Z#NpW}OJ!ag73dwUT%(UAC?c=%Fmf??$sWy>uKI*@T?jDJF;Q4SJ= +z4c(l~TBaxK^+nc;8iNr#ctpS)gNRi>Q +z=Ld6w1n|Aw01C@UkCX4sPy(L^e#aL_5k${HB^4;$o^IKl&r)QO@y_2H?*P771OQ^h +zrY3&Vvr8_#ys{UTI`9&CM)RH|cOKhl+MB7{70H%ZiG&wM{`gUaQm^9mV4*L9$9^ag +zKjjG4+fm;cUf4Bz!0wdgFqyxO*6fUWhvC3eEr?(Q<2!P2;18jt@~AZx<3!R!F=Kn< +z+oAew!Y*SAW8^GDO4%k{371yf&IdZnHDeUq@)*ko6~xn(2HzYoS(`zm1uTuJqmrYs^->NygizK2N+m6xVgRhRe&l2)?W>Y +zUQ_HhuH!(wpyQvaE>FV>CH9(cIII%si!VL-_{d0kS&!* +zoUp_8-)I2|;P{+eA6eDm9qu3RQ+a*uAnzs)UD-eG1- +z3j-8YqbOOREUf!(YRGJm8H-vaUJlL;AaFv4!TbT^BrSOH!Vy*O1$C;4vSm3Tnp;)& +zkn*q?(V-kwi$W7_(PWfJ@dwp`l47bZ~{|E)%@dvJi|o_6=uLsW4K-{l1sV{?+EUH?&NVH*@9fU9%`g#{a3zuVpNq$C~A*!5~@K|#c +z)?e9&;1g~^2D<#)_`U8WBl)6$}XMr{Pq}K%hgHg>#!hDEX +z28up?=1*$~d5~i5h{<>A8KE@&f&`mJ9!v?r3i-(S-dH|);Ors$VFAQgFeWv}%eP=2 +z0-I4-@AKCf!O-4M+*xKsnHD+x&V_=ZwtNm~gbklV?0yg{)Z}fVNe$jS0{U~yEO%<8 +z-5*ig@bAvP^z~#SM~hjJ +zF-?z{Es^2Q_wg4Mn6auEf7=fjK297pkBaE5z99GKPlcI?%;vuzAU9Ie&PJj2db0JP +zT6|E;2u0O&aT?3C9fegY`{BB#AaEv0p76SN8Sz-Xx;FN^h1iaV;LL1xT;X{h^B`t8 +zZf;_-Xo3l4eIF0+9K?e(yQ5LOZtx*F$HAG^o8(u%*{o#Y?dlxd`asQ8=qFjxWoGr* +znHA(syRi?-DNmMbXAFD*fk76wSs^P? +zQR}^@1qiHkikS#miXnixPM+pZgWSjcBCYVF@P3WD&+4kbzo&EGGh`pPlTIzv0o+&x +zB1GEp4Bk^~^z>C3*}pg?Oxkw7ym!0$W47(C{V%;xFe8GjuB*Zu5I^BvKIzwePTK$Ct9i2A5(1b2{+^&8 +zYq4x|GGza}Zx^|zHCG!3Yf%RkVCj-TRS*P0H>9XN5~!BXMvn<_>@r8y@)b!P3@((g +z)A8zgo2Hy*zv?JN8nIaBHTN|3lMRMn%mITRDuifH$ +z`U;=Yg_Cx?5i>l(%c0q|R|}|&hYm-lwjP0jK*}Q@LfcxZk7+gFkx&pMLBmxMXTh3X +z?vXiS?`Ri=F?2HYEqg@8>!(>a9_D+PNs=fTT}|iDG-Y2#7J4FvE5$D=9L8)v5=R~Q +zZ%Od5*^gSO8`986#V23W}D$Z>$n@GzLGJuX(HcM{E(bsnxp!zKPnR+jn{Tb6BCa%h_-ybvEafc-asI_{s0X>tuWSPV*=Wgo^R!twrDS$4W>! +z&Sy)WPuiMpkN%@T1V;u{Q&DX4Q;#pgCtmx=R6&Mfv-@^NNd39svkI0WEcYWCfTLzK +z=@x4DI$;J)jc8?1v0Q3PGb=a$E$Ws$TUt1@_-o>~JP!c4O957ATBL5-sL6hNW)P$M +z?30rEQq7x*lI +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 +z1%8TbRN5OZ +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 +z?pmjSP@SN4J +z{YH!+q-sD5@VoOKT4x~y?IK +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 +zP>V9u4*^)f%<`!M@ +zphD;5JZ=lT9(;4XZiF* +z-A0bf!~Z*iL#^~gc9rR)8aAYZ;jVXeNZ2@GrgDEhFK@&AEDY>4@(c)EeD0z1m**~arPe0m|`gLsVQ0Ta%6w#n#JU8 +zHW~aLtRv5^9j!vHUT@(EE#yYnb<583q_`0b#YcV_N^`w(eY}28?2NUIetmF>^Vi!h +zLA3jo{C?#srsMef3T@MM1obuOo)>WZFw=SDVL0_=aHeydH})}Z653!n99-=7;Bk3*|5P^EB(SKoKXx!pGMo=@ytv9KDlaQf(glyByyHTC2LN|jHUB- +zsrmE6zqE48e+UygiC|xf@IVOOkEhNJ8#EStM$o<0>DQtlz+p#kAoosMWEg!%@T`+Y +zA0exYLL>k%BsmKSlVM|HU-}M^YCf3{znlRkl_491LjO~K-!UMLzwJMy&m$WjEZ7lI +zSbKafGA+yur})7%1{$PzYNn@&i8p079yTe0l`t?*bD^%Oimis8<*R`{cAGQFQg^(s +zZu`7OyTg3N{kJWDpeufaE_{qs8#MG3IOX_sxjVwBIgP8ykT4MWgZF&gzo_3E&~h^6 +zs9HDwo*tQF#tv}~dcuE~8B9W`LMb_dL9W)*ie`O+8Fe-( +z*Qtw3#P7f{uHzh%uj)OJNn=p|d2fE9Wm48}>K=lt)5)K--Z(UoZ*yoBo*k{)*YjJZ +zRATWL;KL#q&t^~Vt+P#dzJ2G$w-}?2(YOQvL_+;%#(k^~S}N5Sh~2wi)CTLDEN0J= +zHyB4N@nI7?`6{rfGVx?dCB7&O@;J#6m6GZB^)I^V4Zn2l5LeBd5v2zv`(zNUe*A)= +z#K!eKgI`^@+_3~ +z*#LS$XK;2ZEoS-Qi3UM!sD@1BKv3@Q_5gP1fImjD@zsOvYGr1?*m9!{X6}uBcyZVI +zi0rdyN{1p8M`*PYL&x|w^u2>xFC9C{PEDl9zzqG3r-P+$q=JqGkRE{``SciUGJU}=U4 +zjnA{+BZ2#KXn8w{LhlmFIfl@g4;R;6Yu`F$5P!-2+lhIIS(zQ?ge7njCwHbFY|xGq +z%=IJ&eu?IRSxpS?bAYkX>(kZcP)t__X7Dy4SlqiCH~P%?8|~>hRml@FMYV_-z%c1^HjoO8%YaCbB`j49Qq0dw0F;F&&t(R0taqhF=M=KT6XSb+8&&9x!jEbIH!< +zV+@Su{yzQl|5*TQ<59|N?L82b*gt%xH6lHu6}%uQILCnXK3=fc!0NZfF-w8_2gFH5 +zfmmBrGLOpLkFiOy_ybgKGivZvcRSv1R4(M0HR!;s#B?@lPCbp7_xV?HsJ6ymR~X4M +zRsDh-jE*m~dPw+srU?~op6HfA`rUZUp4G9%&H*7LZOr4VbTDr7#W~ckXy?i38JslL +zm%RN;1_m6@MT-j@0mKS;ETQr}fyub1glfZGv@m27iQk=`>Z9c$WZomIfjO@ulsV6f +z+~{QdL`B_Ku|hU;_U<)C?3!)u +zt3XN2&|=qSH+{Gojr3njtn8b`lR4%3DkF +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 +zq~$|xC*EVlm0Z1kL)DOOJ5m +zC6sA!^O=fWIctY`XG~)hev@;udHGy?{#QvHPA;~<0;&EN3wbGT6YZVCRlnu_dKfar +zHK!|h8<_uD^XlxtkpHEQj4k`5Nj_p5eNjDk8YOasN1~Y+0jRJ^AgDH8cX$ +z32>y&{Xg%);NCtbUO8Nft{hOGDn7kv`xyDSQr@uZZ^*5c&d(V-P?CqEg`prHRF(Ma7L1u!2gsL{SEuD +z|HC0zg7wtAI)3MEVl!v2S3>2t8vjylbR7|-r2bLjBr_j@0%(gr5opaU`)!1d+9V0{IIg@*X_cu8;A-OZ6$QkCM} +zA2Ln&H_%x6-U8$Fa}?%Pi>bH$4d)DB*BPVvF4DTq=4e%d>Iv+^F*429E1Z5NgLJPa +zPL<)Knh)U_h07WAlDDyvTe`*E7y_HzlYPZIn#ixz{GUR0IgRU`nZgL!+19K2?e#nZ +zKYm;t68{@9glex^(CG8NkNPZ``;977bbbr{{l^d!HWXF>X?Su#1vkb;e*$adpE)s~ +zClbFZo^on^l@OlrlOC%+w^A-nGmw;w~F_g&g +zyyDuONVeL2_}XHw;2zG)52Pty8){YIGMWNopWqkLH~G$;<_g=N2Sk?FOg?nTNvR8b +z6uo|~;*$by-7gP+aY6c`KdwQ+{hruhKdZqqyPcKp0owx$9sInHi3N&0s4E@{vcz>fwFg3iK}PXI`%C^w*aMg&a5)56k3Qe-c>gjq1+5 +zWja0x>I^9y&88@6kA)wy#ZQI=j>56dv+RDAt|n4-&mv+H!CK+HJgz7I=s%*VUaDzZr&b(QOpnr +zp)C>D1yMA8Qqt{Z@7~PyJB3VD0)CDEF~%wPQZaWT>%iYiS-gs=DC#Nz%%G?GLqnFTfayU7${YV`nAn +z@S9t7R!2{hYSN&lL{(Y512r4Vj>(SyU{EFw959yznsFB+yU9{biS-a2e(|-JYwRr{ +z?V&e>a1Jvf$s=hOkEha|jL@-%T@Qu+ii5bq`RMF%;zcTc?e1GB(_Sm>C!(1t@|PHN +z38ktFIB0)|bvV~K-(Tfr=T7Abmr##R9S9znpe+>dL^*owR%}^*fg;16K`EIdJs9o8 +zb$8g`r&UQunpDS`$>=2YVbagrGwm{RSZPYj>18T)CeKB*k2n6L5!hzyGYL-KuT)!i +zkT^(1&u>qE+*@g6@$xZ)K3rdQmNa70x;7`Z#;UB-RwMIjJVRc(QzF7QiSkJYs{f)n;GNd62= +zX(3vzHwKhRSzOO`n(QDEls6AV$VE8z=DZV57=u(DR4cvrcPQaqLRl`1Tj@_!9j2w4 +zqI}}{%43TyW;ceG_M#U$*f%#m#cAt0AM**0a7_^k`c4V#rc`lG*T}Y2M;>+TzH7Nv +zPg1w{rSEtHO3x~;XY{TGz1au`3{!SFXHNJ0EuLp}*mV2|wV!Lpot_njTusxxGwi`& +z)vH8vqgAfj_?l1{5tiTE_jjz^@~rVW(cgVbp2Fdl{>9FE5s1kJO2pSkLZy}UH2Ef1 +z$Q^{nZ}w=oAq1Caid02tQ0>?rP6&gYTqrk-imx4ttl9JtN6&4=IMBoj72qA(U_6km$*OscAfM+fc0c-E5#F$o%Ue%APE@&aAoP*lg^gkTAxOL^j0vD +zC@wjm>3r`_cX6nI(tVCd3mn~JG0hnAJZGDKQd6t^35i+Wld(;PuG(%9bu~B=4AASI +zlK;cBAS$LWpPR|{!B}eR^O=0|4}eifUyum3R4DD+1V?b@VrxZq0V +zwg&dx6uCi!;{>LzWH|2}^iJHn<{&(l{u4#oxhiRaq*}yYzlz0$`uucV+nW3aURd0m +z4nGy42-s!j+N8vYrBJk>g2kF84Nr{7g4-!W)pP^#ZaI10iNsCXML$B#n7W|q4Z|;j +zX~shCPtrh3p^Y?Ans$9Ae$;*ZO6%3h%FrGIc=w)Zc$VA4TvJ~!rg-yW5n_67J|_D} +zTT03|p^Sa*(>wCZ(r44LJJ%yIInPGUpTx{T;m5|f-TUVD>5sT!p@t^rB@C?+oCCT!!S+x=)-%PQs#O&G@#|ml +zs!@BhrswI8ljDqpb{xwv!xZ2@WTm@S;w>`m%c~^SrHc>O +z81d_`G+V^AI*Ik!rI!}RKDoo02zi*c>4r$ZFBtbm;zh@MG%RBKxVq8 +z{FmtK8e_C)osEcn($J?tP)v*z~svqF}+ +z+`+G7q5&U(FMOPR?UtWcT`Y(0as9EXYRT?^VDVi~mrhRo;sGOuz`D$8gPPguo*@^! +zy>H?E!0|*hVWl@)q%XiXJ1YFO(892ij%SZ4@@14Om1|TCwx7Mx9jrSiJQm*k*(W31 +zaS(nbO6aTsf5GzR(dF_{2FUy!#^M7f%kPWKz}m +z9WhE}QTLk4?`J>YtKskHO+(*>Ksf~Y+UzBGODU?Lvab7y)^^>Sb}T+ge&mlOVIo*Z +zr6u0CNBUqSo}NfDxn~EuoY){Mom>J+P*>Q_u9nB%QQIKZnp;%|smq)URKq}%j*oSp +z6_PJ&D?k`UJ4w5|XKwR5_Z!lJ@is#j2d2-tK@|72E0dIkLgjUWWNs#;tJUP)eIAx= +zy7gkrC~H{xGj&XR0qY>udi)HJ`8{a=$K`q@>h8*y^(}GHIQr~?N`8<@GpILH%!gL9 +zB|?I5)DH6XsojA!F(x=FA4eqg^>A&7YIz%pS9>(`vbTz(XW>^;5`1oSgQT(JI)nRO +zY|~vmm9LZVs)pi3i&%T|yEnJu7M}#mznUb9uiTPn#4?J;cId?fxgK`|{<3sior<$j@44x;wPbcMiHZSE+!_L<&6Xrm2o7A4jfJ9%-<_&2hTTw0T?1Y0Vlh;4rKiK+JqE8Z) +zaHtuk{E9~1l1t~65_K0dy2ay*=SQ%S*8**$kY8w6<(ooN+SZRzWr+vWqu*tsoC|j> +za!38@QT@3%d-D)$rK;I`+47OQz^s^w$a4a+Pm)@s7%(H=d3Dy08Bm%xlxVVI{KDI` +zd6v*&nM9h8e*5};Dwjya_@VtMm2*5)tg@GEe$!7QzNF}Ef5_`&@sjkLCy%I?Az$f} +zywHm}o$`C8$@K*^5~*OYd%`o|Wg9pAt|v}Ctj=h{aD}(yGaAZ|Jg*TR$htI$3rv3}a#L2wiw|mdoLwk8M5dT_`K{ +zj=rjo?Ah~&hPnKS>+Sdr{kF&H&fWPfYnfZ`X9Wf`lJ*<2N}sgMy3A=Xm1?_o9I3+w +zdW^IlLt;n}%tZh2{Y?U*h6z`*{NSb90H!q04NmuA7Y&j9YahFwg +z!EMgm|CVmnbCH6d%+!$)a)lO#N$}bhMJ^ZLTr$||ZD4)r4T<4HelwIQvpt&6Y4eK}+^^$)`_OA^f>mz)N!3Su&osWb +zVScD`A$0tiVP)LX)+=qt0>PG0T^~oEPuEht*(p5IcJ+4ZPYM8nRDf$ao>v&sjniC` +zG(ywgOH3%K@Nvqcn&SB^E@&@^YX&_6y>N*d2zpQ+1{Z%@nlS7 +z^XxgbfcrD#Tz!v@Hw4j(Q79QYOzvqU^pX|W+@I1UM^;R2pm0VJt4usHoDZM@JQWY~ +zD-_e7^n%ky^`4g~&y-&AXFUQF7F14zBA1Lh-+2zByS|<4*9a3!x<|Sp;~Z<~Bt+I| +zUE3+#Q|af@m2dCRVa^T#j?9mefVigx0{rj0%sVH3{-ST%OduY=dd*p0Re>|9cbunx +zpq+LxE}cvfZE*z^KHMz3&}ajvq@*me(Vl*CtQ`eu>w;p~%fVtOT>UvZBNF6L0HxHR?mdl6*wUo2U*gXNV)9^l9lK?N`K%z?(m5n7&BGyO}!#Yfktmnm!<3T*v?|e0F-e&B|i;R9-Tcm +z%acxOOv8ke0p}`g>5vGR#|Uc&Q~}n)d?b~L_fb<$yi$QH;tZ{M<4L(fDTaA5zQjz5PAm=rFf1Yzhi67NeL!-fz +z_1wFeQR$VRI1y`WB&4!Gdvv>6l9Qna(1xr1 +z9~M={aE;?d|Bti~2Wvjk;UI8CF{LOvj)H6JzcefBefsEo79df6s)34rWPIz_*a~-vd1NypX0ZL! +z2dmx7eBVYe6`VI;g0N= +zB7j#Cu981rET@X9r-^JsSeEvJ=_@IvL`NPNs)tDVYFF_$tK +zM3aIlNjBNq^ee~6welCs?MO-`Et>i9)T&=7S9ZWMCsBQ`@tgzfrG@d)`-M5z)6cjd(E$>*tN|@867HU!D?4S)oiWtUx!_PwX9&pe +zN|2x>6po;I%-L3$DM@XMKB-x@6>v31Pp0ThayTKga%{t)>hx9=i@xzE`}C7S+>JrM +zL49P6&WlAr7KN1>vq-uLU#?m1@f6G*tb+u0gsl4JrFrVU92^8)y53}#V(u~kR +z;nL^#@QMkcZ=+6JNdeV8`lJ!INr#?E4Wo=7oy2v;dNFAq94~fB*>{M`dQwc!c4N}@ +z=?k94zHI>J9{) +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 +zaGC|1vl?j^qOe8)f4sHZug`j5-o`B;T8hme- +z0aZLA6px|zG14t8s|!D^hq#2v7(9zYrG=wkaUWIxt2D^^a(DO|+f1I8fZ)>~*WD5M +zUBeM-focW@#vr{)>h-3?eN;?rq#oSTk7fYWa6jrGkyhP8Zw3@(z#GjnwX;h9tu&gd+-XyF +zJO6s|?=6Gr$?`e4BW`{RA-AB60_}%Pdg35l^>k{PBE8!GWGIfhMH%v714M98C#C7ocfsYLAm$p05&zc<6{?&bA4Bsi-LKaE*HOFCao +z9Xa~W0V2B72i$ZLI11bt7TlsDBAN!vY44gsJx(?h3T>ObFEqWI#3T{>jmbbWsCPzx +z*LX?*IF_=#v$LS~6!kGl%gBg^g}F8O#Njy*05LIcpCEATid1dr#YT-JppRllwD>I= +zMt8#d8|m-X6UYO8ch_Pmky)G9qDg2i_IO|ag~$n4e9pj{V|wsz|8#Fw`;vzjas1w3 +z&y-oPCaJpxFrj4nz;&f%WR`(|sKC8Je-=rAWpMahIyb;)Y+#jqqM_i;g|x$kS`79L +z*nRB0l}Rn2MlJ?W=pli_;gTd%sE>O;vbfSVR}ufiN_gt_^s{8Z)_skx^^SlQi_=@m +zns1rmmmi-{%7Xik@pF6Gk{>wU&hRiLK2y*3Pt+ROV?yeqF$uwc3fpj-kBEgZ37VuX +z_PWR@wp^nVi1=Qi`h?cFesid>S; +zMVe$yG6dy(TJ96fA{LgKV41Y5uJ#qd66Gey*SOB0{l@T1xW><}oyjtGm@@ncf_F@e +zPy}f0#=mG3a;0&WCF<{6>)ec#8VVz38iQ+NiD~xH7)iaFCY5=*U@-xIASR$~SuMWk +zk*;PU!WuLY%0}PGBUJ!IDQW3qGph@riIO#KAI+x9Ups!z%&!c>c&cd$m??!A7(AGt +zMKA^5|cyE3jhk3r)3PGII~ekrKsrXQP=yD +zlZjJSyP~^5PeOC)PzSdrp#2ziE9q{pPlmpw%NiE}lY|ONR$-DR+=u11NMKM%W<<~^ +zg4@{WsTkY}skK5q+tT;aH`xHgnU$!qhg9hj&N +z7gr#>n#}s3Wh#DjE|4fisuOgu2C@z3X^STtpfLycW}qhlVt2~GzNF&(Mgp${_Jvmc +zhwIxO6D~8|LQM#(PWe4hz?2ce`bjt^82oud!Jj66KaA(+a5oV$&nueEQo|qgEL;Z%*Ja}@qUjn=(G`!S%B{~(z`AW$I0fO#_Cf9$))V3Cz +z{Rqlb)xeEEuw5Z!a0RgqsE0Um?beCy?zrL~vYr-@Lq=p!A@c1rxqyB4oWkgTn)DB3 +zX?67jupDMbD;-;-`H$+|4x*ZGFO?L{!=JJwH8G6k0@Dj*CI*z}6oG~jIK0;5{+~a8 +zeu_K%j47a>wgpG>I%BoCKab`m4L9$@-iEi^usaI;lFK%zbF>788O)cYnO3eJWYe$i +zzvTNWta*nW+(Sz0qdyBu{tVTBpPQQ-#olx8*0Xz8CfjPPfQBpHW?Lb#yWeQaxdx%U +z0{R&a!ByQJLdq!i*VjN}yYH0LaQRVt$|4BkpNI?Q*h(xm`EWX{NVCj;vID(#u#m!( +zQH$=!VE|5bdiIC)?lDkwR^uizav|rK&0*8Ozz%WIYTd6B5CDh>ENFctO&JAEL%eYDsF1oY;W)YR0#FQTcooi_DI8-B|2e@^@>H3^x531idw +zY;bPBr2Y3poHd}v8{lHJnTq~cBj7slmPG%otSoOMEFumn!|0-i2&c>(@TZnV-q78V +zq&yA)okUCk*R3%36&Ktwi;BP0$6)S>uP?a|g7lVu1AWwhdRHjVh7iL({h>RtmFGqx +z(X@vq+SHNe+u{rMU%juo7f#j0Z+IqFPZ1&S(1eY-`8$+()g)}NLCDl; +z-kpWGV=`ANi4m!zoL0z58DH0qs4D735TOzF*?v5On#HZ@X@p`+FIrw&H>*Yt3Xt2x +z-#=ttb!yarOLPdfza#Qr@K7tkcNhzpCM>O>^VYLBBlVgPlL8b*F2Q71VEq+JIbPB# +zQ`FG?RQA}a{J$>(skB2lSEP!fG2mGQ(*BLZf{ttQt{u!=&$izG)&!m#2TnJPn}LGQ +zYl)oqmgD><|LfMkb8+#oS>WZwb?6rBR6vc(Chsf>BJ{t1w;(w@gbZPV?XgC+0ITvC +zzDkEBBy!w^mSj(qbF%#S_&ad>)EpMY#Kbr*u_#WV)wo2P%B+rf;%?xAutMpFvV1Ff +z&Ha#F{u~pFA5xlL%Qg%usR=7amM2-`hH_^35{_( +zYtqie_hCA{`Hf`KG^wo(H%7iT02xSP&3ccV-BH<=rE39NrBPQ|pYPyctRTS6EkQXw +z1lhm>o}Usq|c^Eq4i#eZQBD6s(7X&>VSx8KMm +zHM`6QfY&DhN4@}JSi+!RWVFh#T2OYUPY^mChJu?$LGQBgB2;<7u)yJg3J1am0j{{D +z!~^+P>O*r*zj+4@7Ciaxlm_^Nnw0-7hO!j>8{pc&StX~|iwyIUzj`}Zi4u+| +zn4hi4b#o5zASRhW98x!3MqUCPe29YZyO4N%5Z;es3o>wl@x)JDcp@Gci5NOoBSH^- +z1B>}Q1VX5DHpEWR!wb`=4F#=#R#v0MJ3)K0mM5ngxw4)dkogVPUObUlsv3jg1Ek +zuh1GqxI%w#4*aG--+-p;W2Lo$G(zAubyb*kaR7JU88j!<`t^xH16grt1nm8{Fv4xw +zm8Y7Qrq5^;pyfWA|Fets;;a}v9S&)!oJcnIB?dhwQuyCdVBj;xEOSIS9UA~~7oD4* +zcQ{&+X}E#UPF0vav=~ee-OTi2Yn%MUfKXX71x*j{_yje;IV~PW^8M@7U5vP)=x_d+ +zm6Kf5lgAgtuMEBSNZzw^aHvbu_r2m4Qq2?z1wmOZ@S%yseMQK~$=4J3-z`XkHfQCp +z+faK-EnZph=AIRGX(K1eN^rxr-8!}y`vQaispl4s^_7%Qz-ZDcgCqXi@#`rfw&V%e +z+Omuw7bf`D_E`X28sG#C1Wt9jF=Ok1d*gj`I@z7fP6=kpK)M)#`pxva^_ZHS75~Ml +z<>{zN6JI9mdo5t(xt;$PZ8#yS(C@AR0K$(FV~vajE*+R%#Gy!8;E4~3nE>>(IDI;N +z0<2dI6N;&+X}QfLn{t*IIq-+uKzA9^EMjGABrsF61ME>|_(*9O#L5l_3ylvm2Pp>l +z-p(K_6mZ(0_4^RPSYk4=2+0qqp<}yCKR>*F^Cr1;b1>|K%l@3M9f~C%Ez8!9U{)Y- +z1sOiU7bn$q;_{ddHY$1Ku +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 +zI8fpLPht=Rdx9`;PS0Ez5Wg@X85TK`3 +z=!1`?2qV>ZAJb1o5Oa^K{F-A=Dpf;=;vzya6g{;&*wh^t8Dz{`K?vvol6cX8J=?^brw*fpj9I{CUwf591U?dd6aTG;pkfHD68HfXsK>_f5KrF4C +zDR8*CFigO>0n5dv8(KF@G!+XR&$IovGWgCciY-ED9Ak1w7X5wSq6{Is@2fbh?pc*w +zRaNigUuhu2BtaI#Lj9N1op(X;p@q`#IskZ#^MC=5(ZDM`;v6hc +zdkM^FE_z<4IcM%;vm +zN>R2ZACdRIDzu8o<@aYjx!nHxcWA-GUt2fR?_5Djz7+#K5VHSL?&WXW9Y*W#zeMd> +zXjbl#S(em>-!FOeT?Xf2_S1*V+22cYHE*k3K*J+zLz(FqN#wxdzb@j-kq`R?6jbB5 +zeGgnR9yuQS9Mmozqe8DKni8%mHu0Ew?&^Ca>s7!J>;O2klbi7y_{-8OB-y&N}#x~;waWBYQm3jeH3X4 +z6g@==nyUOY=S(!PfRyPmHSxE}hORIlkSlft|NUsO9fE_r`egNjr;YGR2(2wBLf8}h +z)(Q5{Q3VnqV<6nH)wgg0%RZ{G_ +z+agLpSQrMWxUYA(j2=y!L4|1$p&5hOK1ht=c`&8^Ks+1qBSDHC(`|eI%WqAbqU`~ +z!wC5Xy8jadNaMl)9~75N`~=FUgo-M58pB=aC3xcvnt}IGhn)t17ZuL3i|1tF)@KnC<|B;HM&LM>2I99T^>~ZW-2*;MaBbyM}dt^ruGLF5D6|z_M +zCOM(Zl5Exge)Ro*fB(fdx8873#mn6FX@O*C{FakTst`SH9cQ8TFYZY0t1zhxYN}UaLx-}fkK=@b#-f}ea +z-TzQDc`^L*tMmkSkFYx)Hov}s@@o!wjqM1Q>+_HiK))L&tV%E*lz5*ZFz<6ne*Tj7QD5JGWU$bYoq9$*;Kg*2op9m_<*TusRF=PL_I)1Et?ZksC}^N!Y(Ms5jUJdcL)@`CGdEocZCR(Tzt +zt^@fDe1e-m0RNNECP$p3oU<7{a}xX1666o%w9eKa +z1lR#jz{7iFWocPkcq0o$ynnGQK8=8pm&|pE-yW{0gb%Q4*FZgOZOee;0h5;%??}pm +z`umkBGj53giift7pu-F|WoAsn7<^tSYEXm*Gjv1ptb+Hju3e%?jyFdqWk3sFLkp;&fB@+fc^_^{(R;vsPN-B!cd+nhsynW!bXE&PyT?fN_q +z$?Y2iI5`U>dqjD6#_TA?q}L4PkTlpZ+k~AMbt`_m+U=B_Y_JZA$rmF0!!2b@NtYDf +zqAphkOnBYqF$*@B0j12G1Hr=4x_rs(%vmtV=MLRhm0%ff72*yKU1G#RUdPVB(6P8% +z!LIfCCH5omY6X@r*4g2T&iK1XUb5S73%EcsCPfe#85vFK?nPr~D{!REKg!6PiOgF9 +zag{%{4aCU>yHG_UAF)Wrtw&djG9)OZ)oM+L|Z015%=L)_n +ze$Z{J~;`F~R{P}s| +z=}6!{SsKU%i~@e|*Fml-14?$M7dq!6d^tF)J6%W(O2D&M1gSN-r;$Ac@Lo_RuNC~u +z7r2l#QbhU9PyOo_&6CLrfl4!i3W-btD2TZAaJI>G#$r<~_0dl)e=pvdsTlAFsXQ +z7-iDZ!x|WSGo3!l!Q4f|B~oo1_+Q1R;1o*l+x4>vJBjf~j}hEJ4Q5Z7#`rs;F2Okz +zEoCS0R8~Q7&a@VIQSrCi@;zP8r5-=d(U|@PLZhpYUNEyuIa*MNU7GC0@r#N0P +z?I*H38Z1dJLW^!%e~llVhbk{5h<*>6avH*=5=p^3`2w4IHLVj)qJR^$b<1C2kbQ_` +z_a4d=8U{&^J%|<+QCfdUR@D=4>Md|ZWzGTh>a4NX@+Bw{5gWKIG(QxPA9E^a7lec{ +z;g$Ub?|hN>c5}Giq2>p)i+7Mt=GFN7Amff71fDX<+p|^>9)1xYh^DJLu8U&IQjoL7 +z-niDs9WoS{rkZ;_#HmuceuE{UB6VvQ8)7; +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 +z^nGhULocx;v^#E-}OUb#&mS~gk$HR-ddZaqL +z-k%@K+tWee0v#yE_f62yFVFFX5vkKqJ_RY%R?y8&CJyvn7gwhD@OFhI5`n~1#O?cnRrG(H067?U$*9UgY4NNg +z7N;ZXzVV1MWH4cc4Q-SznlcZe{r23voL?n=jmSz|P8n3;YMCIbhtWk2IORn--Sxu{ +zV~7<-s(TubZ`{RaY{#`<6|g>LUk+WIo0|BFt^K|E?7wKyP5jX_wU@oBFBd1o$Wo-V +z=up{CKqIs3)Gqrl;SGUCNUsbGnOpIBSwz_Y(CJYksK?UMflZCLKaG<*1`Ub~L^qfe +z@3Q>_th8_Q3ZQ=Ud!7JJ+9fdJN2fT&CWDz$V=^WG%CMp=@gboKv(6}_1Cit3?1+riCTDA-54)|I3Kt6B2E@@w +zNMQzHjX+?5M31BR`xAhZoTE@)^#5{ouUU>E23sgs$2{3(obU!SKg26Zm=uB#_MCUC +z8qGLXOnBRImuY5oLA`5)qr)VkNh_6~Iw&bc^n@et70pIGk16FgXo_PJ%U$Iof9h`g2>xp +zwp5cz%p&=U^3YA(fsqvfU|k*om*^>~W7(}S#(joo77y2p|B_d_pE9kADMzgMn-C@U<5+&9v?{pgQm+d((MCFYVa3 +zkQtwbbmpN&=xbJ@{OGDiV*qU=#$2FUu(dFLQYgp7>z?$=AvJVr9E{aOkiP3s3)4R( +z`%D~9%8Itrs@;u`@6@!QWA4^1Jthb@@4lBm?6NnT|AA^hLUpQilZo8J#2$d1g>jG! +zgcw{z90u5JHM(E)HBd0C|%C_iGyBVymP +zU@YRSG4RFvlF$}Kz-5Q5poeG>GT@1j6%x>oaPXs&niReYlCOx%8NjmO2;E(RHl*P1 +zU4X2FFIG@i3#@avI9`=lVvQx3+rpZ;sv#qKFrDmkGf)vArj4}cm`;kS(M9kjR(Yvi +zH!HJvGs>2f`7(m;*gN)~3oc=)fpZSkLv!v9BHCl- +zBSXOy;%HfsVa1QNIp~V?;tmMvULr8$dgCG(Up2zjr-FQXL@T +z#&7-j1#e7M9Is^xc^C0p8hz-Wf20*NSU|Xb2(2qnO~@cJ!VWbe1|Q)SxJODE03`Rt +z48@n?;qQb5(#idmnn2_ClO>iL`z<$WgFJj0ydD6*x{~GPuj!Y)7PqtA1ShCB83>JI +zZ81046};y7CxS}c%>8~K?rORzJSF`7fg`z`&hIq@z(c|mP;0l80vn-(+nD2{xm{XM +zK`+d_7o$5DexJ1I0@g)7nud!#97-YneRgHRWA#6f;Zu5yuk85xLuPrtQ08+2tLlVx +zg8%ro|Bqez4boqC%Wx3M7`fkm$$N`?abXA7&qzb(o1+KLUjt~|!GqP(QPdk_{7&Bl +zn@gUvu<@=TB^MW$x1BGCs@y3b`BBLL&B|B#FQ@uKxgVWK@Q4PdM#dYq)!w`h3nR_i +zZXu?A0Ls+2!1O$BddINg!wD2kdBH@3Og`(_kQ+>Yr&xlJ?E=X|ycrT;g20%K&U|Q9 +zw3Be$329ESIcyY?AHDUB#oDuL*?xPGSreLwH3YbbWA^qVN~a!JeA^Z%gljDcj$#1< +zSPkCHtlvwkj$h1U-i-#*p#hOeNX-YalpxW!spg+tVS@FuqpnIgX=d~fM$qV(Q}Mvd +z)h5eURo?If_KqJFoFH5@%vW`f76GqJy$E<@^ZhR}beT?#wlAo}`X0@tJzV70S`XcH +zD$dsWX&kuQQuPBSujG&Oea+vrPvqPpZ}mV29b5(jyZR9l#+T5S$|BUc&QZ7g2F!O3pukh9q}vZe4T{f6|7T5Vq-~l?9|RZ7Htk8%)sPc- +z;9r0bK=O478V&%>3@k7fA(c)_O;j;~LL?Bz(?0{GmIuI?1k+YzkbDUqk6a;T%?*6u +zauZV?<~~PX{4XD4b3Jf?t98NY{jpU&zLJGt*sIu>EBJ(piFFB<0o6l-C7#OC79RmI +zcvmw2|GY#I#0X!uCw5sgv~a;0qjERFRuS@vqArFu)gBXOY?K*xyB=8 +zQf#==!x%{;oqx+Q3KQNNfj!Nic|ia!G-tyADRnaZ%GA$SC6-Z2-jDrf +zOfvg=@3E}|bii*m!2RE8xkzn7p!u>5^ou?LWo^Z)SGPrhj$#`qC+hEb%+Sl(+RTDW +zi9o$6EbL9XBUpbsLOG3bjMKgh{B0>csHmxZM0A0DY7;<2Pn_7#@YZ{5Y};w(v6W;G +z#70A}QH>S*yH`Q(u9F6jU=57uiT*C$<~l9DCo)R_1}Z%vV^OaG +z3M>du`bMD^Twr#P5u?cheV-MNmmN?_Xe6Kdp#sEmhjRp`MGS&IAs^(G?2&(RPZgpc +z;z6GcYweQ#ezafV*p~m=g@=c8vh_j3u4Lx0x(S0#b$tn64LsI2cZh(Nf?4{UoIkf&J>Vo91pbTKn9~j!|BXPV +zFA?CKbw}+{D63qPOBs+0zi?X&|#jz#giy1ME> +zvF(jtAi9HnJ8Kiv)`?&IBf{#-IFXC;=V-o<6@W9XEw+e2S-o;9D*znB$YXH9qSsn3 +zLzGK+8>FR;6F*36Ir}*PA^mgrzrHeuw1ke8T@*o6SMiRwn@Pw4DM0PV@WA6*VZhZ353VL4Hn^{_jWFA%RYr +zp)KG*4yFOFSRBm9F;m%kw#o%*Zm^0dcKP}L>UgsN+-w{w4>Vw(PYJ>|7oP16X@5Xb +zhCxpg130)M6`-6!8PHY02B(}Z>{PksT +z)S^Sij}Vw?R59k@+57|#1UaINAFfJ$C{3DP8eB9EybNhr8yNc_#;^@I1*d@DnwG3rM|E}eL5e*?4Vtk-D81oCK~C;{xp(Q$LA{_wZ+u$mFF+<$0qMjH +zM+l^H&kFc+%(K~4d*^YjH)smk22g8_n&50+`%aHJU +z#D?t8TEDIZ*Vz1tp3dtt9t}`uHBFf9Zh;XizN%{GK%NYL6HJs&p%j{P9trzYK?F|s +z)P>3d8!~*0>=p9&QU<)eN-S9`yKjC;JNC!g`F?My2fAWvq1OG{|B61r`g;UI@VERs +z5s-efadJA5XU3Z4xX8UJh13RAH$0$CTSu$>``o6(z>eK|ct#Dh0SGt|BrqTgf>h7h +zBUjpIKwG927t^nC4H+_*CO`^8YibSB@BPEI0D%9@m;3Lt&4aXk3+&~}v$M0y(^xQb +z>w%ryykq?=B$~|m&@fArL#CO1p>n2~y5uVbv10h3eR+!xQHU9y78I&F1%UTfHS-2D +zAPQ)ru%DdN)WMbL5I{M@u=**G>iedCedQY4<4o(^hBri=%Mh}5iPF%t^>p#O*z%2_ +z`&BV?lAp?&e=1W(6Apr29eyk)4h>JM5C*pQ`|nFx4YEKKz0}W=hu@nxzOpCGrnpVk +z0|O9)BV>ir8)*i{?r3MJihQ;zDkxyio_f~+t|?q9lN7yUs``y+6pjL$Q-vOGVn +zyCgbh#Va8B;N`F(JrLtcA-Mp#-aZ@1l3x-yH`&LwU4zYO+2B5@;Bp>F9CyMZN9%yH +zZ0XXP^=m(?xAHN(3!$sjG#ui0Qa3>4(E5FKdD;RUJb1w>3 +z@W+y$WPly_b2#8n_3xjlt-rj~8oK3W)qBF*Ji+(f1eocb(Qf7C|=#^eokE@G%i!t;C0iaJy$k^bj8n5l2{qg{J +z-C0hfMt*EJt5$)RcM_Q5(SW@Th%ZC)`IX3r?}}uer#&!}q#3A7yT@Lm4rNI3O_+Z@ +z95xs60U%MM@y8qp2U4=Logj|zj_V+g2goo^ZKQ1=&7UBcQ=c~YrlMlR$da}G>Ctjn +zQw5;yjixtGL4){VWjYOOuhN$6ftmnZkpiEv1yBI}peJ*(OvOw!*vf$Amff_REjM&t +z8&KyDQUs0LLVg%Vg14cf{z`bX!Z{^1bsn6_2@PlEA`M=H^oKHhl9G}coHSyWDQA<^ +zMfxC^aG2H?^zh6BrGSyA*sKec>;A^1@mSzeNrV(H+-5kDsjpMb{v3T-gMFs|WR>Z- +zR?ACc2U7U=HQq8kT2KC^@PTV&g@9GB?4#sECUIHM0gTHI&3EP6Ez@DKz36R_+zfqx +zwnznRrVgH@G#d(#w+|Hs9vc&VM%FGdSrUGYfH!pEk8%KeA*$1-zP*U+3=?&}#IQ +z*t!PN0T}yOfZ%zMC(HP&-3K%tJeUI#`)~M3*Q);i(^G>mQ=0S66^adQgGWe`7>80C +z$C`xJ4f}~g)blcQ{Ni9NHX)q}>v+2`jih&c)Nse6R&ATr-mR~{Kr2Or>_Ze!fCX@SxBg22FrDvoSfto?ue48;4~vzH8DOb +z%ggJGjEeegVvH6){<$Vz_5MA8JJhcC?P9wDB{M>Hb@`qzP`_i_I;#LY2N~J%)73}seo=^CJ@E)Y*RCqY~8)84C0@Sj_W(Aj??WOIP#-b3}M4xFTAb5cLagYXG +zH3N-IDrVH8?)+8*EkGzuA8abAh0-Z0fZ(($CKmL6)YxLYbeOKN<_Q4VD>277_7)<#?0H`oemT?KxE35?rrP%zxyFVU2svd#~{3XITVo9EsFNHp?a42`E)nX`;VT8 +zq~8?0?mi{rqX8-a=CK%*Z{x96)vY_Ai9=`?* +zY$O}p@_bSq)EEZ~)Pa2tG;!9jl@mJe;30t=FWw_}R`A3s!0(ZHZ1TH+UwgzLb=Co1 +zq$(~!TM5CViqPQA$bn50AU`gbFNJ(IJ+PxjLFl4D+39RP6y=bC<`-==l*LDk-%N^^ +zx~s;JE=74%FdmeSWaWp`qIf{(hkLryr)FHQ!_oEA7w9N$ylMspwKKrDELOGCZ+a-uD2NV!W48D_8Gc_CbqBGOQ9e7k<(G>-9FUfk7WxYN|GuKz$QUbbd}*Qe +z&py{F@J&`PLxJMo?ix`c8-#w-erg7S`52E^nVIw7zQ)*RUtvp#`6*G^-^iXob?T=Z +z2d+6n1w0IwLv=n#ger@lkZuT7z*rB3)$S~clFY5xPuF?BeasTAAGO^A|4{cgP_mwO +zv2n`xHc$1-970D&xqSDJTPs1$4wKXYzNg!Dj&3IFUw}N^$&D657vK7woxX^3SR3b~ +z-Zlr}E#^SubzyFYz^Z-A(iY}pw;0xn!N5{GSzBA%KDx)j;7- +zHE;zKaCd%_yn)IUTm&#pvF*?`pr8jbJJfT{dlP%aLaW>S4ufIRZHNM=);%X*rzt*T +zWI?4zFV~G)-yPpJL7JKJPaPR-Rx&IJx%V<8D&FvT&J|DEV;uIW*?PY>?0kLNbcEya +zSjzLIF&e0yHg3wsmS8Yd>RG&JuOj=En|4EK#Q2_>Z%>S?S1Zu^d$q_?a2PphYYWtA +zw0@H4LHsEOViLTJgzU=f5lEl8ov6ZDw0SYGzM#3;N!-w!>;139QoZV_DiO~*3}*1V +z8WDUrs?JBPVHHDGxGWWX3RGl|L%P^XRn!lBTCKr(c^4x4E+&m>mpE?ET^;y7`^EQ5 +zjb)5J&=m(XPv!t~#)qWupNGaL&Nl=TL6D`bY{FRLdy$h@FoQ;iYm9}CciAL`s3$w{M|--a#BaLvHz!!o52%S!uQq~W?Rq?1xewm_|k*{~?bf1%u?cP1d_Qchcq-0w^pRd#VeYpyuPeHwg*^auLNTCSUoz7!Yv=jf!WAmMmQ)`SSyytwQO6!kzmI1hkYks5X8 +zy|zYFObO}i +z`CO)2e6oZvtPBCY4=g-^gmSKHKo|Y@QwzIwRLKEE&7InvoI?UW!U>iqDT532L+W4*Rw>nQO_0F_^whS+vAc{KFk;D^AIDG(#sm +zxgAhl%E?tuzDJ(CNwk6bt7`KH>~Q4B6u}SY_S3vd=S-lB=3R`h5pdf-Zz>>xw~Ym| +zF}b_|VwhilOKM}K@_HGKVLTD1j5zl2ZgQ}j3b7NH555~&2g;&vCS%-)Z+%_fiF{sM +zh^Yus(ZL?Ikz$(*XY7jY4L`4}dYC+^3a<}QNjW`@4*MnzBmGW=y557(tPDEX&eF9u +zGCw1it4&ce6s-(GqTzj$0+UW~6gxc{u6ObD@R+s`!96}jq&iiRi|st2d}dwL)sJisJ&3Vv<~rtrX1ucXukQ#V_wp*LkF^=Tu+Dd9`D= +zi%rG8%Tgz$+S6jP5%A~nju-i-OwXu6od#t!w_7BOmH1ma)lOfNwV_I$P=_84X +zfX5$8n~?5x=aE7tr; +zHhx|OUb{XjuXhdKRWBz$e_Ee=U|Q!yL{FiRPD;N5w_@NcSW^R6nj<)tXJ|DNUe;3=LW|Z*I=4{8JQ|0G_?*lJ_^`}kdaKM0b +zbNl6-F|&k;C>WGKz} +z)%q#=yGpb#Y>4p5R7`Ecc@4$k=GZ4=EEEdtPtgN5(MFp38y`sMBiUF;2J{^VElS%^ +zTgy)U$M^MSr`TG#~e2=8JlhMsPl9V4raKGc%jnE7bT&d!m*eybCdY<^4Ja>&4o% +zVN~p;w+9--xh#!e-FU~W$8vVzT@ykxAMOx(XwOif2@jE;k^V8jVk>j}B^ +z{Gz4t54s1Z13>pkKZ#jeqjza_NvK}0r4`yUjs*ks%d4MCILJ;@!xI)xfg^kI=7amq +zD5e;!B#JbJhd`r3rZHY$XT_=B@2Bs{X%79P6bcGGZ|{&O4IF=^jhTCg8lO0aV^)-1 +z5g4^QYgeqawwLuo8bL2c#lXkVL3ZhJdmcui;yJJ9Ct3C{>eREaw6p6axABwE8klmu +ztmFH1;_D>D7TT7{+B&*TZSsr^m*KHAH@<1HWGMZqzPkD3ow~o_=U{T)@CM`KhWDJE +ztUC=B&D--O?}&xs+&Ng?i7jA3wLI}`uf(HeUK2hrV-xl4ukrV@OFCp{yH}a${HJk6 +zwmI$=V-YN+4^j2vQbujLp25y(&)@Z=#Ctyok?xZlPYo)(iuT#Qt>z~Fb~#+Zd`wA7 +zas-VEan`L_`&)F=WNVdJ+JALU9zICpAI(^nYJkdxmGJYY$gW*Lwno_o9_2kB??noN +zPSzZCfm!{%_XEL^_Vn5*@e5MdbtPO~t{!Lz7KBvFieM7hN6r`tHo%`W%Q{5?_jlpF#j +zANhWAY&JMHA`@uG2>@r=zE_9z;mY5Mc+i +zz&;JdlmsTQv=tTBl+EgK`a7SZegyj@N}D2|SKPvxQ3v0U{E{6NU*bN#joXbBu&T8b +z=N&Wh(k$pGEr-u)7zt}@doMl+X8Q6tWRE&^um#bojv&ocJSGpenSM2gmc{slj|Uky +zxVsb$W~M!GB1I;Biq9vX)*=ugdLBehISK}NP;b_MWU8xiNH%!bhokN*vau{m4Q{_j +zlU`KIndBht7^;W*TFSO3mIkUZ7U%`@Ny(&+qStQ?4OS+g}5RIbBA!^3Ua~jC{Z% +zEj}6jo98ijO~}B>!G%)Ik~q?!DN@JBfkCIyv=pV9cyh+;)PcX(@(xqJJ3}S57TH>NvYkv8!-Qx!?mILCge!Sw#CKIH0Qqbbc4pog;ce5O6@R^9|@aqU#0hAod=DSU1?@g6uy5 +zUY}i3a_J-JBWqeO$kYsy^NT{QTpFNH;SDB7UXmu`?Yz9JL$jyr)Z*je$%b~sd^seW +z6LG|*X;Q}ALIQ$i2LHK$UOK)U^qCK1z^ +z5aADVm3|dwA&kj7ggb^yvcF+e%>DcD%1en#Zr%q|chW6bEfVt?RZV4v9(GgBl)q6| +z?YK#4fJvrTg8$|f%%#rh6{$dc`PgKmmqWY)jL+QVtK62kQ9hkv;IfP=J1%u!Q~r|f +zoPMC8!5UKvK;{0^CM!mUSd!I>xb(I-sfg>N*C(qXXi&*4(dX;Rng~M~7S*(e^@hPL +zt*6k~EP(FRfkwQ+t5>fk-ce}Tlr3}{>Z@7>$+-35oJdksVFI>p?DDV8?Q}C+dT)|k +z7Bst3fvl`*2uk2A`V`DECR9b)3k~N+#$%vi_|Qufl$ +zT7MymT)1?E+{?5FUzLW&KH&B-;pqGKDGsg7Y-E{D*7}Wqv^_tBh0xcL{hfZ_;(H=u +z!`ZBx0;(+Hvp{^aR*ZwY5i9jtFRfp-bCLUI;dYcrr-;h*`Hsd +zE3I<8E(Vam6@Xu-8=e+TLhu+p9`3sLj3+dc0!+bb)lFPU)-|q#dbD<0|N2APn8bJ~ +zHx-$|Ec&t%r?3 +zy*XvEp_*8kfF5~uH^{PD@DJaBkp#THljpLhA$wE~1#_Q2OhQ0ASBT!xs}A2dXw*BlskjTUP_pR_OZy%Cbd>EERq|QoCcVv?lIo_HZwhx&E?&p#u>@r +zClyDeFCr~7fbJgC?h{?eXqD2i7clH)@P10Av_iqS&T9Rtrz7*OCI%?LFp7{n4YUB= +zNa@#_3L$nhPYe&oQ;x-5H2~80{>H(laD_=*!tlh}5re0(NzvOiAeOG-{7#PF%n`-I +z&@GcoAG{F6G_f#PID~F0tLZ-rQDJ9c8wlarGpMNp(Zh +z)xs0hud&wh+d9i%2-AOKEMd7%{r}i{%dn`v?|oPi5d@?`K#>@_Te@TDjv=L6x=Xra +z=vKPBQ$jkVh6W|2LqhsFqo3dR`oDOtix-T}oWtz1_S!4%b>9S2daWjH-%{{vPsruc +z464f=8EW!91UhBuaAiIRsZcf~Z($Q;Xu0%WAH1kCtPwxKo(5Ctt)jx_w7fq7u$zF~ +z8+a`pA0F`3CP08{xv&h*pFbP1wg3>J366dMAX2JOi7*~<yC0W;+4&3&!;G@hxH6Yc+(q<>>E&d +z`%F!2igeV-`JBPMO{m;D-*#6*77iQU1zN2cz&bP +zPx1e295MiHs035$hF5?ACQ{o2@SJ%-=&mCZOvkwwvAyYBbISb)TM?k86zzEvM8JuU +z6^z_vNcekG2rr4N`q2#x#bgiT?!#S={2k6&?$QE^S2Ayck|We)lj&E#M5515p(7Ks +zlB9MkD!^dyXwLVv9UN{TVIH~bUvaOqZ5m4!l(Yx~8}ZRrC||9vZ{RIhNF<_7acwYadH6ERU7iW|ZMO85HBeVXg-w0^TC +zs(oNG2}4I0k+MuCS!tU|!b3rDN_gs%>4$l$g+a)z6(@F`WcVS(ZIG_b9$cYAUz5p# +z93Ju+ON-2XfqU7So}ONB6Z@HrhW5HpZ)aWC!L+8q-CQ!0{&~mzHq6&7U{Gy62L_$F +z2Ev>nIPE5(tFkq`<@A)@3uyc64d$nh98CCLvadZZOb8qsA#rQ>k&2>-1p0#rF?$Mt +z{8a;k6o2YOOp$Z42MaBMnrbra +zA-Oj1Ye&A*z66Fkr(}UY-=D#{K315pY8i +z`HuMKn>{t8GLw8^AjFfVV4q~u(4&F@xeE-uu2R#8WKFRHafITR~#y4)HA5nF92 +zM1vmYw1%#2@j-N%@^X`bjxY|q?=8d(XlKPEo@#M_t5DbcOsg7MGh +z09$n(jtgAwm>z}K+JV^sfKK4IyBtHBh2a#KY9ow%yP*IVZ9Jom+7o1IttEE +zR&bbbeelV%NnZa2F(YgdBG8rZ!U>MjxW +zoHbN9-(-O5Stm{f33H1G8pYhxbu2gK{+E@x_M&&T?F!D=u@OJ0P8Bh0eiE(UPpMn; +zJE*+RY1tT07qKy~@{W}X#>!3TlMUnTV+)5?->vsV(p%g1FElXCV+Hp47=1!35U=h@ +zu7qqMu=mCDrl^;7fTF2+AONc6sZ0ssO>p$UXIQF^kl2`tHYzs(iERl>Pv$~BXVoo2$3|A51}_+K{_Xr?2-ahXxR1SaO^i9dF3X-E;go8@Gp +z!*pym4M8hvRt(_{Clj+aGpms9-omyf*denS>?0~qOnmXvtvToH5z~!uT|icL}tkC8k +zA*?;u&An{gR`E!_@#HNA$KE;5d`L6FQ)1pUIQzbeQ(b?#Ta_+B +z(a)#wDN9$Ac1wP}x%9tH(?0sA4@mH_OMU$cK(|Ampx6W6ngo8H_-z98^E*aNCQRR6 +zhR*l-K!rk@6VGmy@Pi&-?5EH5mY2Au%mOe#ZL=b0H-JNtjJyUyeq^5}VTi=76NHgm +zm-2X1t0!~>x&76P;lp07vg&&K*7Y*1&f5n21{a^HNtUVgYXW=pJHG_HluE~^viKUh +z5<-9`aog_p+TwvWdj&8^?FtaeEdl&Z*86EGJ5FC6rA0GJBOEhWH^5$ic5a2#gg0^h +zh=S{lWl_s>; +z*L&|8-LBnzEI;;-W)!M2*TbK;H)U0XKADY}I09HE%-}>LaIB*2Nf?&-(%|p$29lPR +z>}dRb%KIK9tf=ZphC1v$FHetz^z;ivGt82(<+!)*rnCr6^PX3G0KY_cX=IpqInt+L +z-!r~#X*9aqmwYqS1Bm<9m}!1@(>W{ADK+!d|5up=zy^{7U^tKq9;vf@B4rb(i5eig +zJeiket0HFz8|cML78mNiPi&TZh;T||#Yhy^3N2D|YX%W;k +zCIOfzfN8+It7Y4Yoa +z7j(;4*GW$SbsOFE;V8OG{^;ouU9!DevE7AI!jZFW-`jVSml&$d6$#pN9(E{*1*{T* +z5|vjYz+AEj;HAvAfV~2+2Q&fz$d%G*wiR+BDxe#?s4TkHYn)gnDlFcC&eI&Am4yhiCcd;a+^{(foE1 +zz}f2FtpZtGc;(^m|c6VIMsf|_(Rn}jJ$2tz|r?%ojUv>yB3wmkp6AS8I~ +zMbxkOBi6r=>2E(6&IzsOVEq?@1|R&u1Q-`SnQ%*ZBXVntqZkFg?@_V>fg(kA)YQ~; +zT;!90F6ZrxSUV|sVtHYom7^e2Q#W=MH87;wX*>b^>y%)-R;|h-mA4bWr~S9-}~F8=LC92UdQ*U1SMMb9$Bmha&0%< +za|`$xHfl}J;S>>YqTreYMV_&UNR4>_eQE|^bMrgSr(|JWk58JyTz99w#SpXg;WKC% +z!a?zejr)}@JH012#QjSRbGoKoIqxSWqu*EpS$X-D$ddbp`~lFes2R_yJGes~Z{m=x +zgYyYrE<0f;R*JKcKu><;zL{@3DWl?1S@cA}DWm2T#aj82ZB`t-z)3x@Vz3+8tmG!b +z#qe1xX?n$TOza5>UEFob3&b~42Q~@{u2~X^JQR*@i5@9^~GCpm%wmA{&Hl9l!@rI5b5aSgR* +zPW0}8&o4C?%Z-rn7_7p``wVHG1}yEIq+Hj*)bnv0iq(+=x(BcZ0Qn13;Mu~3vxvO)>p^jS_%&&l +zC4NAr(zIZvb9>*BU}N~`3xGR4NZfdjLNb<#A{wwqs5JoDPxIDDrgaAZDqFhYdc66< +zW|N2FZU>O3Tl#alaR?BX*Xew0S;+RjW4#5iw-(8;p^#SsW4_ggja;U~V#yg9I&KdH +z1`|!F&SbNFO4k+W`{XgC_3Srhy#ysaL#z2-Zw9D~f>*EUI2Uxnps|HEij4@q~S% +zT2+B(wzAo~{EBv=^ +z^E`<2-L}U!4*C1)6Kw$#4KB(A@M(|@2PnWEl)Y)*A4Po-piFT;2WQ#La$2=01IyNF +z?%d4+3@~b5M*V2})8_tqEH}EuEQbD9b7h*$LL^Pb+inX5Df5cHXE^Yb^YLgoKJQ>s +zisaJx$HPX)l?zjujOJok-MF*t&&}I+^#Pqej6j!zXA<+ugeLiVKUm8y9C|5C1vM`IApVy_BpkCg5zV=w9#&})r?`S8O%f7xhV4E)2o`HTa +zXVMdq|M=bF)8F>@OCV#c@Gnw@N1g!C8W?^o1&Bf~(0*x+RA(!fK4X;*QC+7Sijjd5 +z_(~mQry!J6x~9nJn$(DrD@4d>K&rA^vNuB!g~+baL_=#yk%`wIit%{7VAEW8qwI%8 +zUdOfo5q<-}9x?Ul{&?w|pu+K;E`eTijPK<_k?Z9N`(d2es~SN0a8e^Vc>y5PIJ^fu +zS5c1VaKdRjK$6OJZ17ks&%M^;x@PM}+&n3Hgm44LyvFd}STxxPo(=ZeeaWNRgHMJm +z+1x&BJE$G8S)8GTOL{diWxMvqTc8fO;0FpP3 +z@Au|XmUhJyn`D_g2Um2#+hSSjeSc;`-!-o3`V{EMHZ9rld7TYWGnUD^wcXVkEKMs4 +z?C$gb?87;{A^zCd>EpT7^RcUjOf079AoGpakM2-7A@k{L86u{UlfE-)%S6n%;p28Y +zbIUaIX;VduK2sQ#Wlw3^wwH_wm65qa{6&z+EN7$p^~SkW=t)pn24Btq2BdjKYw)DAv?5S +zn;I0-(z5SDh5*?SYS&dB3SI9w57(biQ`ghrouxSgpIwBHMOm(A4umgQVJ%KYt-MK* +z$qW|`Bwpw77c|Em$G)!nj7{_UUPnK*O+o=UVz^JpE57NY=6kNTk5eGGwvOAQwFSj1 +zzOOe|hg*b3HGkF{+W=m%`FyYA8bC2%dP5Yb|(c7pJzI298B +zPK!DflKT%99WL?%VD$Mi@M{H_{0e9NsWFaSmOmg{Sm1F$Qd#iCW$h_*l+GX)Q?0XFs>Q>?(WtlVo3U>q$gwbE^ORM04L&fs;4P);R^$6o;W +zz}<+s?&SDxQpu91TN0uPo#Nx8cCv4e;5;|0g#zdPdM>j`TmZvO+Yvw~ZY$By7D?VG +z%0RYmIaDi3Z=h%8w(MGF{^@YGtm&=OGA5i{%{Fq3tAzM$t82VQmZ@cad*U%i9^fYWY=puQEFC0{n^z)cm7n3KRCm{L1(n7%s3s6*EdTu_Mc)fmN06(Ybv>Gi9h&AlCvo +zyjw`YvWiY_Fj5wPl|h$@mOJ1Z`|x9cbHfP1R^}Y7|?N35<=ubvkfx9jamm +zYDTMzjCO!Oh!)^64jD^5O&l;7cRvF&tE)6d*tF359JDVVUpiABGc&td8<G7c6I$m$hjYx#4Axo{5)#R(AqL%Z9;(D!v!^ht{aEF#Q`b6*gX_S! +z;(43ZcwP9+*4CqCj`(o3qs;uGqJkp*=zxGx=O>~05E`-WhuymN_MT3?_L(`tJ`Vil +z+;tV=?^R6z7fR^20@DWkQIZwd$U&R4N6psGEQAuPt8cu}Jin@`C`ybAV#HS?$j(f3 +zR39usFA&4tPEa-x{Qp}F4igqYgx71A90uOnPUV9oRZ>kp0>CCcM3n?q3W45WQX_02 +zo?AB%w@}d7X$|6NcB+Kb^~d%?!cR~dI0Eq)X0*kluyMkE<=2A;(<3Z&G}Mfq-QqWY +z78^9pFKUs%m8JDzXWs5r)k9c)zWziiI{gCH^(z3=;S#%?MBh#xdQT#Zy6 +zE@Smp$fi`fK0d?HS`&QE#8Pv#z8+x_$ZiaEMNI7x5~UyyU!!6ct@y+`>{rMmCvNlC7==i-AI|+I(7rkXo&YMkrWK-- +zr)LQ2n%3L^K;&}y@pT1!hL{H^ab}3g{*x#PzykR01sDKqIY2TUjF{muQYcH9ka+;n +z)L19N64ILFAD^;Ae%vY0RCM*y?|F^QQ*6^N~@@M!<{o +zJFLmdxB`^Hu+G_xLNV2;UERlPZtA(M#}NHZLW0Zt4~tt>7O!bUfvK}&h!*1qaZz%j +zb$ojAEot(EyOTC_#}%C=^30y +zA&~&>C4f9Q^^sDVu6EvV)z#M9%4HAp_8oW#A}VHV+q0U04%(m#WWk5WY~aOXTd4+; +zzs+D$;l@e$fd9i)*JDeYDIEtQR+VS{bwBdSrL|&4o%H0*yOcak>=dI`%PLm971~z1pI-TAZ)_#+nfnEx=wS +zA+9qm$QdwHlV&%<3N~ye!4@bDO1~NUoz@DzNHSKLoyHY{(W#uGqP)c1N|K=jQ!F{+ +zqMRi7Xl-*x7)g`MK?|SHiKvVwYE{IXLd0hbAdh{5^eWz-Ivw{*Y8}uHJU(0ky +zm4(jv8Bwo!&YlJ7wT9*RUE`7HC*za#Nm7jCH_fXd-rR0$$sR{Q#(CiVeCt>l+QrA_GX|Zb3sE +zkqw_fOdxEK2#5l*CLWEc51o*%l6K(o|1-`$hBjxL%Z<@G#Q(b(hphY3Di`tiW$<`M``pqzL$PQ}mBu#1c7qzvjixKuG7(N^l2z6$J{0J);RtmO%;>1Lf^nsF +zOsCcnt>d_;LEQ&_G66%3bt_R7#)o6YTKQ>H%I(F$pV_6QwXOG#B-hhRj56fT{Dt>T +zOW)pp7J9efpzHmeXXg6l(_nv5QX$gM(q_KRGFH)lU;lWDiHwde;pkXTzar +zu;%wG9k}AiArKJV|MCVLuUFsr!yZ{uAMi=HCyIV{Y +zoO4-8NV!G~;>n!Z=`U$$OTa_OuWD1*SY}gR +zzPS=*>pNEtp{ba3$X&%_TxT{(@8$t-w|DUOMJIK0XvHYAhln623Y#ohFugCm8S~>u=0Xx36=%YBS2aqo +zNkc2-DChW8w=zdSy~$=FpcOqs+Vl8u_$ctf`{coJgy7Of{mWnTd&v$r$L+GJ%Szxi +z?n}h^^Z=%x3oJMjP44`^59+i!Z3vk{^suHRYN3glI2oFO?}Kmf-p7p8E5g{P7?bkj`jQ4%jn(`Q4`c0+nDnIk3dg58(y&K+7^UOYryRoV)==qru;S1>mpT71=`S%&m6i@zfoI(UggIL$QY`#l4=EuK+;wU2>9+YpY +z>Y#_?h7$m!1#jO_$|v_liO(kI*CIiKVlHAbQ~E+nzIXH>P6P->ke*oaj(uM0*3iV9mF)&=k&WRc2@d+Z)F^kY+RmRPSfWSM6>rF2kob{tU +zIRw^G6XHLo+L@lzl1?@HOfCB@NKDP6_ZIyh^QJQ +z&C!}z6q2B-)NX-Ac7e}cpr!0u;;uqT`BYv82KHo{n2QQ%MuK`k6%3daSy^+_hjF!! +zmXbL}8f2xhUqD>yrIrPgdD +z0<))Wda13{^YWL5$(5a($dr~vqP29;{~s3Mn?o`py9D*_XCm!Xjay@wikMnL2d$NG=5JFrk*u~#i>+);-eI0uxi0jt2SzE&7&N| +zq#ef#6am<@s0ROQ8;3FFSXMC8djYG6T%Wfrf?*<@B_ +za_QgYJVQd*3^pA}zMlwnSs+jIFqXB#`)iuQz+(QPMvx<0>GUB6wDbZcWK+I4Y!psS +z^)_;S&rL0Oc}fbNo-zlk6#r;xecwGXr?dDe4!7VJnyAtrKcsN#a2h;0J}?-KpV5BDvs(!(M6VAg=<^6YX2BbUBp_Y3x2CC8Qz3@a+7U#TkF-=lHlA +zPp{?mnBk3*#rS%w@doc$FVovsV|vNPIL`{>RDRAbJ704Sn2nW=?ti^e#2`!6Eh|K` +z8m|T=EYtTIZ5!i@kt~sR%SxL?RK#W~MoAkHLf7{#EPX`fz(nAvhSf~|5FZXOON(zb +zi{ra?S4ahI>@=bDqVbO%F*k^8tej3AC0$MWI$=&6gMg&pwF6Oq%ze3VQB2ty*1w%g +zjWt-A&`6%fGYw);#FRsSlkC#7`ln+eLXR522Vg4-^ej6I>-}YF<#0 +zpiJ9t1!sagQ(I-%w|;I@HROTzb@_IT`S9ckP0(rf6||3wXA5NBjjLs0%IUaiVmn~V +zRfg^)AWs>F`9LB}E{kU5LfDn02QHZR(#u|yDUaadKH +z0yZBuF19AN1`N{*Nnjm+f8SIc+#pdM0~Ie)la7nyA1B)_H)9WY_AIDbd-UTue!%XA +zEv4O*uUHO}o7ORdvq>3wm(mKIR5A?Y;=IVG+) +zoQ6Siqg51Z=jxB1f&#&(zt;FK%r_A(%-c( +zh8M+ohtCAYnk9AoVSKgX_Hh?pa;F@x<&kNLNc&=)>bT+&!%ZUS$ODa?Dk{enn$Dy1 +zA!+GWnBs#RuNEUepi81iKIp01Xy)MNgfmS(URHo(T}l(} +zS}7%&XJPn+e}(Z-HSFn7PF1W#$>^eagm-Ky9SX^uog6!4kKA^#D$W@yO&q-|s>Iol +zYQ575db=>be!lt*4c!;f@Br&GvZPokd`w~0eiXk;V;r4MfRi*bc_>}X}N8*14epZ-X387kYXn_ +zSKciyWlfq+Mz*Ah5VJBtE2gsoVs0_#@>$Oh!_76PqA}7>8i-^H$D#EOBs$N?DkG1b +z@*pzILuzu~0W$%$F;mHR4j+xTCE(hRsqt%9`I}*2T?lp~j;g +zK!#l0-Mu+ZGkSDqqD{X7@^_{9i4bvzyg8c7wDI5}iEy^0e@OtK5}guq{`6_`&DT2; +z5T{&xyXyrVAT|AsGjR`J-lbU0k~3D$fpRx@SSmO+gtffNB+gz7k6!@AtUZo%H_eiZ +zf}Ho&wsYN#9a~m%Uj(N=$kJCZ8|F$*lni3!ALt$XwzwErYNjg+1j=#l@!~5{;W&=c +z8}Fjgl$GTaW_u?mAMgouS-Zh9SOBEIw$*!!ZsB7Hp-SY?kI*L-c;H#9+3!t?Iin;A +z{6M{&IvnBAy9cA9ms +zH{Puy$!ezf)3X;CL!6(lv8vKwydiVHLU*T60GRH>{%cB^MDgkGN_Q7K?=;K}$5>Ov +zGrY8Gyb0&aprEv4ELCjx%A7tfGO}*ZoXtL;iH9%m{O)QTHzrW*XH)+!qOfrMD8B>Y +z4Ef(UPk2?-a0p5X2sgd}7(s%8`)*f!6Zl~z9TM|~Ct$I`x;OCybxDO>IEa>l(8Tsj +zWF!ut5glIk^MlbmPKq!d`^aX<=H^+FH8L7Q0ClTd0-o}uiS4^^Ofc%S{MF%FtUA3$ +z1Xf(dDf-;k%hw>wtXAjlUl>v^hko+Np_txNFXhFZGeBzJ7%04n1sWtT<8Pb7A|nIa +zLW{ng&dy2jB55l7Zd(r4c#L~IYK +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 +z=L%-g1m;Dxs)Qz) +z%g%_Id#H?h`# +z33b5;{wb*HH7W>%KW6XfUH%2DN^o2U(!rBNqL8g16CLT?rFAJsP!wCWPir% +zvX@Ac-q_7W<+MH84R9!zGm?^=y3U-x{A5ER4E11z1zq{-Mr&r6V2!4|U~EV;UNps$ +zql?O$qyDkbdZfYDa@4Lrr4ZS?u+egZzg|#~R$Ew?n)2*H@Qc`vOeNdICu>U!{eB56 +zLPE%xQ5VE+U2x>)+xMw)73%BRMo{1Gn2Hzpc>-K_zik +z-D<1G+|lj@HAM}+iEDYS*Vo(PWKGM@j2A55j!R^K@HABE(~#tz!{%mRP0aodilnfo +z8V0%K``TT)mp1b8XE8FQxMU4bM7cL+zo0XRRZsm)jxeV+cyV5~`-(t{uUxweC5x~A +z+oMkx!dmHB^M{nvwFZnroHBOuTD*;dDfNL72?dN&L~GhGX5o2AW-#1 +zBiT{E>Hg%kZKSX8Lj9H3WcJ-m-ouD|mH2W~Toh +z|3lxzttt!u430Y6QiRgvor!Vo`yQ3}8KW&i0WSUTkyFJ5>t|m5=V;!otjbXl`gS&C +z(`xi?`mCSLl+B$>Y?KYbL67|DFPY7~(8_mS8EATeFS2TwwIO-@25VydhDzF|rA+Ez +z-c>dW==sXH3E5oWzL(a}FWI$9uSrJuh7!c){`N_Ap*gpP~Q +z68jaHT$SK4R+PkxMf!BO)RYHgKk!7zY&6wjKmzT}d!?Hdy%xu{Lo(J28pH(vW0&q0>*AE)8>CMG6Y;nRh1XRz_swq=st=n) +z+Sb!og~RY8a8FbQgx;@3YcD96-z{T6Z%@_3#F?s;fU +zfAr&t3!p!x;!)@Yv3-k*g;7ZpRcZ9fkl)`|np7K5&8quxN3IW_ud@^MV76_`-U)h{ +zk+t^DXdJ%)R`d7;r%TM=bPveQ1D@O#Pwv`(i@^H@kOYfTr(hYPvce#>SoZ)Qs8YN8 +zDPQGh^)ih!K|PaWTy!FixTdS)wVV+?8r|u56JH>i)eu!{cFkdLGhM>+E#4Bth6(!C +zP-1nIwQ0-SzNdd{T=J%KX-XDf1 +z`X&>Cn!fM#7Qr0=V*j;Jx6`FC-Zci0?hYISgbD-3tA39@a+&Y30O_DoCiWN1Uw~%l +z3nuVH@db*7>i8D^oN8u7};enKup`k5RU%tDiD +z%f^s?byZD->GYkGisJ`>hGH>Qs}ru{-isU$36RxR`*#|HIG#QNiY +ze@fQWhcO-j$)?{}lnEk6e;)P_>*@BRp1Rn{n-|ey&fQw_eROY~k35qxJ+%rzq0qV2 +z(y6W9p$=zWYO<)TDIe2yW>ZJ|WD`z5ZI||HRKT+4uAant+*>g={{OH5yC<$r%+_yd +z(1Trd!8oeqr7e)}rYS+$yY)b|pot<*Pd~LnFm1uKe2?wF5M8)i%%3*dnX8~ADmIof +zNmgQ<0-n%s0DRO)DC@wm%P}um7KK#Q>ra4==X%V5rQd*N1%$GsiOvxTuxuwJ%~Joa +zcQSbE=aAx}yAdrXjo5-B7x$Vk)K)L}z%f%E!bY`cag=~gSmxL}g3Z<&eQgYLb8Pr*EDd7$SFUe}>q0BN@&T$2;b&#zfd5_+~==*z%$#AuH +zlD+6X5$(e`3;p~HWS{a{dKvT9$?ef3^*nqN_)#;csd*^>_o!K>K&YvydGB*m->&sc +zg7Od`OfJ@KVe@^sHs=Q>?XKSE^4|GkkvinJ9Rrh_k50%?X_y{Ri2oTgP^(erygQZ3 +zWlIE?!gze6_}1PJs9kyZHQ&!^s}ZY46S}uHwy6g%z0Ibo5ZJ?Y>iK*_a^?e*ry^og +z>YosqQX%AM_4s+nI$yVGj`nCKxXAgDW?Q%@PwtPES1zVn1tYSm$}Y)>2DP)Z=^mZ> +zsLRed&C#L%Lj$8ixehZS%dJvGJ$Q1|>z56mr8PFMhI36L?$5jFt3v6FqzT?XVajp% +zHe@~LvvcX5+Tm-9zdgyuZAV%@>zL_aUtTS{P|B+qQK{sp&1|XE$6Cp>8@_N5w!ThyCFY4FD$Apz>iD>S +zQ+!O1coYQmKKDBR)e?hopYkSU^Emb2kk_DLV01l?9vqZLL_#9x;84?*^@xdB7BPId +zyDrvi5xgVzmmz&?XxW_C@N{xnci~;F&vV%_ +zEV^ipdho;(lBzwrK6?J{po<;!c_BA!Sfze=__UwY#CI8Kg%M2E%w$u&?`5sQ?v}Rl +zS_Xs(R;({_v75J`BqAiQa&2n4&b*@v7*VV#7xscgdb7bxP^GB>EM~LIqRm@5hk~bA +z){LC$@yEw)R(;Gbpr>k#Ze@#}=OI|^m(&|+yd*H6S}v#i=YjbvXIj|0{pEq>6&zr6 +z+FM<=dC%Yu!IITl!G!Mg8H_n9X$T7nTcBOr1~;|LBGXVk{y~)oS3d}Yz>=iTNe!qU +zBLbW79io6s<-clT5wgW@g0A2Yg*6jUer1X<1&)~tW^V407u8Lxp0b%>&d>qx)MVH14Jwg(b@0xg&_n2*O?J9Z8Qf`LNqtJdu6P~!aJ(-of +z%-u|NuB7C7+raenOM%|^CP@t)C~X@Qvup&@bb4h-6hOf}0QvWE(~0EP*K+3>)EX-9 +zE_NWl0}5v&hVnGgp7VwIUWEZ3T#G^9sGaQ{gJwRntt5BD7|YZ0#cVI+e&?tvOESDK +z6tffx)!9?uwI9K!2IZkacUXzB3o6wq=8_uI2b7EU^3{mx$n9p5jyb&hMXT;uK<-NJ{mqeLm-sY6x8s1?L^ta63_SA$c27X-4vF2#g=?9Gp^pj`bh)a(jtvQ#xCAxMh9%+nZmrfG}NhJreb +zLVw!dinES&g~-!!VT?+xnl55>Q}_k(PGdZo2rs-0rJpI5eZm+EoEJ)X)dWE^Ac>Xv +z6r&PY`mH8IvgGHvb0ZG4=2fLc9iM?>znMr!t(5`1NAXG0Kj>5b +z1ed6&s1ndSOr%qn(JwE$Ya;4EK#y6>6#aok22?;z+JSL=nbV1*5VDzy|Iu`g;c>lh*Z#Fp)5dn1WMbP* +zV<(Mm+qP}nYHZuKZQFi#pa1cGn`6Gt?0w(YwbnY9bVRamJM@Pve#w0>$VTtQBD$zO +zf0g0gz83;a9p@+cU*60_`#F4IoSU9Zc2wDmCojB>ED$>}$&ld3ZD7VMDJWhTIcXlY +zD>@TPT#xNP}9IfPR;)fAJ-NWRJ?g9#+QdQaiqp5{$>A7ofY+u +zBz=Y(mBIq+rJ-H^D4cTEk56kmP%tR1e|1lGECLk0dD87~>P79Z2nKPLQhGbC>5m +z#F0vnUokpqBI;Z1nNq%NzRtzd<9t$<6G@qP8T~*piJ7TXR6L=2b#~>LhF}dFqsM(1 +zY#+9+YwR6m5#nb0AQ*lxOsgEzW3ZFv5C9eA*@&VayA9iKnlO6yFK$W;KP?j(&*Vcd +zDVi>o_EvMRs9FE)Ho!)PT&;ccWP`|CdC8V2)H}axA7&_|<}Iv7oV7fzb7Sle?>gc> +zTI!$<^l1H>aN77Am^@|E0PWVg^V=HoFqi#NG}FG~|6IF(B_^s1Kx0*VygCvjxUaXl +z%yJ|b6%}E$a{+-`C*qVxo>mUI|4n`P;39j0Om_lF1o&H%~P19N&Mx_ +z!m-LTyVCffvIPZs*ds%KiekA*LF)Gn`~8NR{EwKmUY+F8p3LMfUeAZcdh~>7&pZm0 +zLS2u}%!F%Ta0OBXA2!{5Bl3Kktb=(PK~hJW^SS1k;Y_-~kkU3cge)nh63nD9zOFRm +z|8uq}nAf)bIhR+2X*}j-&U(;CL(P9IPQPQW(N7^|oX06t)x?r8IwQygSS4OxU$ePC +zRsHQBKA6}0o>p0Dl>^!zP@}R*FtsSVIb^>=q!cGZ +zZOdLL@gX}zmM3IPYVT_IUDH%R>o{40GIVEJ3z@zSE)7YQc!Wo)b);2%kPhp6Y0$ +z%p778$Q4D9vsz}1Go|%2X_PlyZt*wiVUpHuIYX~q(B8Alpm(_7xI3AF>}MFh;&1jg +zjs6p5&GmG?_Hp1Y!-6_2A9_` +zP+a%smoz}lzf&gv&lb<;{&X=9V6oVC0tG_pgKFczr82r|y~&3E+e+i6XBe;@{x@7M +zIsrQdBOR~j) +zkXO9s_#dI%xG{=x*A%a`9?-``=bF?5rw5zNBHib!RrF01_ijyFT@=2nd)MgtI*lLE +z%`s|Bqji2axo#V>=OChQBZBg3gt9VwT&{9kK9scrM>))DiHfh^0$79Or +zNGz#t9NH+x;`D#AhZeWAySt~erAx@lpGVPqG-Dnci5SF4jGnVHAY=p +z0zEHRwOfkKnHrY6v^g)n63kJPMSEcLl>WASu*!5@$p4io)-$Vt&G1#X1ndXbSFGW; +z%1%x|uM_XY~_4FpaE$Oc*}B^U0#0~ +zp(5}9lYg8tK7l%(-vy}(TNm2LMfv?7O?ls}A9`o9KF|aMV|-xJ#lQPi*0TDlf8FDb +zl`6u@eCiww`aZqq5;CA)2m8G~vflYxcUj!|1Qvraoa|6$uJ8lfO`eQX>|;MUG}NOf$WA`3Y^+?Y_WW@ygo2#+pfMY?Z)Gq17G10f4%H@r8!cS?2kIPt@|lDw*$=9 +zga4coS`@*KZRb!ckU8a7rynT!sbfcS>$v-1IDnuBDk);RI93{6KdBhGHNutX&-uY> +zb5fKf)7}!GZ~2W;@8E2c-fHa+*ZrKF@#hVAUyt;PqcM3Q(6lUYIOvuqYs|_uUBv|C +zP$NFxU-NpyvbM?yzWJRr=ZR$_|1zb!M{zE2XzG8`7p1Z6Uyf6Lr*b +zh2C3CpSP`T6xHHz@_l(WIJE)vkc$1wo$a9yk1w78EefJB&dMTcBj`X7D_3;1aH-bf +zQN!uC?EOOHB@xv=1s?qI&%wgN)2g!P@=_8ol#bs`;qd9Wh?xvc3L6bo?sicIQuU}aWuJR)hyOEldir)9ycZX>%QaN +zA*+SO8dvsrzxg{=myqhA%D+i+5+FiBTU0X>a(|+5)gQzKOdX@AtK%{E*YGe2!L9Ye!!aTA*`L3?7q@1mc?3;O +z{}$r_8;NEg?+4B~MefC4&I^@V`0K4so%@e|58SaF4<`FYd1tQfOP<*g@TM>vxij&B +zft+WTO?&xp2Jg665*F~zE&4Ibs6`ISo8@*KVJ3=gUk*=lX8`8ct@@S-wjr3N=~tz*3K7sgjb#S-{-`9q+&_TguWSS)dp%wLd@hg8 +zJD*fLF3fGLHD%4=JpcGN{7v8Q&?5fDk;u#A8`R1rou%zc*5NB9RLLK1&E;7TwhZ#i +z01J#i4g#|oL`X~YZt0l6Uj1k$OOTb1?*XeG{4-rjW%?}NY#?kDrXDas4BI;b>s{*C +zFJpc_UQTv^^$nlY$~+DNyyHGCRT$tJHaR?|};Eso;*J{pAXEFvR$Du{u0;dhe`r6sAiu*P@1B +zXYof+UipJt=fx_(mAcySqcRq5%;o91((n`yNLhXfUFsjTaj!H^8F4;4FFBG~{<6;5 +z&>f^V(A_yM9t_j@ZLqWzVQ2s6L^W#ZLLY0Z{fsWLP0Z%qpG5A^y0F*9M+%S` +zp{ghFNa3PSn*p1DR=B~}`8l@4PMFmtnh8Pn9(!*w8^kSZx`nlS +zFRJMhTtVBYL0#00^A1{Pi1~%5#0rUG`med;06@7{YkPF6Q9x<#x;#*XA4XBwoLAxU +zJ6nu3nuTv_Zk?Nrid+pjgjXOfGIO2N^~3_lDE~ES)!P8%9r-k>LOaFJ{`gR4*2bRs +z4NMbEA*P4QuyPqUe>yx#HsX>B18y-@&u77lzQUml=jOLsvJ1oKydJEHh?v%?u1b=J +zL0tZ{E|QvySy6NWi1uh(%)_`||DSGbExRojh0!*#Ruut#N%^&P!Z!9}pb6IdX=OXR +zu(C?&TRbvEWp&vEB_Z=zdIc0Na3o}8oBfdluQ`EOx|@*O&Va%$`u6#TEd6eNG9#xx +zcnQ$H#O4mNBWe`f7f)-}6p5tQkkMGl-27%jp8^x$a--XSL5V*jCS}yH$ce5;nxEk7vN@6jZ|K +z=q;iO%7@*k+xyu}<|a$8`@=NoEDwM)yL83?|9;X?GgB*OOxW4sNj$;9zaEMS&7nF{ +z+To7Uz>9`GlzEQ%ug&XD}jNQT1%A44RmruLxKb4j&BJL=T{cWm= +zw7;&eckVcgE8bICxEY;5pzKQ-;2lJs9BN5FORu6gEh=MV=2rM-yV_+)wzCst%wIMp +zeB;b;j3d^X6y46zg~uJ{6xbM76upzc%90Zt)=5?^mz6^1?>_OjlkW3GZ0@!+GBM@* +z4N)6$nH(u8=`K(S$d~oY!}3`#6MZ3Zaj}a7f1x9K%Rgu{bwH94A~rKRIvVQZcif`Q +z5alW02Ee6JZ~BQ(sKCVm{#2C@fUyDh;lsbb>T>9RwJCt#(S0%gwGA8{dJXW8+I+mZ +z$dFo`l8GW=ma!J;deU|?sZtkcmg;mS-C9Ix)O#YgI2wm77M67>(K_+A(SXG@5Q}ne +zR|zF%rl?NoIE)1f5XgZ{!uc2PoIRh&a5S%o0n=l|%>9b)2R$y=3}H;uqcoL9n+OaT +zH+MUNayv1eR~h35?iw=SnnWL5_&k>i%=5#AT&xM=Z_yl3_o9c5>v+RbYMkgUOX!wnRfa3psX#(|}Af-1O-7QYI^T`}>c(j%)c;gAQHCZz8K<>f&GpLFPz55o+< +zUx4j-57G>MO+9+3D~I;@fCa|Y7~>J^88_3#uWue^u3h89QbR-$o+}AXf>9Er%bk&h +zV&ex!=hWq5;Ri5R+*(RdN8yI_*V991Z@V04-x#&!)vRQ=7qb?LUS3eCGVi$|+c;&` +zT!5SV2dqz!6oX1pUjq(BO;FdhKV!0!1G^^KDt^HlHFpYzR>nJYcZH90%N#P_LxaF2 +zTEMNqj!M%?Yj&m{$bw8nZDb8P$@4f3C*`5@7=r(956`0a~f +zCE;7!j=TcJ+}r)M%XcKgaSnupC#pfwom!fpT^S#Jy8EO<#`Onv+vK^3Sd5CcYDCGe +zC*6a?;vy!kx#N4uAUTEw0dv%^;=04{c;Z~JP;9vh+C--uqI{B=$0AH5qGHySk!W`L +zq+WPmtw?FP^z;(r+bNS6g|B6tKX(E8HMI+ueuKJmjNJ;0JIE*efIHSa5dsnRgV!0dV55Jc07$eOmm^oK!V4+hB3To%Le3wRy8G9U2JlbK%X-!x@J}r(qc#$_ +z#O&qjeTZPEDih2pKEtbV0+{Y4)kO$O1Kp=W63cjg@d{a6HzoYCdZ`y0NM3l70ZFy( +z$zN^U2Tp2TCEg9W9BJOZlqS;h0_Dk7*S>hOUdcYsahm8~c^uD_?=IG{-7J@OEB&gC +zFPxFml0HKmfK7tr=i>BxNq4YBJ^$v)hOVi;$YfWOWLaL_U|5P&4K^*t)nE(?K}0GM +zm7Kl{7qm%s5qD}*16i^cu4w;(I3%#V2B5RU^jh}W>#oB;%}6l~;3ZMN`*0Fm{Sh^E +ze9b8q*WvYsE9KEl_hY~#21NHTeACunk#YhdRrvq%^` +zC9Goht1@46@Gh(~PrQ1;SSCMaKdEuq|2}4QYySwkWpidJ$c{cE0aO#J#9jhHOhBB% +zlsxON4axSp6MDh%*G(zbeg&vuk-w&}BCe3<7A-p#8)dGx2zA_*=HkY+QpCC$a&yFE +zv;OUBaow+d0&Dj5_5M`p$WtAt%?+(Jn%ub2g$=U+Y|eyqbX8M2armrbj?}!oyxHRS +zz7RidcF}I$Q&rG~i0y!+bM8&4^W8W7MTFhyN~S}lt{`7|#}pUYT!E0+%qvr0;_+GS +z8iekhjR#qNV{A;!E~7N00HzK+Q-Z9++=wSb;hH(xhq8-6fp$!uGjU#1)xiAp8XB1& +zsfW?>rYEGETGmvkq=XU0=sV#T3e+PT_xbkjEd+?TVujn4*Ofip-Cy)NQUjljsQkn0 +zWBM6~mkYxn&tSy|Ua|&$p1;t)vAD75;)MMZzek?_tL8k^o-2+j^I)}tD&~uL!MJ)c +zep0fcJT-Dd8gSx_>sveYQ{2clxjZH#`n8!Jtc2yJvTmc4G2grV<>&Q-bwgt+mIfg0 +zc4Wy@up65H#T1u1o+_(j6p3;*Aaj4U+@aV4H68>^B+$Y~zc +z!q>LXMrEWlZ4FpSauqxE-zP;+C{UY(KI#Lag^q}(OOz=~;<#e1kuKmYbu;tk)oLJZ +zCKCE{KTHhSaFUs$K>joj6MQ#IhI@^pVfmSMA}T*ZmeHLARHLri9|YCD+06Qi?d_PE +zUFi=G{^?!S^^hif>@DEYrYqRK51kBwp4wO<;-fI3>uZr&h{uy+BR454ik--_n^u(N +z!OTDlGC}u5Mv{mvftYnGDICb}&#SOvCWu|lef<7qFH9XF+7>6C-DHSJlF(!an>`)aCwEiZTmA*_3Q|3|;L9rkdJN+Dm>5zl$h+x%&3hC(s< +zrWY3<4?0(u2TT?#lk+$GqXjmtp~6wWbza)~+Gn^kF=6d}8etPz=ZaM1nsFZGmy6OF>2JL&CaMY`(Jrvmd{jxpI_dxSLq8spp4gf+7;M7By6@K(Df@c3QF8^N~3?|PL~JCuSyaWr4?;{#5AiHh2+xIWFnDT|#yHBjGBdYk?{e+t*n^#UHhU +zI}LnrP{%@DpAy{Zx0UW4o#w|;Q(+W~728S6)ae<)PMapnhBIan@D*i_>sFPkIDBSM +zxyUe|MbZmKk5!&6VxVwKNYYG}=jBAR@PUot6xarB8&;vs_jbcp3n9&%=)T#_A`qEU +zhfshk9UcwHXCME*8_f)eT8}StKFyKdiC7{9ouV24x;Wv)IP<$G$m1I4>tLI!g5fexy5$v5jJUJR6A>Co>I`YR3 +zp{Q_FEKnTy17-*KPPB}v?XG(!df2~c@derp4h|DB^6nec!lpklTPyN)Zi%^1z&Z28 +ziNnGu$NdIq*aNa>6s~w%3E5ol$Xp*U{0gOEh40}eM{Lq*iHRY+%-LY_v;@0`aUI(A +z=x;tDp)nmSuPJ;z)&+?3#i{(-sYNrzUpVv&Ismnfgc)}@5XOXGHm}&A9eV=%YOz{A +z+;o@vxCf>X3dqT2Bvk`u@)&YMz^}V46pJ}IH|+YvYGa0!j^oXmrXsH$dsG~6PjC?l +z&=s^3ukE52==!d@9Ee&J90jYA#M0Wc+!QmwfW%X;Q+G(8U9y)$07CxCFNFZ@#9K0G +zB`77FP#zlc3fU-U4{E~u>Ebhujg=FBlUlppq_AG92tOu+xW7ApgU4edUzH8pLF)?e +zeYohpDr@B!J#v+L%Mq}-wl%mR7M$>fCsN!zKkD88=17OoD1wVzDW^T_Hh<_+*c0rB +z*74=EEK@gSMDuX8E9M|d@2He4=KCP-7KwWe$MxhGWYt6tRwo~fW}k>Et^OEJ5`-`) +zCmSYFYpolTC|yTv$7j7`{jwC&OLNLrqPr5eg=Rs_oLFsg%{L%Al|?lTE66y^HmLhz +z!M%CH7g+x@umMt--KJToOqn2*SPKaBDC#cPnJBi{NsXnc>1lR)YQP{^!c){Wz?H+R +zI>o8I%G`2sfzQm&_UpttRKuVAe7;gF5R&}{Od;QY41;>cbhCX^W<7D4YN4Z~(F-C+ +z(k&!5)50mQkNJKbM~gw&j1v3Rf#sb34R9{d*~iRCm!2tvNNBlMLn>&HW9(zc(&-yv +zbd{lmn!En5H5UW|W%FkpR$0C4w!I9fJ=yjgYQGi&+v%NV+K-+v=|>c&#kx8s7>{@E +zv5#%FIkQD%EiWEe&w(`ATFute+v2rzgMX$?S=oB+sF6DRt@lLD*q4!e#)5>udiOtt +z3EW{8Bx*E9rvg>X48qVB)N0`3sxM8kXaMDRC}{8gdJIL&)9N7yB|Va9`&KGZky;6P +zw)mORCe3HIKXnEc#FS3uV7rvdEb2Jpbi;aN1nuUp_iIRKLmA +z62kgx*FZqckDX7y`fJMu8S?PGpN3t-`%U}>WwzM2H%*y>V#xD5{m0Ss@XI&i +z^v=WCgGu=~vTKys=^t~%OvdO&=o>&`yB^h_Zhe<+A&BoANUTzjZaNpC?7?3O+;YR+ +zpk)M>Df+u75YK)2`i+gQ@0qWh9^&k^Qg5TbF`#Lx5nBjul-%W_O2&$EjB%`T=A}A8 +z$XJ$W&OkSqS!2tPJv)?k4eTtYRBZm!Vo{tq^tQ_bp +ziIH$>NpsuU8;%ofl`9xSxi%3QaShLakvF46c3w$5a49|8;T*rFD +zEn<+TOeG^RAermg7b%AQJ1=xkbf=XsDHSCW{lx70oCp+QAOpL~ifGq?jsDiP9dq&f +z%hlUX!fR!efxD0Yh=e2ifYeqf81x{qMFJ?{Tu_9t#56XVg?8r8n4@t`@9i;2Ty_c6 +z6{{;QN6?^vsd??PjPG|sfNQ3r25_BXWg`2ztFsD+&3jVv!(_FFSwKO%(m&Om_+>pu +zTatV`YvDEDo!NTew7SYtYX4B?r-qBqh#SOPC@xL-ciR{RjtAwn=V|w_W3GXXhb7Ct +znwMzGO25$QZgzOgNTlw?wqw0MUedl-EKLwpLb_qrsBl7)s1+|kYN$NBe!f3`)^Dn4 +zt|zG`{m;y0_6>z8b~ye?rPfdfSV(_DGk*?Dy{ExbT`p8U@j#6Xd?{{kqZD_;nYF3ado2G>uXnhOjg2N8DL-ZETizX#axJBz8iz8F0LI1(AlUCjC6sp(gh;DVud7)pNF! +zmWQ`R${o4Wls0l>&jOz%uWgDa;kSb;+L%^miwhL!3p`h8QMBnj_~9x#EXkz* +zb66XVuoQ95T>ZO4FyEHeKk68iW#sXwXZPM@XU~lTC9p(eS`c5)ff{j+N2nR@h)`9F +zOVRm}{|R~(t=agKWr@%uTo6^xEizM=?5e}EcBXOVURVMjVI@LmvcfMI-OaQDtm6FF +zOf9Qdo@Z$%eDX5D{%X>ad(4acf{euRWu{- +z3VBkW5h6kjH8jbXlNH)VN0~wj^<^mU518ieOF~yV(0qqHb0oTn5e+g7PrC{k@YEWk +z*;ab-h}Zpy-xEWRbFB__4ztv%OrOQ(0OiX|U4@Xmt6j{#p}}gqsg{No0W8O|+k&_} +znHT1{W5c|wYo>ksP+t_@C0d(;DunoRYi7)QFP8R$clB-j>U|5$@nRMInJeAmcafLIt%IVeBzwDA!Bp1^RE-Tc`|u1F^Rq^pK1PB +z3KZKyvMqD&iT6$@jSC&j>(L0<5iwbkJ%1%RucwQ&whA(-%Q%;9`n^+tSVUV2`d@Sh +zq}h!6!#iucI^;auapPdpsr$rpg$*;4XZK$28NnohXoqaj$`9%MTt4r(IeEwOGgFIE +zKBHy$1(NLGR=;Q)Na*9-xDq}Qm$MjbA(UHN1Oun#wq+5vR&hK8y8Yz8bg%*chQ@zc +z-%Ir7*7V0cH88r*G@g9S+rl9YYa44J;z?U&^k&$I_fs)R62Epzr$M|vY}Cvod1**9 +zJd+20!RdwQpyTWpdu~l~oKsO9@G)Tfvj~j)L~Iq^3Pg9$EP%3kzeyOJTOSo^1ampy>J>)ztJqu*B+h9e={(fr6OOFNG#GBTOp<8zOh3ux +zGQ@hbT$P6OFD{0xT8*} +z+y6QKr3hB=+B_!l41k*=qs6hF|9P%*Rb$l;6sryl02dPc)&hCY@JDw$XOAS@{sYFq44`&NtwvIEixbUC$A`Mt3ss8mSYrw(de`}klx}jiZGZ=Ksv*6=BNWXjS2DSZ +zSms3V*nQM>27*-Nk6bXP^#<)*M8GPXxQw>zA+kt8R-k|>bnF1i^VZ*iDI +zc7}?)rh&X)-t2w->{<*tOm(z@l;>PL(RH#SL7iAI@jgu=tU&xc@ECuHAEJGl%0gD` +zm3>Eaeq@i=YLn07gF9x-_e!6JwW496GzL750^1B}aeXcF#gq9DAOleOnAF5ge2{_1 +zFsH#RD9#Whgl1ZlBDIXpT;G?Ap*;!}rdmcVL$SIk*#p~Flx{{*^s22B3U+C6gZT%J +z)0wYlJhuNSV98%wnYOI%fNwO&| +zMGTYbwC0&Y@&7;<|Ey*Zh(2iLs$pV}cYUaQ1CR@LNiDsoMt8=tGb*OvMBnNZaV7XQ +zfZV}inrmoFaeoOJa>q(yuucS5`F-RW;_%!wf)&&;?y&acIN&=*EMna)H`KhcuSOnR +z*n}$_;_@(U5sx4XS>Gg;l^I!-G38ICOH&=M&*r5R)9q~q(T_}L*dX9e>i +zdv`tH;tSC$i}NdpjO$B3p_^PhF@BX)raA8I#d7^l^MC1#t{~~R^f#c5XAL#oJVqk& +z&!5b({ekk_m@z&L0NHGa71>Y}@;}A06!IUs5MtFk7kFzK2_X}@E#MTeXwhsoEuo;TVgYi(6)$ep1>FHs}%do@-HEsU!1eYZ;LKtsyvgd9Aj-$PU^MEsXD +z_OnxUSwk$r0-xr)p-GgkE~Sfg2>{u%hz9$$oij-X|!7P>(lMnzMMl-h*#_mBr2Gu;pJ?FO-o=w$uU+ +z*@)%MpF=7$SMGfmX)7^`&v~FXZuPmdvr((RMy6EG)pl~wSM<)qcdl+&Z@uB`a>LEobu+pIXn(iRl2!je;7|bI+9n(A23J^br +z55trcKs=8QBseRLKXR&}mE8y+$HO?p*v8>D+3d-8L3u1v&!_Z{#!M%Bjp#e^Z5`{_ +zHh0vgB +z2mdmWpZ#=P(OBH+`)+Qg7vM;oj#mYS-(EgA<`;t@KR>VAehB~RZ>@5+)K6N&OH}w@`EK$Z5is?P2o`ym(}B6UV&nr^>310=d+v$i5uiH +z_Aq7)71G$R-WR?8vjX_CiT+tsk4{f`JvR@EU7@ERUPHz3*4m@LmH{pdjyjIb$)0H6 +zk?vHJg&ft}JFN_5nxlE-=pYTDRY#k%*VHS6kT>X3*`J-hApIfK@U3Y( +zN`VMH$GW@c35eEIbLk`RNVul-rz~%X#~MVHZA6v$k#1K?dgUqAS_X%Q_X*1h>+ZHh +zI9qkOVLWadS9f1=cgLF8g#ijtmW_t7(60umeNDQH_l|li6a~$Fp +z7C;(>~WU~g%?`s@3erlqJiQh9#aAr1#jkI-PY(bEjMl%@7@xlwM +zB+fy-NIyErH5t30psI$R9-jCg{zOh$G8BNro; +z*N#)yCN||9NgLAR!MV`Hb^M3ZsgiKyR1_9ud5Xe3mVg{hUg2f0%?P$NXx7m8q%VRJ +z4f7+zDYEe9dlT5sc(4TK_bfbPz~F47m!S#H_&VtQwl{sCc~dntrxGBa`(P_7e)VXpGL7n1=WQUb+C)( +zGS{RcKfb|_V6d7tno;;vB=)>!oN}tbg;YZAgZsN8WhkUdshVN3Z7EEl9lku0$>(Dc-iZWLaA~D5w&kuMxkF6lq%GH>hJmG +zW@i^NkG1G$ +z5r?1~NijetCeAJkk8=mhQQx9Nz$K@*4NUxwi# +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 +zb?m$b!dZ23~bQ^n_;ZJFjD>7a|^74;cM;^8 +zR@FS?i!m~-4lc_8Z0nvs;O}Pp@h)kgB2eC)cfycim@FRslFOBUw9twnJBh!ZoHD45 +zYQ-{4vCN`+BC`!0e&YB{eMMA$XcO*u%kB((1&xjiVW!t3YHh(UqzTs)h4=L2;Q7Gq +zZO58(Ex3v;?oQ@qZEp7pmzx0!4-J*Y<#}ypw=06}uJq_Dt&!PWsgiWOrm6*dm>lJU +zf8-iQpl`=*3<5R*t<_2cvJ+wW(19+Pou#vSxE_?9RHem2X@8{~ot*ZULYc1u_(JWd}+eonoQyX7YLZKM?k +z^PsIQggJ9n>;y`AA-?=CW(#GAe5xHX22>v|K6j8epPY`z!CgbzcPU)|?Q%r;xB4w( +zRi8bXx^rCVDW7`Jk1BQ7n-z@822*5VbG&I-I?!9q%(mR{P;Izc~^{S8Z +z)MpD|_sBH!;>n86DH`MTF5o#r$vY)_3qwA|j1jUH9FLa1@DlJAFBMaaBvC>gVnB_m +zQZiSB(&)M7I7QF|e+&B^<>b131c@(St^iw}niAFQGKhAzSr6a*eSZLc)+ku8USkpN +zs?`?uasne%1~+JT)J6`Z?rm_n<6W6J(RGD(Ni=~HWYEYugppLZe7ci$iKYz{-SMeA +zLA`W!4}6(N7XI6Iq~;5fBg&BHSpH#PWE2E26+%qMUWdJaQCwdie5rE1T2GiRxzOwL +z0~0e;$?@F2;>u~#D9at36F-kbDM+d2*BG^uZa^CwE`MrKksfmX&B|^&N?_(5-)eYe2)kbms?pw-9YsSBH +z(MXs*-`*~YX!tCy28ga?MGGJFF9gfcthi3#HMTys^1dw!i!Dh>zJ7PEocs@5H7IA$ +z$iv3t*kuerMLt~7Bx2vYF?EN-ck;1Bl{I18;dh$9;6G3=LvQ*eSsxzYLVu@_FJcQ_ +zpbW5T^&mi#T3GfD!+7pDT4J_h)Xmeyho(UT*zBDESPy9WZy +zY>vBJo;F*I@ET`|A-~U2`}!(`$tBk&A9%Bc*l_F +z3KTz}Cs{EUx8MdP;jqr+$j8R;;53fu_3(tTP&t+?jdS=fE$2~$)d8J_tn +zu2!~@?5(AUFT`j51SVPquhqGb*=sk=vD)JQ{KjBekWBP&x%@6Ngs~Hck)dO9O(1%} +zY?`QUF}O!G{e*>Vw>+srY=cL3>5@tY@y7H8DK;Ot +z+OmNkMg9z$^1S4-Y(*I#mMGUsJ$`=3{NCx^I{gtW9xROcsCyM|C-@E*p>t{;2K!@? +z(C7dsI5aZ$cjg~~Z0QfFA>GS>t0$5F$J15DMYX+M2`NRo8-|dS?#`jRL%Kn_LqGxP +zp}U3#>F#DI1!<5DX=&;Ac<=qcU--mt81~s`@8?--J!?5!uAz3qg3)ql)rJaNdTI_% +z@C~Cc2g5(zj|wTJOk&b98b`Au716vhy$T7c4Se)f +zFp}Bi6>VM496!kxz@`>#|Ab*vgW{^)G*J#EwzWu6`9FCl!YS3wV<|AB7FQ*+xC&TG +zPK+lrH>c2Ogx?ZJ6#C@y#7c9h_&avrAlOOzUnOvDHbbK{-(Yn_@)cNe*1XAVagi$Mk% +zRrxd$eA$_gEfB0Zo$~|m^{pMUy4)m{*EcZHPT+GD+4(VQ6N322#d`Fc;{3iLfa0l3 +zIrn|K$!+C*`7s{6?Mt98GU?5Z;23!C{M~dx*Py?D&S)rtS*RJ_)92AO9<8 +zobzKR82~a6{k&+9Cg00Sc~ZJ|fxNecI_j*8JG@$m!$7-At|7$-FO0Tly0Fo`IPS=# +z?pAQ}5uVQLSJBxkO!6~rP*QZ~)WDT|$(3Jw +z;K!sS3SDGvV=`XGUa7OVf9JDu7K(6G?lK~#)shp$3&H>uCa +zYaOedD!Nk%A745Fpa +zfz3;qJ+!gNm3@p9upSZ*#%KpF4%+>hYTpj=A@QqTCfanLoDcQUU*-?noF;A?U3cX7 +zo&CrLgQ@63&Yi*fC?vjQ^Oci-$$e-5U`XYUeiISqmU&8kMB0qMC|nO_+mbG%@O()s +z)owVUI$o7mX(rnPm-SjS4lSqXJEc9kkE8Xv_z}8Lw6c#rFqUaLW;g$HnKdj{-qfX8 +z;=JuG6`bhpq@P2-mW{7rQ=excwnwo=2?X>q&F~DZNUyDQUTk>0$ +za;eO0WJGJ*#%oMMvxygZ{dn#XlG@3?y{oz4Q`yyyr{p%%7%v{Hw}|78B9n+Z;W~pS +z(J>f=v2wg3mF#?I +zK(2BjE~LtYECTt1yvNfsR}6?b5igb%{;UHTe}9`H!2Goouy48jaw-HP)EXgn!uvfB +z6&;khoy}b{Ragn+8r6O^%bAJSLz7=(fnQvbEtp|ljcj0VuoB%Bx;USj*J5DmK9)FR +zAh+ow^1xwdSr&4hL(8Jm6Q~dnB0iF;ePf1jb}{SY%_JK@bY=REsHQiF0Ddb(`r`~l +z2mE_(Z8=g`gL$-tK$ia-b_DOBdE&Fv{-8rnAvs!W#;o#JH`sAwX>O6gfmIb<^~=Nl +z8i~qw7n`l0x-)|;H#a@~t7P+qPWh%y8NWTb4D^8>u{VU|xxg(4zx0AyfUwv!egM3@kAu*>$Z1#d4^k6oB>qwdT9Y!rYux&?34_L4yEIX-{U{p?q?60a +zNNpiP+{tg7Kt=sg9S9^$B#T)CF1yM64Et(`j;>1;K91v?1@O?+jK8L38(~Vp|T43H|I9q^YAP8{aj|=qC@4 +zVqRhCyt^54xm&SL}WMzwhjuzv~6R!Y@%cDCqb>F^JsQ^W;}nJ8flEWvvAayW{bC +z*@nMCSo^u=H4hIDAF(e|Nk40_WV&2i=?e}c&$Fu8k&`q$;S0J&W0lX@sev$ca_LX1 +zwvD$>PNZlek*3mjuf#2D +z?3mK|wL|$_R?vwje4K+g%tQEqXLnVX@m|Bxk_bCm*VjHf-prWZPtpsS98${yYSpx2 +z@<~o`v`wcKx5UJrmC?7@QuLh}Q&&QvyI18tWCP!9#3vSXO^b|gJ$pJ*5nEQ#A{sD# +zy|2z>lERx~9(q`9PJPDQx#+YgKVfQ_J&6B*17`0RaFB5#POAs{-bWwPO+pMh{^`KK +zPyB*h>H^sRMzkOeB;YvRz&#i;j_xo+zj +zvt);l%`{RJtca1|^5%k5c?k3D2)WNPAdq7zS8%SD^!cW4lg(+XjqS&|c)?$)s-i~K +zIIV6Fj(fl|T#)Vl^Cua@j@p0(aVtwz1+t_v3K4KjiDWqd7n!e?mt=%pMHYHd90w&U +zO7|aDOlinyfj01|sWp^elgp`KrVZ>ev68PGfH?t{=I4{q=XHzYFyI;q`N9llaBMIX +zO|)$Morhz(*Td#K?0}8CP2i!S?hck%-m|mfzd26xOY?NW7udCPQq#Jf$PIXgyvSD@ +zTvcgY&rN-3QV;(hzwI9K!m&!xU583&fBSQpB_q%)SN}DHGvTOon`aYy*6ytJJoLq_ +zFvgZPyci?0*@r$h7HN@Le5RLAVWcgT=c|L}*&Ek(K^EBghTn6@V}Mu+n6bZcdo|0q +z*&Cb|<8Q)@hu0pT@U?1&ES_ +z#Z5o%40At^LZg+9`GDSR{=j~7r=H}>_T>%i+Qi2i#|HHzvpbQYrlg-OVsj*jv$M(P +z`cC3p5tZ&?w;83Wrne{L=cfpcm#K4eoExbY6vk|ah69#9G59O7t!t0~a2i?VF?-&7 +zUR|~Gmzd=k!CRg^)McGit9;+$FJ^}pYMonuu&`x6pJ%=4ju=ar +zAK)<{*)q4snCEdO|nHU#wqNh`cO5`; +z+KdGah>4^e77?&o0Ai6*HGJnwKZ&)oR2KZSc~5XIP`k!qt3>*vZ&m$k;+N{b;VP5? +zlpju3_+OI=Xx>d|zD4AqhJT2jtu_(8UHPy%5E+f~vCZo5uVqu_O+Z!TBc)86H)!h1xRH;R`2A8Dy1JJbs2bo9VGppLMz>d>L +zLuG!8Ae!V}`&S!IhhL0u1$4jOD*lmP%#qSQ42Am2Ykd&==)~ct&J;^ws)~sxwWLaP +zSHBq49523PY-?_*LWgRFkIZ&CvTPg@sVfMNA;<8o2mWW6e_eRev&mFNG<5qsZIP@_ +zj`8@;Z+R!}@xlvl?BwUdy~I1BYsm_>NZ#3LgQ**-LE2W($FG}O+CxcUMAT4gjaP3r +zZ-cs4CH9~v|JNiuN43|z +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 +zr;490*{}A4Im5$_1oybkw?ps(0pI)`5Gc +zFs!xHIH{>|&tC>GqH7-Qg0Bgh+9S5sRE5B47{#ayTQ+7c*F+=Y=~trwq@#Kf%=f%O +zLU}mSu3~s@c^LCj9I_#j(yAIqT+4^+2VXHTh00wGnOM5GabOInD@jIJ4BM7bPsv8x +zExhaGfa=zmaW&u7du$hrs%wbiU;?qd6 +z3+h-KjcL^9oEY)SUeEz&RV65xIVbAAebJzI3?>snlW4A!6P4h%R8qisyx#IEnjqkn?sCj|B{Bjl7$X>rRwmgk2_!r`ycgHDciK#O~Rp%@HkzKfgn +zAG1wST0a4nmt7|m3LagWVnF+^`NAk${r@3Hw2ynT!T4sMN8c^bR~5AsdqG-lZfGwn +zO-L2y93@jzV#0p22;;CcO^xW{2&A%C1T^>uw)3jXNi9RbJmBKQa}Nj=V*)dzox~K0 +zicjB_c~%sg48p9>rUxoGA^@5G*i}(CqS-f>KM3bGq$Nu^puK0|x9f+!DX6JsMVh`Q +zj%*%l%L8vf&&ZD0p#|FAc{IeJ;w;zu{dO8Cud9@qGpMTDEmmeDXOe+NLyjvoH&XmI +z%TvNmFv$~JeQfhC0MI0xvHEc-yk;yA{&UkWKo$DP)T%4t^JaA>sw$OdzP$B#r)6w% +zK<@h#%+FU%)kldmrf+L`Nz9>@w|}Di?Qz-UwRTD^osejAZU-m)(FT+@^J}t_h4+>T5ej9T&c=3_U;tDAqL)rG2VES^^y&EcTt6LUVju!&QL?oSyB;GnU0vn +zW4IJt)&xOpW=fZ`D*I!M!X;L*b)e$wg`h}n}~9u(*B*5cZ>)BoFZrucDs%3q#= +zS8PG3!$h6-e>6u4p% +z;Eoc(VJbmWPnHI<>y5Obl04OMOE?7a7bYhMLSU#d| +zme-#+m%$LWet&QB&*)h6*Wz~4o8;JzxFO%5`mv6S-n95l+6^@A5ff?hjLF&%$yk$( +zMqfVtS1z=+69;BAH4}PsN@hh4VUF +zO{W^uTLe)(qvMaiY|xb-?YE6my^@>-%~uw6c$rLi0@wD+E0bcR_NePqUpkXGuVqEV +z-j$`DMIpw5;v(xB2A=#?=|N{d8CeTl)p`wr-pa&&%cH0&4R#GGPPfB1!lqcmL@+$6 +z`lOnWr1to5mZyw6ybVp=5N~KpnQ*!h3!>ihF-GHgZ-;}im@8$ozi&g8Xf!II@QvoU +zsNpk&Qp0vW3)P}Va%T<99u +zb{x`uM#Eo$CP8V2oPOdytk6_P^{1h&nGI%@3Cnl=V#2Vl#U>a0`09Uxlxo_O%>_OLiTLz +zSQT+T^<6ZTdY||IKOGGYJr{s|o+0((ZDrk1< +zKHduxbrw%v&_Lj(k`OA)=qDDUlfGf^OPRDag;UJEz(^3)>zQ$|i;)2x0j +zIsk^`qO&zN{)_FEq1bf3&Eg+qtKvIUxetDX=5Pkaal++lf+`+*{0l#$@olU0jt$IzVh%xIg^7Wg_dDxTH+9u90N^01E$&*yMTz-prtK> +zSI%BQW!Y;^1`I%BAiERl4NpK2$BdOA)w|MJ-)rJS8FD+cudP!?GPo`hL5Cy9-h@hY +zGoz=$uKeSL>T*IvX_7^%hcvWj)V&scjC=MF3lmfhxgfK$BgOCBXvIgNQ1!7hiq{yM +z5ro&euExK54Se<5t)_NbMb?Pn4!)Xjor!h8R@mgJ$FFMUHJJ3XY_WDDuwpGue`CP7 +zLxXKBiv?htD`RdqR}tJV8qXIMD6wF>*A=xkh6Cc7I_2LKuPyai?muuBCEj1;BjCL^ +zF6l%EnQ9+y%xXG!4N)iLG|(8{IVM)jR^R-rn!M(~{4P=2?Tw{;v>+l70-A#3iSz1bP1j*pJ{^MT3Uv*~tI0N-3$Ov2^sk7!=I37OD3_Z`+K? +zw!}3xLS)a8QL?Os&4;3SLt5@cwpH1TGO&@qhK;R9qnZWFr%sYCSu|iXF?2F1n^>h>n39I13n9QeAv>A1=(YuvS3h| +z$;lU~5_RQ*@j5x*xYbxm@RDtmVC1x1W=TwAE1NorXy1VDWbF27b%qbwz~*QHndixr +z4Hx6l`~4e`ILO878+?DO}%{+J-sB+wO0Ndp>e2JjNV1r5q@c%a9dXilDwc +z8tf&Y?Y4ZPjjXkz{hFJ04HypxdF-^>pe|4mS^vh6jfn?wP^BJPC!o}?C2z-TYctM* +z<~zJJ$!$$15A0(6uwi39Fc%C(j;P9(wegt0P^aoCHiU%Yi)xz4w345&jGdIHyyumH7BcF|J5{C`{w}CZWT>Q4sqiR{KxQ=gdn*b*+a- +z)g)c*_7o+wJF0Z(xs2<`8A0XG`OUCxcBAAJRV3speu~f@o5bkLJhWkf9SSxc6$nl7 +zI-Sl+*9sn-j-Ne%C6j7O39`+P{w9YAUGu5WZe@@;yyxe=7Y1k9%uno?n(wnf^HMUU;VxMe_Uz5E>!ifplQ03xW0qzze;bJ3)^d&3PpNUh +z2JQW^MgHSob!z;X4RO`u4U(yPei`mH2^|k6m*6TUiU= +zC1vVM<)8m@iBG5bZ9ov5#5%fc@b!>Lz?~dZ2;--oD9U(pFx{-qwNV`}chy9je}dmx +z!Mz=R!;G)47z9QH6{j+lfC`aS#Siyi!wouY6%jhLVTWVbwS0LAkv^oaO4Sqr_cgeX +zb(2kRI6>9!D2d>4s#JPZL=tKm>-vD^G$jy>UAb;kA0h)8A&SwIEOUS~a5HXG4qIZP +zM=CCodg8ylG!zq>Gl|9uk!s}h={s-^F9>_EDU_EZ1q>0)wBOumb5vw2d>a@6TJ#Fq +zR{1=1a7Jh&X5;o3svj<)=FxwkP3_RJI=MPR9!=r6&`Zy{w6L*)jN!w4I|b^IEA_`B +z;pFYK4UvZ1>AQ*q`;+0Pkut%4=_*I<8MPS;#yZ1`b-S-AZuO#x+7_{B?BC8CdQ+I# +zB`VWTMz=H~EwfuG;yehl=EqmPTjU`y`$ +z`o;xoz}~ac_NOH!c7GI?ggl4R{e|@vRFR+*hA6VJvF*DQ((3B@Pk8bAY;v)KbC?4Fu^ceP{qiCBhVgi< +z!MgtWE>^>3B5dmFCrB;1 +z@i%DCct`=GwW_MNMnxoDuLE9ML4-=eG+Q!}? +zqk(xVyrj9P08^vYL;;g7N{;qWU4N-tOT4cOiZ_>*8zLl^%4ERNSX7Z4dkfA<(ZByz +zW<%OlIGpBtG6Jy~w#=nHuF$mNhLpy<*l1KmhXNZRF_Ufhy*CSQEm2|`Ct{@M%qzGv +z>}m5r%b{u~(DfL0FHu%dhmpdgyNW}e3hT?f4ep(j +zj}T>cuNn4=ZyYs8Ub0d2X1e1;CrbQxuv+%gG-gkAz*4_lLhTzA~inF@}XD^2~~B-Dc>) +z346rVb6pj*uqSa8TWtWkWQsD);DZu?PyvFQ76mYcH^n^1(>|) +zX)8I5Jf6-NqRS8InpCleElUcqNX;b*`(in661P+GWk~5ILcr?M+=-kV>1m@L@$c>I +zXcIM?Z--0`5xmBt!4Sb~Vb>G}$%Gcx&!l8+RjGl)QR2JC>Pu!p!nm|=TUv!32G5uC +z;zM;IwiimuNZ^p})v?3oq3^_2QEZ9UH%4*&d3FF0r3f)t4c(Q_Mhu +zf=={pv)dTaPLZhhYoSo%X(6$3GjB8eQO|~Mg3tHgn_H?`w6fjX1)WWynp$kKH5Xwk +zWU_}s7W@q8yY+gFT

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 +zAYCwX2=MZ5&vfk9q5ICkO1il8mpXJxRHc +z#)7i%b{~2wn0%N4v0FKB_&<+MjuvrxGki)jgt|ZbT8TOx#H{#5NyLe!|L1oLf-LR8 +zulo`|PSBULA#ssqy0z5GS$uF_US2*U;!JMmry4}f*W)x_$Y4}>och{}&T`8PU@RPK +z?hv4RUsCFJ*hTHGNDZ^_JX%7yk?&%HMn0x97q{LWMx(?;e6rqtiFliXjTbmoKGEU_ +z7~`+Slm%Zh&E6|b5c#a=qf^o +zCn#$Wahzlk6LwR*HT6qpkw`Dw5u}!S{~-*eTec1+MuQI{@MC=iFofAsQEc;f6>)D0 +z4`>rEBKQ(91NAk^@*tFum2cD5Rv#(|L +zln?-awN0J*~zK5u^6av;RBwh(8NR!0c!2nz-!_DWE=07R;af*W8|i68<563g`>C6nX23&L8X}WPx5sQ1+4>m{0jY;d +zL1ZD>CRT=@`fUF8j +zLH&IfJZ7`d*(5~I#eKq+7_I_k5kV>A)$nihihYrZ^lEjU_KGB;*h=;(so}heke^rX}$5h6W(^g)cVOX?5K(A&A` +z>G_BNH}6n-)5}J<)&&Cm;An|b%IXB)hd~mV{{qD2?F8_9<~o=%RPOE +zA2zv58%^p?V~USrq(|8#2fUJre>t_40gBH1*FQG@idzT5IQ&GJNl8hAjhMqfll}ri +zI)Zq32=4RZq9nrkNmohx39XQT<4Oukk^s_YnfK~UhQ74 +zP1zpB;Sc5FfFby(-dK1k1K}d^65c_Vy9Q(?XEWF5sDcbG=W6ViF@DXSip)d#TBC*wbMWaQmBfRe$b!fN3JTe5a9Sd6FzTa}gOWwK+=xbeFQ-6zSP{xZIL +zqxq(l>qSRaJRaZ1M_RR;U6R#Z&U4kAEKvfaEa6ic2v{vJn3?_2RQ5jFA7zDcIv@a; +zC(=Vp)SC%Q9K_&`Ng9IOMPI)dP-WOh(p&Ml@E(F4>g$btw&MG4gv(WE#FDt{fL<~+ +zjrE99V_GZ<#~f^Z(H@X6@jGTw6`I)(FA-RN^c|h+zhB=|hR?2l@#K8)dm1|F@D+nf +zwdg;xvD8H3Yu0$HvwxpMo{H8oPB%S*?xRi;+o?U9Pj3FPZs5ENyO*& +zDA3(UP*=6Pe%oEc2<=&6F54p0*5KEIyhdJ}Kyqd@iv?Fi3l)6VBaj?~xDCuD(xFEm +z{AgZuycup->rJaK)r$NN3tq2Jcdycw%J{Z?T3;OTv!nQv59U0L +z7un6$T8{)s($YP#?)*lc(jkn+V%0Jn(Z~#|z^3cv4rJ^(s9%WzDi*JX68nlyZ-Lg1 +zZ+pJ$)H2)ndT{+vDGqXHp){C`9LruQt6z@`4b26-3+5^fi5Xh!C|&4u!+_km#HzZp +zT?S_Aees74#NMCqD`N42N{5{wE$6S#TMJ3+Y?i}-N?``Rf>;!z5ARxSn^5a(%c4|u +zy)k2XFL81;>xAZ|LRTMc=oNZQv%&{jtIT(fJ20YJO5ePG-|z~ku*~XuAi2#})0C4$ +z;!SUIUY`+u-5zb`veOl^9NAL9l$`Wxn?Tp(;uH#=yF*J5Z49^0wZgz~fUOPFV +zf9wE79t)j%H7t+}uF98Z<7lo5+91a?6V6lup*y~1nKmGn9 +ztO*XA%;9S&5rMsr#mn1CmQbB|%1H17%UufT*&#^I*v86H@CN^I#?$YxZauz?s;_ie +z;?jCL?`x=Zrd?d7d%J&Cw6+9i`RO2>Z|8Rbsg9>Po!33gCsP?TG{qXa$Jp{p*}Lsk +z0WBvHIV0F0{pCNq-&H;iE`9}bCQDf0oTaeD)X0EnPu3P}vjKa6TAK%9`N2GVvH5QA +zkENUP(pu>k=UafSewiy@JE$>Vaf4YW9;`AZr5O&m9;^m~DA%D+cX0e8p0j+e3rkmP +ztC<$6tUNlbqJq=VSr9xh$v +z+FZ~iknZPtO$R(4=a0*TGf4LESL>%kjAFAN6DA;{xc7vhn3N^WPp8Xiad8-d<*qRu +zJ9oCCH)!Q4!I7Cl`D91K;N$ +zq3^tdL08%&m0ikH~IceotQ7@q@=o;t_Y!OtwM9znc^Xn*$Axc$xnO0g& +zZqvm|+le-`L~p^r0=|k>1Ci9d`xWgraEEfWoFoZMU?AaYr)5R!WkvZ8P2UDT21yc) +zO7&b_0_)?1>04s$#nWnqw-erqzE80VBj&+I2Lp>I-(|h!GeHfmnePqUt8^hzt*3*u +zUk3xvxCwK1!-mV{yhC0taYG{X!P|a~a`KvvCPovzIRs1#`b}Ck%I} +zWZ?h9gA$vy)ezt2n +z_JiCwT-mYSL1W!O3c{H-ewO53{lPQRle0U<_2#2C7LanCt15*?Ss&j-c@qdD1L_+U +zm{kGX(C_;uSA6Q4>SSpZns^Kz=PjQ=29;3juJJ~9p|?$&4vWVfH4QhZk@j*cL}uQb +z^eH!;P=wJPEe2H +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 +zSG8F%uaHMQT`W*uZcu3G!c}sB +z-9Y*0?n0yW*%|U0MYK8$VBXyg==uP?LL)ls&-O5kC9c9`%I?qyDaC}^FX0#A0 +z!D=99NdjHm$ofIC$p|@P5fk^(JwH$|)iB&@Xr~kt(dA%HO6tQfKROfQKuR^wkX9V$ +z)46oYYC*HPnP2R5Q%joyRl3;w?QSCh)?64XEs8~big|}MACB}yf2qBo)tYw_RM?3T +zfdhOy&OV4GuLd2+w4lj>=5@(Y+C#%XhK_u8-@6)YW;$u>7vr{yxVEV_;v3 +zTvMH{+WuGu!Wgk_e?pb~S{i&Pq}$6HO={0UkHBvwCvcI+Dwa{3u)B>PKi+N(izdbo7J3NC`Hl9xGWN>Hksoa@ol>vH3^E@oJhd_ +zYAuskXE8lk?tB>plVsy7J49{acnIQ-+f@_Uby)y%)$B(k8;?d~nZ8+DJaD1|!|l?F +zp^BXB6#s!QJ8Gm?hchRHAYeQFJPgOK>8}oS2UBt9_dN!d_+KLlq@-lWD~6{B>mW+ +znRlX!8d!X489}cQalhh2eAIo1b&||30Cydu4;|P$YWpc}xd^_V?l43)#O4LUb8YkK +zQDZZdYillX6yozbH{?V{7kX)Si3pcHVwMT=oRi3L0(@VK5@CSuFBBusOs%ZMvt!kr +zyI{O!zD=S@y<9BQNAOt&!w@%go5!9BMzi40Pcbh+3_ftpyoG5sxVCCH?{>PLJ}`64 +zt&Ow4=e=8sB-~HVJZ3|Tj1mNC5_N}#!jtfP{Au!DaGRrkFZnUPI>hl&*$o#BcaC +z7{FgbqOmyN2sE`TYKe-9{vO-)5mVTJJ>GV@$~XRoCDGL9KtM5)gHIi-p{%TYSy{R* +zYDt%HINlR614990fcA!BVPKcbBX`7g(K!Q0SjeiyYref +z!a{>eoh_&{T1%~H%6xZs7pnx!GG%RLRoW9fIoRxRVS#>15POzyS5N?AsB$vTw`6Wq +zNUxr72ItO)kC2J=j&8*uIW6WmMktE8Wzxw`;m7Tgl~8|Y$ZaX28eL3!$VT8*!qt?! +z5ZL?!XZTGH#9Ef@H38(Bc!Z)^X6!AtJP@#yG2F7ism>t(+-o&QKspy#$aAJ)e@uvp +zogqub$^CAq2m;=~1yxqpRSu-mJ1mCk0f<9<+o7Z+<9)D(qFCc)0tgmK4&mjyQs{JN +zRCh%?L-S@Yc~esSM{5H|m?iCpPN|(f7Ni&%x=f3;a|TdszM3d09!dg{ob@19tnHy5 +zLCZX~H-+ZRR31DWnFoVzbDdI%xqiK^=F@#(eLu^FQ0p^)3Dg8gHDfJkaAf{7Ig-#> +zroQ;5{>mOKyNcAw6V+U&cWRIycwt0hOC?v7 +zM(ZIjV@X|BWWBgNP3pL->#y?5X*r&$LzI8fGC4En=%=ub`I04RnnFn@rSYuy?pAsK5;I&gXxFMEK3RmB} +zRjKblLcyAQZ6E(QUfrLMuKjGOVnKkz&yJt@zL!q3hyFg#)g1sSrrv&F4458dK@j +zgpF$)f)N9@bJ#W6lZt(!Ao({iCYAZD@dNf$4pief_gAg6kd%Ni|2%pHCi;C>szvmh!E#j~bK4oy5D~{eU`J-tYP@g-14D8Dd +zPf5kDW)WhmDfmP1K4O07sQ#iyDaiiWYc-kF(1goWD4`C^g}F4@=SrH=qUZB +zYwdstIirPJ&&|UUH;H`k5~^-Y<-!s+9d)|8KVa--zlCyXY#Xo~U)M8H2%Gadsak#D(p4W@{(qQ9m({7H>f^yxCt?b(Si!M-=%2E+?@en#$c-_-i5(bTD!=+nkGpvGxzkbdLH;Dk#7 +zf2!TWi!0#MW~Ri8axwHeC5fG$bSP-C$5~4-nGX9A9IzzS-fJmjQ~7q@E2J-UwjDje+<7lg^J{ji9~%|vNt&&GHa*-&lrc(3 +z)Fhew*8Vp)En1a@Ee%#o)9;|hqDkx`$D_TP8@Ud5)E(->r4lp>_nVI4rvgjZzwnU& +z*6p}3a}sM8u^LtG8CiZ7tXYmlv}H|E_2{Wj&+7*r7b(u#+GSi>~QAr$JJ{ +zr4b{N8>7M(X8*q8;XXpmOPQRJnipk_l#+@)StnOssM6$ljll*5jD-fahKNPmRGG(;n0mr34A +zId)7BA77s6^E4=328BE=q+3;mU^JALaU6znD2JVQX^(WtoL4ExGu@0-#*hOxq>K2F +zGjI(Ts!GjcXJX%7s`33rG0X8#PCP}Ynnm!}&WJc4oD=ORbqR1(zq!+x%-Arqg7;11 +zM+D?^rV}7;IHK{Dl9m!#YcumiX;u4ElEDL4dH0{tuPvzxJ`E4P475Zd+d;bPWfgZC +zB6IiV-d+#&Zs%qg5iYC&UufxrKhS3()luYWB>L82GJj-60?2JpMQkiNel8r?rp9U7 +zm^q7v+{<3Q6=earJl4^afMWCUl-K;)*)*c@Gl-}9HRhO?HNs(k&7YhWMHZXeF3crAjXfxym->G2^1ZOF{_RDX{c$GLa0`#w0Wc?Bp31;@fc*nUFZ)I +z9Uhe2r%YIv|IG9eSv%ZP^adIr*|#n(Mjyud(Z$zNwS5>(im8$R?#;0$_ +zNWm!9e_0Mfyq_Q9?}3Utye2Xy20u9Xr}saFzmGGqHa5J$zFfGv|8!sBknOH?9NbgC +z!r0$tI{NFO)P9ubW%w}5m=!Y)jT{99_wMGM3%yOe*cZ2&udh+NF|4lRi9kt(i>X +zeY!U!ET%465pN^td%r4DePTN*Ge$H4=S5oG*nu$P$Ys@7SZIg(x~b6DTW-Vx9u6-} +z^pk&uSf3stZW-Ku*$=bAR(ecl06VEfOAH7?9bU2#p>LBF8n5Nlq0XPgV3dzB#?;1B +z#q877blC8G3rT#NVq9$yl+}3Ee!TkzV!aHjfLi{x0V6+etB-{FIt6884&ztp=73u7 +zJ|2@{No-@oq=AI0UU?{V;)etlu;pJi#Z>i*c-uKfOS3U_Wb^iSfAAJ3tAjSh%@BP| +z^h=X&8|qa!T>6Yw)944xv{}d3wQH)s9c&HqQT?V;rWVFMlTa9Qpcac~M%AY7fMvnI +zGL*9lnf_!PpNiatC8ho +zZbtZqK!tZOkWCu>`sRdJIm=mw4T_LM? +zX{>w-fc4&kebd~ZUmMA=QA+OlT^b2pH|nS1mTHqvwF$X4hk0nDY`OM=8^P&94Xyl=T_w1&uOU!B5>)>e8_rvFq$l9YWV!`Eil +zed2u?UJS-@P`0{;nlP$ckaq(*EVMe0c;M>J6(@Z7D!8P#GQTVhOx20OQ!$i+GnhH9-xLEAH)4w_wBgGuxD?$RKceM9}!B} +z+n4Q6kp7?&jR}emaq5sO)e>~T-ukj0Hf20yz;vce6O?hI-2bex&-kK`4IaH0YrSBN +zr-6J1$@ZbK9mK*~aVFX%OPHt_8`2NO&QKWWdQspdUer4fV+f_aFVt+6E}|QNFF~tv +z6N~6k;X;fjWFbd_#G)Y6f%#7%%#i9Kbp +z-%iBKIsT2Awl)aUOf%7qE`qOZBId$nVy<<`4i&-W&kV*_mt$TWTMRTWgVv@~Cj6O6sSpX2L|RO<2;2p5a>yX$LGokK+GAml(YY +z(x7<$fSC|u^G=ZdFfLkwV-ru)4V-geM +z{u2ANA~{NYK}?BS{IfGHlHbV54WL}${7^=ChhBZ=<%IB597lKeR+KbsI2!sPLd)0C +z!CQtQGJY|pfhwxXjLVIC9Q0~g7j+Fkezgq0##rrOX8krbh}l}P@6YoAL7^`sHRD!E +z6f`h^9C{<92UKiKwoe+cR!fkRffZi;g@}O}$LY~K+mP=FkIrEQ5v(@qB^>Fhp-+fX +z$?rHn(=RnH?7>t-V5<8DGh&~RFA{YUK{xQTDVB2qc|nP;HvuMwDU{eg-Fm<+*N|*5 +zgm9=yI!?HRMg*Te1A{kx3N8tT&d{o&P=Bj)2#pRSb{J+zBP*(F(d`3JOFAKgq-M#+ +zov>!r;T=R0kc9E+-RN8erAm}6f^uWOYR!yo;1PfnXReLtcA$hLWrY;@=qp||)C1M! +zlOxH|_TepuRlqGkU7*6mGd{aj=i}Sdc*14>O*&QhO0B8Tfj6pX!(*#dqBB_KRZZ~c +zJMV*fw{8m4^_;r6uM|dyTqdC4aKZAduZq2s%ry*sKNLIp7pezvl$-h$qgcSmESp^W +zy0w(==u2K}4AbKG?0-Kpl!p@dE-tO7)DNYIREdiZbWULtBQd(&Y`c}<-k$d`Oh`zb +z{VF&yQ)5H1ecv?fQ`pU4^yoz`ot4;6C*54o_L467s<2;Z~W>iV{)2pjSF +zB~fmMhC{G*PKWl38=q7VJJOt;@W+_v0$i`YKWfc?f|FGq=SX#M}Rn-h)E2>WU0{PhokM +z$S3J4qgFOM;6ZjL()Z!_^wur?t`vkv{i% +zZh|-n#D_aOz5?z9o;r`zqqqI)d?8GwT3rq0T^3w4Cxz4v%oTnQPH2u9BWXHHu(T)h%K +z$T-%S7~JSAzi+3^pDK|=ay=9+L9u0Hj%Q+@Pe;sbZJyhsH(5OdD+J-0giE$*!bp+z +zmWh#J(yUj0G4n@`HAFhMdro-<>0pIqc&10ReipusBft_rBv+~I18r63n5jvp0X?nA +ztvV0olKu^1Q_bo2{fblIgS9G6Y9exXukU1a&oSUhl6HN#Lb3?kJhfvp+@NxZB*L6V +zN|E(PtFyGs3S$;B&bP?WDOvd`^D>wiO6LO#PfL*wkCtB1inmMmv_82n#9UTU!md_M +zF498N370m|TPn%b`OgI07ka4*NLBMpe}zS(&ArD<_}kSx&cfOFhkm +zmI}Bd1m*>Awemjga0gQ=;*gIuoO@y3S6oaiPs1h +zQ!b)NOiwP2-rAst-x_P5=>rP2nCf5fW%07!QW4x5S853f=gR0&RtQD +zc^<`(0n7x-1;NDbw-*Y0YFkP-DBW%2ek|h9glB2vvT476lGYIhLEEr{<|AS22Bgp` +zU2JKHEU@(t>#g>Y^TBrco@G!Ho-+DqKb34O +z#;1`Hra6i{GtK$gKL~bB88V|-jR;mx +z+o$aAo;s_yg=Q51#T#5gX9S}4+{}So*OjJH>3#q7g-|s*Ue)NvU@PSPc}$8v-8@Y58z4Pz-@P_Njwu&Q2iK)BSv +zXMYL6g_(UQ3sOvE#FS-KAn3*9jtC`xH5_36z^GxwSi+}!9ySu4+ +z!bx`}YD2T9X>(>(l`TU!`+h0(y>_kBKoIa>_iO2*A9D;tcJa6;x7sBC`Pk8%v*VqWE#TP=E@Mw>28pq2-bhC()*Tq +zpITcDoZnYvFyV2t$9U3EtDb_Gk{)f7bk8g0FMm8?oO}{nR?@imbw0hc3gR%i=W6_b +zLbse8P>2aLk~`4QJN|`O>V+^Z#kR0zPQrO;d9Kq<{tJ`5%8YuZ0lJ))LRECo0{ynY +ztY)tcv!z9sLwO@}T_V%>bJ@+gsEK3Up}Msf3Gf9k_|zM|i`vztF)j(u +zrx4DXV+@v>N_^aJn5)L3q>prRH}*0$`WBn?(*2-jCjP*lY-OdbE; +z-u^(ZhJl-*4dW6LP`!K*pqorstJk?DqpHrfy*c&El}}JKL#i~U81SMDxQ{X3bRL{d +z|FaxUrwQk5Io$yjBJNZVwuCTJvW@5NXaF$5^ +zvUBKyIbL{kQ{>^f=LqNLCv5U^4pv6s`F>eM?N5!rC8bK`M8OBMyCPd`(S?r3bNN9if)-r5NF)g#<(xfsnoWYxCO| +zFHqnmgawq75FN>1r(R37O#d<}PDqcQ9q)+`_x}MpuW69bkiXG=!#!h}FF!o5Rupej +z4OmEi)^*|bk(YDM`>2^mA0=mNi03xWb47288N@S>Fsse*zXa+Q^vwjxqeEorB}N0Q +zzC|HD94u`QGY^>Frphdo#!x1lY*=~Uo&yzci>mGs;3%|R*dG!?niwKwI!Q%B%Xo~)oc^xZ?yEiUZd>@Gon+^HI^qj>jomKQ1MAkn?*(Lfo^7%9egvP++gdBNZim}H4I1BN*7-| +zwm)+9WM3#P9cRdXBf(NQ(D*`15i5+%F~x?ll0DVWhKT`GyXjJC{fp_$L_5CJ&nOD~ +zQ9~k;T{&w?Cz+<0xU_2i({m%{kV1H=7Np}bU_DG&=5Yv1!lD}Ebt&?h_v$)oR+{Tq +zQ|i#^0Mp_~ptl`?tNJJEKMt1yAGJSDj%gXsQ`O0lHJt7F7$<9Mc;TuRQ@{lK`_*q_ +zkv~$uZ7${n#>P;GS>`K^qx1$TY@wy^S5ZEm$^yAA#k~sCm +zBbYKkEXnQw{@2%D#m+^(nJB?A~sv@U!d16Z=&B=t*vPy6x~zCX?F# +zVsro+e#QM|9~+o<3G9wT=QXET2Oz+8<$X68VRKEUX{y}7a&5F+Zj{=$wf&%8yeM?` +zOKhr8rV1!VT;J-p*Ht|4S}l7`kyPG$D4bOEHt|my)UJ)vGV}JBBC?=}kAsaxzezK) +zC@TF=;8lWfVNo-?uP;<;^@t?C5ZMBvzZdDM^<|G&njaU| +zvpaWBwYVD{Rn_>fQay4&l?Uvu?W*9ked0wJpz-acy{A5um7z2 +zzcT^=xcY1mzJ6`)@y`Gv2_12yVt_OIKyD*P86b#ctDyrxn*nmANB%w6bb1(8i(g-| +z_`E*>QL{CyaM84XN%DeUNLX|$e<=ND7(2O+1)&sFUAR$UYjy#KZ&+zYh;X +z(@t(@uizQxKY;RQ5e1sh;ii3ijrI&n9+Hl2eAYF9RxV!d)b{^+#S-fxy7UjcFw9}N +zSTJ`Frq`b*IoIaR4OCn^jPn;R6ccXxFUYh|0=}(E+(9E5+_QJcyOPh-qY?yG9yxAe +zLH*Cl0p%UK2E=ZyvxXn{S%LQjb`%BxY0V35p?`J>LmL34h^uWaGtkKqfLR`W5~}|S +zHu-B>sz9%;o%xZ##}S`^k4ah@HU2`J=U+R(lwac1tBoXjj56KN@e}~q`aL7$2mBoK +z|19bq4DHv_PjS04uX}T=49WmX^aVBsK>A|tzh3`)%Y{2gU$zMwzP6Sdv5ez%*bqNI +zSWvay&xx5;|GU?)iIFk&8${!w8!?mY5)7!Nqr$vVh{Vj7#a2@ +z6ZKpFFiYZ|`2SAxxpNYwtG^KqfJ!v{KpJf(%05st5 +z0V@zV5SiRQC_U@={Bs3A=n9)SIeiw5!tu8(Z!G+7H_7#%ReTsj6gS%9RCJ~S$m|OQ +ztCcoF0H6C8{#4VoNIV0wAEr|HUrf@!K6*m|>}5bBV`>txi@WG*RR(aWY}R{Kq!m&r +z01g-xBmGzB%|7Xi#?CCj+%Z(2sfF`)t!#|rE!T55k!tHc`GA=1e#p|QlCeT|? +zD$rZivJbt^-yr=^fhcd(b}^%=MB{O*n|0diT`Yg +zf3A=pD|236UX|X@fIo^dl$sf{BsDv$6O#V{*56qAi1c#i@nAeBPtJK+3*FxX@7mZ_H-$rP5*o{;8LEstOLJT0%K(4xY&Fz=>^S#>+Sy#7=HgdcrGFX&pR9HR@OCzR#sm?Vn0~D` +zFV1JQaS7L%9XLNZ`5A^v+5unm4}Ewh5#fl#8Qj=`uite7g~5XVIvo)hFZpJlDVx0v +z8kh)m_x}m$m$m>tdq_#n{@)$*LvSPe5VwmO$ME+t`OhvLC;JH(*5^BA{6Apo_k79y +zzYVlUr|r7Yk6NnLIC-!G@aL{~cP%@C;Cz=qbM_i%$Az&JGO5`{1M!rEracjuVd3HS +z+_5b?&k3SzSWKCM&vHc~7e@oheHV>a3@!!aJUxL>(dNyy5uWn4TZ?-0!ZQP+ +zr)9yN=eXn5s%x({ly|HAa}vPJXbb_R?)I353X9y`ro?oH1FzIp+Pvi=qBdKurFjW~ +z)W$2|1lDE4MNQW;pz39aSYejeY4}3xGeY*={Zb+ZZY-jsDu8-6Ye%wsZ}jl+T&%sD +zT8CiSy15yoVtWp4Cp4Qfw~KlC9M5}K_a03GSqK(=Y{2q8yy14P(|M?mdAvd>qI+&=`2#5Vxkj{!T(<+rjV?KAt6ax4pn&-lcu_3HWy8 +zLtsvY?o0q?kTTA!7sm!vGcFHzO=-9tU!K1`J@+1nJ2m|O +zo=yypXJ*a^srJQxj`F__H`V`m_x<6k +E0S+i-9RL6T + +literal 0 +HcmV?d00001 + +-- +2.25.1 + diff --git a/0020-add-digitalSignature-for-certificates.patch b/0020-add-digitalSignature-for-certificates.patch new file mode 100644 index 0000000..5b4da46 --- /dev/null +++ b/0020-add-digitalSignature-for-certificates.patch @@ -0,0 +1,115 @@ +From 8e1e06e2e4794c85c19d4ee9a528b6b2d35d9624 Mon Sep 17 00:00:00 2001 +From: zhangxiaoyu +Date: Tue, 18 Jan 2022 16:56:42 +0800 +Subject: [PATCH 20/24] add digitalSignature for certificates + +Signed-off-by: zhangxiaoyu +--- + pkg/utils/certs/approvecsr.go | 10 ++++++---- + pkg/utils/certs/localcerts.go | 2 +- + pkg/utils/template/template.go | 2 +- + pkg/utils/template/template_test.go | 6 +++--- + 4 files changed, 11 insertions(+), 9 deletions(-) + +diff --git a/pkg/utils/certs/approvecsr.go b/pkg/utils/certs/approvecsr.go +index 92af905..dfebbee 100644 +--- a/pkg/utils/certs/approvecsr.go ++++ b/pkg/utils/certs/approvecsr.go +@@ -69,7 +69,7 @@ func (cv1 *CertificateV1) check(csr certificatesv1.CertificateSigningRequest, wo + + // 3. check csr is requested for serving certificates + // usageRequired: "server auth" +- // usagesOptional: "digital signature", "key encipherment" ++ // usagesOptional: "digital signature", "key encipherment", "data encipherment" + required := false + for _, u := range csr.Spec.Usages { + if u == certificatesv1.UsageServerAuth { +@@ -77,7 +77,8 @@ func (cv1 *CertificateV1) check(csr certificatesv1.CertificateSigningRequest, wo + continue + } + +- if u != certificatesv1.UsageDigitalSignature && u != certificatesv1.UsageKeyEncipherment { ++ if u != certificatesv1.UsageDigitalSignature && u != certificatesv1.UsageKeyEncipherment && ++ u != certificatesv1.UsageDataEncipherment { + logrus.Warnf("csr %s is not requested for serving certificates", csr.Name) + return false + } +@@ -166,7 +167,7 @@ func (cv1beta1 *CertificateV1beta1) check(csr certificatesv1beta1.CertificateSig + + // 3. check csr is requested for serving certificates + // usageRequired: "server auth" +- // usagesOptional: "digital signature", "key encipherment" ++ // usagesOptional: "digital signature", "key encipherment", "data encipherment" + required := false + for _, u := range csr.Spec.Usages { + if u == certificatesv1beta1.UsageServerAuth { +@@ -174,7 +175,8 @@ func (cv1beta1 *CertificateV1beta1) check(csr certificatesv1beta1.CertificateSig + continue + } + +- if u != certificatesv1beta1.UsageDigitalSignature && u != certificatesv1beta1.UsageKeyEncipherment { ++ if u != certificatesv1beta1.UsageDigitalSignature && u != certificatesv1beta1.UsageKeyEncipherment && ++ u != certificatesv1beta1.UsageDataEncipherment { + logrus.Warnf("csr %s is not requested for serving certificates", csr.Name) + return false + } +diff --git a/pkg/utils/certs/localcerts.go b/pkg/utils/certs/localcerts.go +index c5fe2e5..d613ea9 100644 +--- a/pkg/utils/certs/localcerts.go ++++ b/pkg/utils/certs/localcerts.go +@@ -148,7 +148,7 @@ func (l *LocalCertGenerator) CreateCertAndKey(caCertPath, caKeyPath string, conf + DNSNames: config.AltNames.DNSNames, + IPAddresses: ips, + SerialNumber: serial, +- KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ++ KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment | x509.KeyUsageDataEncipherment, + ExtKeyUsage: config.Usages, + NotBefore: caCert.NotBefore, + NotAfter: time.Now().Add(time.Hour * 24 * 36500).UTC(), +diff --git a/pkg/utils/template/template.go b/pkg/utils/template/template.go +index 3b3138a..b16f55a 100644 +--- a/pkg/utils/template/template.go ++++ b/pkg/utils/template/template.go +@@ -77,7 +77,7 @@ IP.{{ Add $i 1 }} = {{ $v }} + [ v3_ext ] + authorityKeyIdentifier = keyid,issuer:always + basicConstraints = CA:FALSE +-keyUsage = keyEncipherment,dataEncipherment ++keyUsage = digitalSignature,keyEncipherment,dataEncipherment + extendedKeyUsage = {{ .ExtendedKeyUsage }} + {{- if .HaveAltNames }} + subjectAltName = @alt_names +diff --git a/pkg/utils/template/template_test.go b/pkg/utils/template/template_test.go +index ae46d48..30d6f2d 100644 +--- a/pkg/utils/template/template_test.go ++++ b/pkg/utils/template/template_test.go +@@ -46,7 +46,7 @@ IP.3 = 127.0.0.1 + [ v3_ext ] + authorityKeyIdentifier = keyid,issuer:always + basicConstraints = CA:FALSE +-keyUsage = keyEncipherment,dataEncipherment ++keyUsage = digitalSignature,keyEncipherment,dataEncipherment + extendedKeyUsage = serverAuth,clientAuth + subjectAltName = @alt_names + ` +@@ -71,7 +71,7 @@ CN = kube-apiserver-kubelet-client + [ v3_ext ] + authorityKeyIdentifier=keyid,issuer:always + basicConstraints=CA:FALSE +-keyUsage=keyEncipherment,dataEncipherment ++keyUsage=digitalSignature,keyEncipherment,dataEncipherment + extendedKeyUsage=clientAuth + ` + kubelet_conf := &CsrConfig{ +@@ -92,7 +92,7 @@ CN = front-proxy-client + [ v3_ext ] + authorityKeyIdentifier=keyid,issuer:always + basicConstraints=CA:FALSE +-keyUsage=keyEncipherment,dataEncipherment ++keyUsage=digitalSignature,keyEncipherment,dataEncipherment + extendedKeyUsage=clientAuth + ` + front_proxy_client_conf := &CsrConfig{ +-- +2.25.1 + diff --git a/0021-gitignore-style-global-ignore-IDE-and-gomod-vendor.patch b/0021-gitignore-style-global-ignore-IDE-and-gomod-vendor.patch new file mode 100644 index 0000000..1297199 --- /dev/null +++ b/0021-gitignore-style-global-ignore-IDE-and-gomod-vendor.patch @@ -0,0 +1,28 @@ +From cba65a460d748864feff49bd808c0f80c125ff4c Mon Sep 17 00:00:00 2001 +From: DCCooper <1866858@gmail.com> +Date: Sat, 22 Jan 2022 16:50:30 +0800 +Subject: [PATCH 21/24] gitignore: style(global): ignore IDE and gomod vendor + +Signed-off-by: DCCooper <1866858@gmail.com> +--- + .gitignore | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/.gitignore b/.gitignore +index b11cba5..2819bbf 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -11,3 +11,10 @@ + # Output of the go coverage tool, specifically when used with LiteIDE + *.out + bin ++ ++# IDE ++.vscode/ ++.idea/ ++ ++# go mod vendor ++vendor +-- +2.25.1 + diff --git a/0022-add-golangci-check.patch b/0022-add-golangci-check.patch new file mode 100644 index 0000000..0a32025 --- /dev/null +++ b/0022-add-golangci-check.patch @@ -0,0 +1,626 @@ +From f6758397221920d240d61671cc2759eca65f6899 Mon Sep 17 00:00:00 2001 +From: zhangxiaoyu +Date: Tue, 1 Mar 2022 19:24:40 +0800 +Subject: [PATCH 22/24] add golangci check + +Signed-off-by: zhangxiaoyu +--- + .golangci.yaml | 18 +++++++++++++ + Makefile | 6 +++++ + cmd/checker.go | 2 +- + cmd/checker_test.go | 10 ++++++-- + cmd/cleanup.go | 6 ++++- + cmd/delete.go | 6 ++++- + cmd/deploy.go | 6 ++++- + cmd/eggo.go | 4 ++- + cmd/join.go | 6 ++++- + cmd/opts.go | 2 +- + pkg/clusterdeployment/binary/binary.go | 18 +++++++------ + .../binary/bootstrap/bootstrap_test.go | 18 ++++++++++--- + .../binary/cleanupcluster/cleanupetcd.go | 4 ++- + .../binary/cleanupcluster/cleanupnode.go | 9 +++++-- + .../binary/commontools/token.go | 1 + + .../binary/controlplane/controlplane.go | 4 ++- + .../binary/controlplane/controlplane_test.go | 23 +++++++++++------ + .../infrastructure/infrastructure_test.go | 12 ++++++--- + pkg/clusterdeployment/clusterdeploy.go | 14 ++++++++--- + pkg/utils/endpoint/endpoint.go | 1 + + pkg/utils/nodemanager/nodemanager.go | 12 ++++----- + pkg/utils/nodemanager/nodemanager_test.go | 25 ++++++++++++++----- + 22 files changed, 158 insertions(+), 49 deletions(-) + create mode 100644 .golangci.yaml + +diff --git a/.golangci.yaml b/.golangci.yaml +new file mode 100644 +index 0000000..ea8515f +--- /dev/null ++++ b/.golangci.yaml +@@ -0,0 +1,18 @@ ++linters-settings: ++ golint: ++ min-confidence: 0 ++ misspell: ++ locale: US ++linters: ++ disable-all: true ++ enable: ++ - typecheck ++ - goimports ++ - misspell ++ - govet ++ - ineffassign ++ - gosimple ++ - deadcode ++ - structcheck ++ - unused ++ - errcheck +\ No newline at end of file +diff --git a/Makefile b/Makefile +index d2c4d9e..e346f97 100644 +--- a/Makefile ++++ b/Makefile +@@ -49,6 +49,12 @@ test: + @$(GO) test -race -cover -count=1 -timeout=300s ./... + @echo "Units test done!" + ++check: ++ @which ${GOPATH}/bin/golangci-lint > /dev/null || (echo "Installing golangci-lint" && go get -d github.com/golangci/golangci-lint/cmd/golangci-lint) ++ @echo "Code check starting..." ++ @${GOPATH}/bin/golangci-lint run --timeout 5m --config=./.golangci.yaml ++ @echo "Code check done!" ++ + .PHONY: safe + safe: + @echo "build safe eggo starting..." +diff --git a/cmd/checker.go b/cmd/checker.go +index 07068e9..2f99a0c 100644 +--- a/cmd/checker.go ++++ b/cmd/checker.go +@@ -335,7 +335,7 @@ func (ccr *OpenPortResponsibility) Execute() error { + return fmt.Errorf("invalid port: %v for %s", port.Port, name) + } + if _, ok := supportProtocal[port.Protocol]; !ok { +- return fmt.Errorf("invalid protocal: %s for %s", port.Protocol, name) ++ return fmt.Errorf("invalid protocol: %s for %s", port.Protocol, name) + } + } + } +diff --git a/cmd/checker_test.go b/cmd/checker_test.go +index 1fee45a..57babf9 100644 +--- a/cmd/checker_test.go ++++ b/cmd/checker_test.go +@@ -27,7 +27,11 @@ func TestRunChecker(t *testing.T) { + if err != nil { + t.Fatalf("create tempdir for cmd checker failed: %v", err) + } +- defer os.RemoveAll(tempdir) ++ defer func() { ++ if terr := os.RemoveAll(tempdir); terr != nil { ++ t.Fatalf("remove temp dir failed: %v", terr) ++ } ++ }() + + // init opts + if NewEggoCmd() == nil { +@@ -49,7 +53,9 @@ func TestRunChecker(t *testing.T) { + } + + for _, fn := range conf.InstallConfig.PackageSrc.SrcPath { +- os.MkdirAll(fn, 0755) ++ if err := os.MkdirAll(fn, 0755); err != nil { ++ t.Fatalf("mkdir failed: %v", err) ++ } + defer os.RemoveAll(fn) + } + +diff --git a/cmd/cleanup.go b/cmd/cleanup.go +index 7a78b15..e55c085 100644 +--- a/cmd/cleanup.go ++++ b/cmd/cleanup.go +@@ -70,7 +70,11 @@ func cleanupCluster(cmd *cobra.Command, args []string) error { + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) + } +- defer holder.Remove() ++ defer func() { ++ if terr := holder.Remove(); terr != nil { ++ fmt.Printf("remove process place holder failed: %v", terr) ++ } ++ }() + + if err = cleanup(toClusterdeploymentConfig(conf, hooksConf)); err != nil { + return err +diff --git a/cmd/delete.go b/cmd/delete.go +index 5990a42..05a1dee 100644 +--- a/cmd/delete.go ++++ b/cmd/delete.go +@@ -106,7 +106,11 @@ func deleteCluster(cmd *cobra.Command, args []string) error { + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) + } +- defer holder.Remove() ++ defer func() { ++ if terr := holder.Remove(); terr != nil { ++ fmt.Printf("remove process place holder failed: %v", terr) ++ } ++ }() + + deletedConfig, diffHostconfigs, err := getDeletedAndDiffConfigs(conf, args) + if err != nil { +diff --git a/cmd/deploy.go b/cmd/deploy.go +index 2d7c441..4d7fab4 100644 +--- a/cmd/deploy.go ++++ b/cmd/deploy.go +@@ -136,7 +136,11 @@ func deployCluster(cmd *cobra.Command, args []string) error { + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) + } +- defer holder.Remove() ++ defer func() { ++ if terr := holder.Remove(); terr != nil { ++ fmt.Printf("remove process place holder failed: %v", terr) ++ } ++ }() + + if err = deploy(conf); err != nil { + return err +diff --git a/cmd/eggo.go b/cmd/eggo.go +index 272fb17..36a3f9e 100644 +--- a/cmd/eggo.go ++++ b/cmd/eggo.go +@@ -86,7 +86,9 @@ func NewEggoCmd() *cobra.Command { + showVersion() + return nil + } +- cmd.Help() ++ if err := cmd.Help(); err != nil { ++ return err ++ } + return nil + }, + } +diff --git a/cmd/join.go b/cmd/join.go +index d035bfe..d1d49e4 100644 +--- a/cmd/join.go ++++ b/cmd/join.go +@@ -228,7 +228,11 @@ func joinCluster(cmd *cobra.Command, args []string) error { + if err != nil { + return fmt.Errorf("create process holder failed: %v, mayebe other eggo is running with cluster: %s", err, conf.ClusterID) + } +- defer holder.Remove() ++ defer func() { ++ if terr := holder.Remove(); terr != nil { ++ logrus.Warnf("remove process place holder failed: %v", terr) ++ } ++ }() + + mergedConf, diffConfigs, err := getMergedAndDiffConfigs(conf, joinConf) + if mergedConf == nil || diffConfigs == nil || err != nil { +diff --git a/cmd/opts.go b/cmd/opts.go +index 7bb8297..d0235fe 100644 +--- a/cmd/opts.go ++++ b/cmd/opts.go +@@ -89,7 +89,7 @@ func setupJoinCmdOpts(joinCmd *cobra.Command) { + flags.StringVarP(&opts.joinHost.Name, "name", "n", "", "host's name") + flags.IntVarP(&opts.joinHost.Port, "port", "p", 0, "host's ssh port") + flags.StringVarP(&opts.joinClusterID, "id", "", "", "cluster id") +- flags.StringVarP(&opts.joinYaml, "file", "f", "", "yaml file contain nodes infomation") ++ flags.StringVarP(&opts.joinYaml, "file", "f", "", "yaml file contain nodes information") + flags.StringVarP(&opts.prehook, "prehook", "", "", "prehook when join cluster") + flags.StringVarP(&opts.posthook, "posthook", "", "", "posthook when join cluster") + } +diff --git a/pkg/clusterdeployment/binary/binary.go b/pkg/clusterdeployment/binary/binary.go +index 478e081..8bb3c1d 100644 +--- a/pkg/clusterdeployment/binary/binary.go ++++ b/pkg/clusterdeployment/binary/binary.go +@@ -56,7 +56,9 @@ func New(conf *api.ClusterConfig) (api.ClusterDeploymentAPI, error) { + connections: make(map[string]runner.Runner), + } + // register and connect all nodes +- bcd.registerNodes() ++ if err := bcd.registerNodes(); err != nil { ++ return nil, err ++ } + + return bcd, nil + } +@@ -177,7 +179,7 @@ func (bcp *BinaryClusterDeployment) MachineInfraSetup(hcf *api.HostConfig) error + return nil + } + +- logrus.Infof("do setup %s infrastrucure...", hcf.Address) ++ logrus.Infof("do setup %s infrastructure...", hcf.Address) + + if err := bcp.registerNode(hcf); err != nil { + logrus.Errorf("register node failed: %v", err) +@@ -196,7 +198,7 @@ func (bcp *BinaryClusterDeployment) MachineInfraSetup(hcf *api.HostConfig) error + } + } + +- logrus.Infof("setup %s infrastrucure success", hcf.Address) ++ logrus.Infof("setup %s infrastructure success", hcf.Address) + return nil + } + +@@ -206,14 +208,14 @@ func (bcp *BinaryClusterDeployment) MachineInfraDestroy(hcf *api.HostConfig) err + return nil + } + +- logrus.Infof("do destroy %s infrastrucure...", hcf.Address) ++ logrus.Infof("do destroy %s infrastructure...", hcf.Address) + + err := infrastructure.NodeInfrastructureDestroy(bcp.config, hcf) + if err != nil { +- logrus.Errorf("role %d infrastructure destory failed: %v", hcf.Type, err) ++ logrus.Errorf("role %d infrastructure destroy failed: %v", hcf.Type, err) + } + +- logrus.Infof("destroy %s infrastrucure success", hcf.Address) ++ logrus.Infof("destroy %s infrastructure success", hcf.Address) + return nil + } + +@@ -404,7 +406,9 @@ func (bcp *BinaryClusterDeployment) LoadBalancerDestroy(lb *api.HostConfig) erro + return nil + } + +- cleanupcluster.CleanupLoadBalance(bcp.config, lb) ++ if terr := cleanupcluster.CleanupLoadBalance(bcp.config, lb); terr != nil { ++ logrus.Warnf("clean up loadbalance failed: %v", terr) ++ } + return nil + } + +diff --git a/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go b/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go +index 9b69035..7b3c1ff 100644 +--- a/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go ++++ b/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go +@@ -99,14 +99,19 @@ func TestJoinMaster(t *testing.T) { + + r := &MockRunner{} + for _, node := range conf.Nodes { +- nodemanager.RegisterNode(node, r) ++ if err := nodemanager.RegisterNode(node, r); err != nil { ++ t.Fatalf("register node failed: %v", err) ++ } + } + defer func() { + nodemanager.UnRegisterAllNodes() + }() + + api.EggoHomePath = "/tmp/eggo" +- lr.RunCommand(fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki", api.EggoHomePath, conf.Name)) ++ if _, err := lr.RunCommand( ++ fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki", api.EggoHomePath, conf.Name)); err != nil { ++ t.Fatalf("run command failed: %v", err) ++ } + if err := JoinMaster(conf, &masterNode); err != nil { + t.Fatalf("do bootstrap init failed: %v", err) + } +@@ -161,14 +166,19 @@ func TestJoinWorker(t *testing.T) { + + r := &MockRunner{} + for _, node := range conf.Nodes { +- nodemanager.RegisterNode(node, r) ++ if err := nodemanager.RegisterNode(node, r); err != nil { ++ t.Fatalf("register node failed: %v", err) ++ } + } + defer func() { + nodemanager.UnRegisterAllNodes() + }() + + api.EggoHomePath = "/tmp/eggo" +- lr.RunCommand(fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki", api.EggoHomePath, conf.Name)) ++ if _, err := lr.RunCommand( ++ fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki", api.EggoHomePath, conf.Name)); err != nil { ++ t.Fatalf("run command failed: %v", err) ++ } + if err := JoinWorker(conf, &controlplane, &workerNode); err != nil { + t.Fatalf("do bootstrap init failed: %v", err) + } +diff --git a/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go b/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go +index 164bbe3..59005a7 100644 +--- a/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go ++++ b/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go +@@ -63,7 +63,9 @@ func (t *cleanupEtcdMemberTask) Run(r runner.Runner, hostConfig *api.HostConfig) + return fmt.Errorf("empty host config") + } + +- stopServices(r, EtcdService) ++ if err := stopServices(r, EtcdService); err != nil { ++ logrus.Warnf("stop etcd service failed: %v", err) ++ } + + removePathes(r, getEtcdPathes(t.ccfg)) + +diff --git a/pkg/clusterdeployment/binary/cleanupcluster/cleanupnode.go b/pkg/clusterdeployment/binary/cleanupcluster/cleanupnode.go +index 89100d1..296d411 100644 +--- a/pkg/clusterdeployment/binary/cleanupcluster/cleanupnode.go ++++ b/pkg/clusterdeployment/binary/cleanupcluster/cleanupnode.go +@@ -167,12 +167,17 @@ func (t *cleanupNodeTask) Run(r runner.Runner, hostConfig *api.HostConfig) error + if err != nil { + logrus.Errorf("get worker services failed") + } +- stopServices(r, services) ++ ++ if err := stopServices(r, services); err != nil { ++ logrus.Warnf("stop service failed: %v", err) ++ } + removePathes(r, getWorkerPathes(r, t.ccfg)) + } + + if utils.IsType(t.delType, api.Master) { +- stopServices(r, MasterService) ++ if err := stopServices(r, MasterService); err != nil { ++ logrus.Warnf("stop master service failed: %v", err) ++ } + removePathes(r, getMasterPathes(t.ccfg)) + } + +diff --git a/pkg/clusterdeployment/binary/commontools/token.go b/pkg/clusterdeployment/binary/commontools/token.go +index 005efcc..6f85fac 100644 +--- a/pkg/clusterdeployment/binary/commontools/token.go ++++ b/pkg/clusterdeployment/binary/commontools/token.go +@@ -25,6 +25,7 @@ import ( + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/runner" ++ + kkutil "github.com/kubesphere/kubekey/pkg/util" + "github.com/lithammer/dedent" + "github.com/sirupsen/logrus" +diff --git a/pkg/clusterdeployment/binary/controlplane/controlplane.go b/pkg/clusterdeployment/binary/controlplane/controlplane.go +index 9c591c4..1f93e5e 100644 +--- a/pkg/clusterdeployment/binary/controlplane/controlplane.go ++++ b/pkg/clusterdeployment/binary/controlplane/controlplane.go +@@ -446,7 +446,9 @@ func generateCertsAndKubeConfigs(r runner.Runner, ccfg *api.ClusterConfig, hcf * + defer func() { + if err != nil { + // TODO: dot not delete user configed directory, delete directories and files we addded only +- cg.CleanAll(rootPath) ++ if terr := cg.CleanAll(rootPath); terr != nil { ++ logrus.Warnf("clean certs failed: %v", terr) ++ } + } + }() + +diff --git a/pkg/clusterdeployment/binary/controlplane/controlplane_test.go b/pkg/clusterdeployment/binary/controlplane/controlplane_test.go +index 8fb769f..c4e6ab7 100644 +--- a/pkg/clusterdeployment/binary/controlplane/controlplane_test.go ++++ b/pkg/clusterdeployment/binary/controlplane/controlplane_test.go +@@ -16,6 +16,7 @@ package controlplane + + import ( + "fmt" ++ "strings" + "testing" + + "github.com/sirupsen/logrus" +@@ -92,7 +93,9 @@ func TestInit(t *testing.T) { + r := &MockRunner{} + var master string + for _, node := range conf.Nodes { +- nodemanager.RegisterNode(node, r) ++ if err := nodemanager.RegisterNode(node, r); err != nil { ++ t.Fatalf("register node failed: %v", err) ++ } + if utils.IsType(node.Type, api.Master) { + master = node.Address + } +@@ -103,15 +106,21 @@ func TestInit(t *testing.T) { + + api.EggoHomePath = "/tmp/eggo" + // generate api server etcd client ceritifaces for testing +- lr.RunCommand(fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki/etcd", api.EggoHomePath, conf.Name)) +- lr.RunCommand(fmt.Sprintf("sudo chmod -R 0777 %s/%s", api.EggoHomePath, conf.Name)) +- lr.RunCommand(fmt.Sprintf("sudo touch %s/%s/pki/apiserver-etcd-client.crt", api.EggoHomePath, conf.Name)) +- lr.RunCommand(fmt.Sprintf("sudo touch %s/%s/pki/apiserver-etcd-client.key", api.EggoHomePath, conf.Name)) +- lr.RunCommand(fmt.Sprintf("sudo touch %s/%s/pki/etcd/ca.crt", api.EggoHomePath, conf.Name)) ++ var sb strings.Builder ++ sb.WriteString(fmt.Sprintf("sudo mkdir -p -m 0777 %s/%s/pki/etcd", api.EggoHomePath, conf.Name)) ++ sb.WriteString(fmt.Sprintf("&& sudo chmod -R 0777 %s/%s", api.EggoHomePath, conf.Name)) ++ sb.WriteString(fmt.Sprintf("&& sudo touch %s/%s/pki/apiserver-etcd-client.crt", api.EggoHomePath, conf.Name)) ++ sb.WriteString(fmt.Sprintf("&& sudo touch %s/%s/pki/apiserver-etcd-client.key", api.EggoHomePath, conf.Name)) ++ sb.WriteString(fmt.Sprintf("&& sudo touch %s/%s/pki/etcd/ca.crt", api.EggoHomePath, conf.Name)) ++ if _, err := lr.RunCommand(sb.String()); err != nil { ++ t.Fatalf("run command failed: %v", err) ++ } + if err := Init(conf, master); err != nil { + t.Fatalf("do control plane init failed: %v", err) + } + +- lr.RunCommand(fmt.Sprintf("sudo rm -rf %s", api.EggoHomePath)) ++ if _, err := lr.RunCommand(fmt.Sprintf("sudo rm -rf %s", api.EggoHomePath)); err != nil { ++ t.Fatalf("run command failed: %v", err) ++ } + t.Logf("do control plane init success") + } +diff --git a/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go b/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go +index 2835fd9..c9e0946 100644 +--- a/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go ++++ b/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go +@@ -58,11 +58,15 @@ func (m *MockRunner) Close() { + logrus.Infof("close") + } + +-func addNodes(hcfs []*api.HostConfig) { ++func addNodes(hcfs []*api.HostConfig) error { + r := &MockRunner{} + for _, hcf := range hcfs { +- nodemanager.RegisterNode(hcf, r) ++ if err := nodemanager.RegisterNode(hcf, r); err != nil { ++ return err ++ } + } ++ ++ return nil + } + + func TestPrepareInfrastructure(t *testing.T) { +@@ -173,7 +177,9 @@ func TestPrepareInfrastructure(t *testing.T) { + }, + } + +- addNodes(ccfg.Nodes) ++ if err := addNodes(ccfg.Nodes); err != nil { ++ t.Fatalf("add nodes failed: %v", err) ++ } + if err := NodeInfrastructureSetup(ccfg, ccfg.Nodes[0].Address, ccfg.Nodes[0].Type); err != nil { + t.Fatalf("test NodeInfrastructureSetup failed: %v\n", err) + } +diff --git a/pkg/clusterdeployment/clusterdeploy.go b/pkg/clusterdeployment/clusterdeploy.go +index 138d584..fde1fde 100644 +--- a/pkg/clusterdeployment/clusterdeploy.go ++++ b/pkg/clusterdeployment/clusterdeploy.go +@@ -215,9 +215,17 @@ func rollbackFailedNoeds(handler api.ClusterDeploymentAPI, nodes []*api.HostConf + var rollIDs []string + for _, n := range nodes { + // do best to cleanup, if error, just ignore +- handler.ClusterNodeCleanup(n, n.Type) +- handler.MachineInfraDestroy(n) +- handler.CleanupLastStep(n.Name) ++ if terr := handler.ClusterNodeCleanup(n, n.Type); terr != nil { ++ logrus.Warnf("cluster node cleanup failed: %v", terr) ++ } ++ ++ if terr := handler.MachineInfraDestroy(n); terr != nil { ++ logrus.Warnf("machine infrastructure destroy failed: %v", terr) ++ } ++ ++ if terr := handler.CleanupLastStep(n.Name); terr != nil { ++ logrus.Warnf("cleanup last step failed: %v", terr) ++ } + rollIDs = append(rollIDs, n.Address) + } + +diff --git a/pkg/utils/endpoint/endpoint.go b/pkg/utils/endpoint/endpoint.go +index 85d932a..a2b82d3 100644 +--- a/pkg/utils/endpoint/endpoint.go ++++ b/pkg/utils/endpoint/endpoint.go +@@ -21,6 +21,7 @@ import ( + "strconv" + + "isula.org/eggo/pkg/api" ++ + "github.com/sirupsen/logrus" + validation "k8s.io/apimachinery/pkg/util/validation" + ) +diff --git a/pkg/utils/nodemanager/nodemanager.go b/pkg/utils/nodemanager/nodemanager.go +index 25f7d4e..5fff50e 100644 +--- a/pkg/utils/nodemanager/nodemanager.go ++++ b/pkg/utils/nodemanager/nodemanager.go +@@ -125,7 +125,7 @@ func RunTaskOnNodes(t task.Task, nodes []string) error { + logrus.Warnf("node: %s work with too much tasks, will retry it", id) + retryNodes = append(retryNodes, n) + } else { +- return fmt.Errorf("unkown node %s", id) ++ return fmt.Errorf("unknown node %s", id) + } + } + +@@ -165,8 +165,8 @@ func RunTasksOnNode(tasks []task.Task, node string) error { + return fmt.Errorf("node: %s work with too much tasks, will retry it", node) + } + } else { +- logrus.Errorf("unkown node %s", node) +- return fmt.Errorf("unkown node %s", node) ++ logrus.Errorf("unknown node %s", node) ++ return fmt.Errorf("unknown node %s", node) + } + } + +@@ -191,7 +191,7 @@ func RunTaskOnOneNode(t task.Task, nodes []string) (string, error) { + for _, id := range nodes { + n, ok := manager.nodes[id] + if !ok { +- logrus.Warnf("unkown node %s for task %s", id, t.Name()) ++ logrus.Warnf("unknown node %s for task %s", id, t.Name()) + continue + } + if n.PushTask(t) { +@@ -206,7 +206,7 @@ func checkNodeFinish(nodeID string) (bool, string, error) { + defer manager.lock.RUnlock() + n, ok := manager.nodes[nodeID] + if !ok { +- return true, fmt.Sprintf("unknow node: %s", nodeID), fmt.Errorf("unkown node %s", nodeID) ++ return true, fmt.Sprintf("unknow node: %s", nodeID), fmt.Errorf("unknown node %s", nodeID) + } + s := n.GetStatus() + if s.TasksFinished() { +@@ -270,7 +270,7 @@ func WaitNodesFinish(nodes []string, timeout time.Duration) error { + for _, id := range nodes { + n, ok := manager.nodes[id] + if !ok { +- return fmt.Errorf("unkown node %s", id) ++ return fmt.Errorf("unknown node %s", id) + } + err := n.WaitNodeTasksFinish(timeout) + if err != nil { +diff --git a/pkg/utils/nodemanager/nodemanager_test.go b/pkg/utils/nodemanager/nodemanager_test.go +index b1b321a..52ad91c 100644 +--- a/pkg/utils/nodemanager/nodemanager_test.go ++++ b/pkg/utils/nodemanager/nodemanager_test.go +@@ -74,7 +74,7 @@ func (m *MockTask) Run(r runner.Runner, hcf *api.HostConfig) error { + } + time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond) + +- r.Reconnect() ++ err = r.Reconnect() + + return err + } +@@ -83,7 +83,7 @@ func (m *MockTask) Name() string { + return m.name + } + +-func addNodes() { ++func addNodes() error { + hcf1 := &api.HostConfig{ + Arch: "x86_64", + Name: "master", +@@ -103,8 +103,15 @@ func addNodes() { + Type: api.Worker, + } + r := &MockRunner{} +- RegisterNode(hcf1, r) +- RegisterNode(hcf2, r) ++ ++ if err := RegisterNode(hcf1, r); err != nil { ++ return err ++ } ++ if err := RegisterNode(hcf2, r); err != nil { ++ return err ++ } ++ ++ return nil + } + + func releaseNodes(nodes []string) { +@@ -114,7 +121,10 @@ func releaseNodes(nodes []string) { + } + + func TestRunTaskOnNodes(t *testing.T) { +- addNodes() ++ if err := addNodes(); err != nil { ++ t.Fatalf("add nodes failed: %v", err) ++ } ++ + tt := task.NewTaskInstance( + &MockTask{ + name: "precheck", +@@ -146,7 +156,10 @@ func TestRunTaskOnNodes(t *testing.T) { + } + + func TestRunTaskOnAll(t *testing.T) { +- addNodes() ++ if err := addNodes(); err != nil { ++ t.Fatalf("add nodes failed: %v", err) ++ } ++ + tt := task.NewTaskInstance( + &MockTask{ + name: "precheck", +-- +2.25.1 + diff --git a/0023-add-golang-static-code-check.patch b/0023-add-golang-static-code-check.patch new file mode 100644 index 0000000..2c9bac2 --- /dev/null +++ b/0023-add-golang-static-code-check.patch @@ -0,0 +1,1489 @@ +From 61a4eb8d90ac24ad09b82b2d1578c99ed6a2d5b7 Mon Sep 17 00:00:00 2001 +From: zhangxiaoyu +Date: Tue, 29 Mar 2022 21:34:38 +0800 +Subject: [PATCH 23/24] add golang static code check + +Signed-off-by: zhangxiaoyu +--- + .golangci.yaml | 54 +++++++++++++++---- + cmd/checker.go | 5 +- + cmd/checker_test.go | 4 +- + cmd/configs.go | 33 ++++++------ + cmd/configs_test.go | 1 + + cmd/delete.go | 2 +- + cmd/eggo.go | 4 +- + cmd/filetools.go | 6 ++- + cmd/list.go | 1 + + cmd/opts.go | 4 +- + pkg/api/tools.go | 7 +-- + pkg/api/types.go | 10 ++-- + .../binary/addons/runner_addons.go | 4 +- + .../binary/bootstrap/bootstrap.go | 5 +- + .../binary/bootstrap/bootstrap_test.go | 9 ++-- + .../binary/cleanupcluster/cleanupetcd.go | 1 + + .../binary/commontools/copycacerts.go | 1 + + .../binary/commontools/runshell.go | 1 + + .../binary/commontools/systemdservices.go | 5 +- + .../binary/controlplane/controlplane.go | 9 ++-- + .../binary/controlplane/controlplane_test.go | 1 + + .../binary/coredns/binarycoredns.go | 11 ++-- + .../binary/coredns/podcoredns.go | 6 ++- + .../binary/etcdcluster/etcdcluster.go | 10 ++-- + .../binary/etcdcluster/etcdcluster_test.go | 1 + + .../binary/etcdcluster/etcdjoin.go | 4 +- + .../binary/etcdcluster/etcdreconfig.go | 5 +- + .../binary/infrastructure/firewall.go | 1 + + .../infrastructure/infrastructure_test.go | 1 + + .../binary/loadbalance/loadbalance.go | 1 + + .../binary/network/network.go | 5 +- + pkg/clusterdeployment/clusterdeploy.go | 36 ++++++++----- + pkg/clusterdeployment/runtime/runtime.go | 1 + + pkg/constants/constants.go | 14 ++++- + pkg/utils/certs/approvecsr.go | 10 ++-- + pkg/utils/certs/certs.go | 1 + + pkg/utils/certs/localcerts.go | 9 +++- + pkg/utils/certs/tools.go | 6 ++- + pkg/utils/dependency/cmdhooks.go | 3 +- + pkg/utils/dependency/dependency.go | 1 + + pkg/utils/dependency/dependency_test.go | 1 + + pkg/utils/dependency/install.go | 9 ++-- + pkg/utils/endpoint/endpoint.go | 13 +++-- + pkg/utils/infra/infra.go | 2 +- + pkg/utils/kubectl/kubectl.go | 10 ++-- + pkg/utils/kubectl/taint.go | 5 +- + pkg/utils/nodemanager/node.go | 14 +++-- + pkg/utils/nodemanager/nodemanager.go | 5 +- + pkg/utils/nodemanager/nodemanager_test.go | 1 + + pkg/utils/runner/runner.go | 1 + + 50 files changed, 244 insertions(+), 110 deletions(-) + +diff --git a/.golangci.yaml b/.golangci.yaml +index ea8515f..e3051db 100644 +--- a/.golangci.yaml ++++ b/.golangci.yaml +@@ -1,18 +1,54 @@ +-linters-settings: +- golint: +- min-confidence: 0 +- misspell: +- locale: US ++run: ++ deadline: 10m ++ issues-exit-code: 1 ++ tests: true ++ ++ skip-dirs: ++ - vendor ++ ++ skip-files: ++ - ".*\\.pb\\.go$" ++ - ".*\\.dbx\\.go$" ++ ++ + linters: + disable-all: true + enable: +- - typecheck ++ - gomnd ++ - govet + - goimports ++ - revive ++ - gofmt ++ - gosimple ++ - typecheck + - misspell +- - govet + - ineffassign +- - gosimple + - deadcode + - structcheck + - unused +- - errcheck +\ No newline at end of file ++ - errcheck ++ ++linters-settings: ++ gomnd: ++ settings: ++ mnd: ++ checks: argument, case, condition, operation, return, assign ++ ignored-numbers: 2 ++ govet: ++ check-shadowing: true ++ use-installed-packages: false ++ goimports: ++ local-prefixes: isula.org/eggo ++ revive: ++ min-confidence: 0.8 ++ rules: ++ - name: exported ++ disabled: true ++ gofmt: ++ simplify: true ++ misspell: ++ locale: US ++ errcheck: ++ check-type-assertions: false ++ check-blank: false ++ ignore: fmt:.*,io/ioutil:^Read.* +diff --git a/cmd/checker.go b/cmd/checker.go +index 2f99a0c..54136a2 100644 +--- a/cmd/checker.go ++++ b/cmd/checker.go +@@ -26,12 +26,13 @@ import ( + "strings" + "time" + ++ "k8s.io/apimachinery/pkg/util/validation" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/endpoint" + chain "isula.org/eggo/pkg/utils/responsibilitychain" +- "k8s.io/apimachinery/pkg/util/validation" + ) + + type ClusterConfigResponsibility struct { +@@ -414,7 +415,7 @@ func checkHookFile(fileName string) error { + if !file.Mode().IsRegular() { + return fmt.Errorf("%s is not regular file", file.Name()) + } +- if file.Mode().Perm() != os.FileMode(constants.HookFileMode) { ++ if file.Mode().Perm() != constants.HookFileMode { + return fmt.Errorf("file mode of %s is incorrect", file.Name()) + } + if file.Size() > constants.MaxHookFileSize || file.Size() == 0 { +diff --git a/cmd/checker_test.go b/cmd/checker_test.go +index 57babf9..1abf20d 100644 +--- a/cmd/checker_test.go ++++ b/cmd/checker_test.go +@@ -53,8 +53,8 @@ func TestRunChecker(t *testing.T) { + } + + for _, fn := range conf.InstallConfig.PackageSrc.SrcPath { +- if err := os.MkdirAll(fn, 0755); err != nil { +- t.Fatalf("mkdir failed: %v", err) ++ if terr := os.MkdirAll(fn, 0755); terr != nil { ++ t.Fatalf("mkdir failed: %v", terr) + } + defer os.RemoveAll(fn) + } +diff --git a/cmd/configs.go b/cmd/configs.go +index 4d7a4b9..0a35b57 100644 +--- a/cmd/configs.go ++++ b/cmd/configs.go +@@ -25,9 +25,9 @@ import ( + "strconv" + "strings" + ++ "github.com/sirupsen/logrus" + "gopkg.in/yaml.v1" + +- "github.com/sirupsen/logrus" + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/coredns" + "isula.org/eggo/pkg/constants" +@@ -40,6 +40,9 @@ const ( + WorkerRole string = "worker" + ETCDRole string = "etcd" + LoadBalanceRole string = "loadbalance" ++ ++ parseBase = 10 ++ parseBitSize = 32 + ) + + var ( +@@ -81,7 +84,7 @@ func init() { + return + } + +- if err := os.Mkdir(utils.GetEggoDir(), 0700); err != nil { ++ if err := os.Mkdir(utils.GetEggoDir(), constants.EggoDirMode); err != nil { + logrus.Errorf("mkdir eggo directory %v failed", utils.GetEggoDir()) + } + } +@@ -109,11 +112,11 @@ func saveDeployConfig(cc *DeployConfig, filePath string) error { + return fmt.Errorf("invalid config file path %v", filePath) + } + +- if err = os.MkdirAll(filepath.Dir(cleanPath), 0750); err != nil { ++ if err = os.MkdirAll(filepath.Dir(cleanPath), constants.EggoHomeDirMode); err != nil { + return fmt.Errorf("create dir %v to save deploy config failed: %v", filepath.Dir(cleanPath), err) + } + +- if err = ioutil.WriteFile(filePath, d, 0640); err != nil { ++ if err = ioutil.WriteFile(filePath, d, constants.DeployConfigFileMode); err != nil { + return fmt.Errorf("write user deploy config file failed: %v", err) + } + +@@ -162,14 +165,14 @@ func getDefaultClusterdeploymentConfig() *api.ClusterConfig { + PluginArgs: make(map[string]string), + }, + ControlPlane: api.ControlPlaneConfig{ +- ApiConf: &api.ApiServer{ ++ APIConf: &api.APIServer{ + Timeout: "120s", + }, + }, + WorkerConfig: api.WorkerConfig{ + KubeletConf: &api.Kubelet{ +- DnsVip: "10.32.0.10", +- DnsDomain: "cluster.local", ++ DNSVip: "10.32.0.10", ++ DNSDomain: "cluster.local", + PauseImage: "k8s.gcr.io/pause:3.2", + NetworkPlugin: "cni", + CniBinDir: "/usr/libexec/cni,/opt/cni/bin", +@@ -283,7 +286,7 @@ func fillPackageConfig(ccfg *api.ClusterConfig, icfg *InstallConfig) { + } + + if coredns.IsTypeBinary(ccfg.ServiceCluster.DNS.CorednsType) { +- ccfg.RoleInfra[api.Master].Softwares = appendSoftware(ccfg.RoleInfra[api.Master].Softwares, ToEggoPackageConfig(icfg.Dns), infra.DnsPackages) ++ ccfg.RoleInfra[api.Master].Softwares = appendSoftware(ccfg.RoleInfra[api.Master].Softwares, ToEggoPackageConfig(icfg.Dns), infra.DNSPackages) + } + + if len(icfg.Addition) == 0 { +@@ -527,7 +530,7 @@ func fillAPIEndPoint(APIEndpoint *api.APIEndpoint, conf *DeployConfig) { + return + } + +- iport, err := strconv.ParseInt(port, 10, 32) ++ iport, err := strconv.ParseInt(port, parseBase, parseBitSize) + if err != nil { + logrus.Errorf("invalid port %s: %v", port, err) + return +@@ -576,9 +579,9 @@ func toClusterdeploymentConfig(conf *DeployConfig, hooks []*api.ClusterHookConf) + setIfStrConfigNotEmpty(&ccfg.Network.PodCIDR, conf.NetWork.PodCIDR) + setIfStrConfigNotEmpty(&ccfg.Network.Plugin, conf.NetWork.Plugin) + setStrStrMap(ccfg.Network.PluginArgs, conf.NetWork.PluginArgs) +- setStrArray(&ccfg.ControlPlane.ApiConf.CertSans.DNSNames, conf.ApiServerCertSans.DNSNames) +- setStrArray(&ccfg.ControlPlane.ApiConf.CertSans.IPs, conf.ApiServerCertSans.IPs) +- setIfStrConfigNotEmpty(&ccfg.ControlPlane.ApiConf.Timeout, conf.ApiServerTimeout) ++ setStrArray(&ccfg.ControlPlane.APIConf.CertSans.DNSNames, conf.ApiServerCertSans.DNSNames) ++ setStrArray(&ccfg.ControlPlane.APIConf.CertSans.IPs, conf.ApiServerCertSans.IPs) ++ setIfStrConfigNotEmpty(&ccfg.ControlPlane.APIConf.Timeout, conf.ApiServerTimeout) + ccfg.EtcdCluster.External = conf.EtcdExternal + for _, node := range ccfg.Nodes { + if (node.Type & api.ETCD) != 0 { +@@ -586,8 +589,8 @@ func toClusterdeploymentConfig(conf *DeployConfig, hooks []*api.ClusterHookConf) + } + } + setIfStrConfigNotEmpty(&ccfg.EtcdCluster.Token, conf.EtcdToken) +- setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.DnsVip, conf.DnsVip) +- setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.DnsDomain, conf.DnsDomain) ++ setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.DNSVip, conf.DnsVip) ++ setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.DNSDomain, conf.DnsDomain) + setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.PauseImage, conf.PauseImage) + setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.NetworkPlugin, conf.NetworkPlugin) + setIfStrConfigNotEmpty(&ccfg.WorkerConfig.KubeletConf.CniBinDir, conf.CniBinDir) +@@ -938,7 +941,7 @@ func createDeployConfigTemplate(file string) error { + return fmt.Errorf("marshal template config failed: %v", err) + } + +- if err := ioutil.WriteFile(file, d, 0640); err != nil { ++ if err := ioutil.WriteFile(file, d, constants.DeployConfigFileMode); err != nil { + return fmt.Errorf("write template config file failed: %v", err) + } + +diff --git a/cmd/configs_test.go b/cmd/configs_test.go +index 04afc51..3b72481 100644 +--- a/cmd/configs_test.go ++++ b/cmd/configs_test.go +@@ -23,6 +23,7 @@ import ( + "testing" + + "gopkg.in/yaml.v1" ++ + "isula.org/eggo/pkg/api" + ) + +diff --git a/cmd/delete.go b/cmd/delete.go +index 05a1dee..2e537aa 100644 +--- a/cmd/delete.go ++++ b/cmd/delete.go +@@ -89,7 +89,7 @@ func deleteCluster(cmd *cobra.Command, args []string) error { + return fmt.Errorf("load saved deploy config failed: %v", err) + } + +- if err := checkCmdHooksParameter(opts.prehook, opts.posthook); err != nil { ++ if err = checkCmdHooksParameter(opts.prehook, opts.posthook); err != nil { + return err + } + // check saved deploy config +diff --git a/cmd/eggo.go b/cmd/eggo.go +index 36a3f9e..77c8a0f 100644 +--- a/cmd/eggo.go ++++ b/cmd/eggo.go +@@ -68,7 +68,9 @@ func preCheck() { + sb.WriteString("Maybe cause to failure!!!\n") + sb.WriteString("Shutdown current operator!!!\n") + fmt.Println(sb.String()) +- time.Sleep(time.Second * 10) ++ ++ const preCheckSecond = 10 ++ time.Sleep(time.Second * preCheckSecond) + } + } + +diff --git a/cmd/filetools.go b/cmd/filetools.go +index dff2a01..9b67b71 100644 +--- a/cmd/filetools.go ++++ b/cmd/filetools.go +@@ -21,6 +21,8 @@ import ( + "path/filepath" + "strconv" + "strings" ++ ++ "isula.org/eggo/pkg/constants" + ) + + func checkProcessRunning(pid int) bool { +@@ -53,11 +55,11 @@ func NewProcessPlaceHolder(path string) (*ProcessPlaceHolder, error) { + if err := checkProcessInFile(path); err != nil && !os.IsNotExist(err) { + return nil, err + } +- if err := os.MkdirAll(filepath.Dir(path), os.FileMode(0750)); err != nil { ++ if err := os.MkdirAll(filepath.Dir(path), constants.EggoHomeDirMode); err != nil { + return nil, err + } + pid := strconv.Itoa(os.Getpid()) +- if err := ioutil.WriteFile(path, []byte(pid), 0640); err != nil { ++ if err := ioutil.WriteFile(path, []byte(pid), constants.ProcessFileMode); err != nil { + return nil, err + } + return &ProcessPlaceHolder{path}, nil +diff --git a/cmd/list.go b/cmd/list.go +index 27729ba..60e43bf 100644 +--- a/cmd/list.go ++++ b/cmd/list.go +@@ -22,6 +22,7 @@ import ( + + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ++ + "isula.org/eggo/pkg/api" + ) + +diff --git a/cmd/opts.go b/cmd/opts.go +index d0235fe..c2ffed4 100644 +--- a/cmd/opts.go ++++ b/cmd/opts.go +@@ -20,6 +20,8 @@ import ( + + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ++ ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" + ) + +@@ -56,7 +58,7 @@ func init() { + return + } + +- if err := os.Mkdir(utils.GetEggoDir(), 0700); err != nil { ++ if err := os.Mkdir(utils.GetEggoDir(), constants.EggoDirMode); err != nil { + logrus.Errorf("mkdir eggo directory %v failed", utils.GetEggoDir()) + } + } +diff --git a/pkg/api/tools.go b/pkg/api/tools.go +index 4c65dc2..77ee1bc 100644 +--- a/pkg/api/tools.go ++++ b/pkg/api/tools.go +@@ -6,8 +6,9 @@ import ( + "strings" + + "github.com/sirupsen/logrus" +- "isula.org/eggo/pkg/constants" + "k8s.io/apimachinery/pkg/util/json" ++ ++ "isula.org/eggo/pkg/constants" + ) + + var ( +@@ -55,7 +56,7 @@ func (p PackageSrcConfig) GetPkgDstPath() string { + return p.DstPath + } + +-func (ep APIEndpoint) GetUrl() string { ++func (ep APIEndpoint) GetURL() string { + return fmt.Sprintf("%s/%v", ep.AdvertiseAddress, ep.BindPort) + } + +@@ -141,7 +142,7 @@ func WithEtcdExtrArgs(eargs map[string]string) ClusterConfigOption { + + func WithAPIServerExtrArgs(eargs map[string]string) ClusterConfigOption { + return func(conf *ClusterConfig) *ClusterConfig { +- conf.ControlPlane.ApiConf.ExtraArgs = eargs ++ conf.ControlPlane.APIConf.ExtraArgs = eargs + return conf + } + } +diff --git a/pkg/api/types.go b/pkg/api/types.go +index 5cb7121..972ec82 100644 +--- a/pkg/api/types.go ++++ b/pkg/api/types.go +@@ -55,7 +55,7 @@ const ( + + type HookRunConfig struct { + ClusterID string +- ClusterApiEndpoint string ++ ClusterAPIEndpoint string + ClusterConfigDir string + + HookType HookType +@@ -115,7 +115,7 @@ type Sans struct { + DNSNames []string `json:"dns-names"` + IPs []string `json:"ips"` + } +-type ApiServer struct { ++type APIServer struct { + CertSans Sans `json:"cert-sans,omitempty"` + Timeout string `json:"timeout,omitempty"` + ExtraArgs map[string]string `json:"extra-args,omitempty"` +@@ -136,8 +136,8 @@ type WorkerConfig struct { + } + + type Kubelet struct { +- DnsVip string `json:"dns-vip,omitempty"` +- DnsDomain string `json:"dns-domain"` ++ DNSVip string `json:"dns-vip,omitempty"` ++ DNSDomain string `json:"dns-domain"` + PauseImage string `json:"pause-image"` + NetworkPlugin string `json:"network-plugin"` + CniBinDir string `json:"cni-bin-dir"` +@@ -163,7 +163,7 @@ type APIEndpoint struct { + BindPort int32 `json:"bind-port,omitempty"` + } + type ControlPlaneConfig struct { +- ApiConf *ApiServer `json:"apiconf,omitempty"` ++ APIConf *APIServer `json:"apiconf,omitempty"` + ManagerConf *ControlManager `json:"managerconf,omitempty"` + SchedulerConf *Scheduler `json:"schedulerconf,omitempty"` + } +diff --git a/pkg/clusterdeployment/binary/addons/runner_addons.go b/pkg/clusterdeployment/binary/addons/runner_addons.go +index e5bc0ad..27347fd 100644 +--- a/pkg/clusterdeployment/binary/addons/runner_addons.go ++++ b/pkg/clusterdeployment/binary/addons/runner_addons.go +@@ -6,6 +6,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/dependency" +@@ -77,7 +78,8 @@ func setupAddons(cluster *api.ClusterConfig) error { + if err != nil { + return err + } +- err = nodemanager.WaitNodesFinish([]string{useMaster}, 5*time.Minute) ++ ++ err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes) + if err != nil { + return err + } +diff --git a/pkg/clusterdeployment/binary/bootstrap/bootstrap.go b/pkg/clusterdeployment/binary/bootstrap/bootstrap.go +index 46870d7..e7b0c63 100644 +--- a/pkg/clusterdeployment/binary/bootstrap/bootstrap.go ++++ b/pkg/clusterdeployment/binary/bootstrap/bootstrap.go +@@ -24,6 +24,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" + "isula.org/eggo/pkg/clusterdeployment/binary/controlplane" +@@ -245,8 +246,8 @@ serverTLSBootstrap: true + ` + + datastore := make(map[string]interface{}) +- datastore["DnsVip"] = ccfg.WorkerConfig.KubeletConf.DnsVip +- datastore["DnsDomain"] = ccfg.WorkerConfig.KubeletConf.DnsDomain ++ datastore["DnsVip"] = ccfg.WorkerConfig.KubeletConf.DNSVip ++ datastore["DnsDomain"] = ccfg.WorkerConfig.KubeletConf.DNSDomain + datastore["EnableServer"] = ccfg.WorkerConfig.KubeletConf.EnableServer + + config, err := template.TemplateRender(kubeletConfig, datastore) +diff --git a/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go b/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go +index 7b3c1ff..522af37 100644 +--- a/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go ++++ b/pkg/clusterdeployment/binary/bootstrap/bootstrap_test.go +@@ -20,6 +20,7 @@ import ( + "testing" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/nodemanager" + "isula.org/eggo/pkg/utils/runner" +@@ -71,8 +72,8 @@ func TestJoinMaster(t *testing.T) { + }, + WorkerConfig: api.WorkerConfig{ + KubeletConf: &api.Kubelet{ +- DnsVip: "10.32.0.10", +- DnsDomain: "cluster.local", ++ DNSVip: "10.32.0.10", ++ DNSDomain: "cluster.local", + CniBinDir: "/opt/cni/bin", + }, + ContainerEngineConf: &api.ContainerEngine{ +@@ -146,8 +147,8 @@ func TestJoinWorker(t *testing.T) { + }, + WorkerConfig: api.WorkerConfig{ + KubeletConf: &api.Kubelet{ +- DnsVip: "10.32.0.10", +- DnsDomain: "cluster.local", ++ DNSVip: "10.32.0.10", ++ DNSDomain: "cluster.local", + CniBinDir: "/opt/cni/bin", + }, + ContainerEngineConf: &api.ContainerEngine{ +diff --git a/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go b/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go +index 59005a7..07922b0 100644 +--- a/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go ++++ b/pkg/clusterdeployment/binary/cleanupcluster/cleanupetcd.go +@@ -21,6 +21,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/etcdcluster" + "isula.org/eggo/pkg/utils" +diff --git a/pkg/clusterdeployment/binary/commontools/copycacerts.go b/pkg/clusterdeployment/binary/commontools/copycacerts.go +index d9f992d..0ef2815 100644 +--- a/pkg/clusterdeployment/binary/commontools/copycacerts.go ++++ b/pkg/clusterdeployment/binary/commontools/copycacerts.go +@@ -20,6 +20,7 @@ import ( + "path/filepath" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + ) +diff --git a/pkg/clusterdeployment/binary/commontools/runshell.go b/pkg/clusterdeployment/binary/commontools/runshell.go +index 266c488..92122ef 100644 +--- a/pkg/clusterdeployment/binary/commontools/runshell.go ++++ b/pkg/clusterdeployment/binary/commontools/runshell.go +@@ -16,6 +16,7 @@ package commontools + + import ( + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + ) +diff --git a/pkg/clusterdeployment/binary/commontools/systemdservices.go b/pkg/clusterdeployment/binary/commontools/systemdservices.go +index 3b32e22..00ed557 100644 +--- a/pkg/clusterdeployment/binary/commontools/systemdservices.go ++++ b/pkg/clusterdeployment/binary/commontools/systemdservices.go +@@ -19,6 +19,7 @@ import ( + "fmt" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/runner" +@@ -60,8 +61,8 @@ func SetupAPIServerService(r runner.Runner, ccfg *api.ClusterConfig, hcf *api.Ho + "--requestheader-username-headers": "X-Remote-User", + "--encryption-provider-config": "/etc/kubernetes/encryption-config.yaml", + } +- if ccfg.ControlPlane.ApiConf != nil { +- for k, v := range ccfg.ControlPlane.ApiConf.ExtraArgs { ++ if ccfg.ControlPlane.APIConf != nil { ++ for k, v := range ccfg.ControlPlane.APIConf.ExtraArgs { + defaultArgs[k] = v + } + } +diff --git a/pkg/clusterdeployment/binary/controlplane/controlplane.go b/pkg/clusterdeployment/binary/controlplane/controlplane.go +index 1f93e5e..31bdcef 100644 +--- a/pkg/clusterdeployment/binary/controlplane/controlplane.go ++++ b/pkg/clusterdeployment/binary/controlplane/controlplane.go +@@ -26,6 +26,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" + "isula.org/eggo/pkg/constants" +@@ -193,9 +194,9 @@ func generateApiServerCertificate(savePath string, cg certs.CertGenerator, ccfg + if ccfg.ServiceCluster.Gateway != "" { + ips = append(ips, ccfg.ServiceCluster.Gateway) + } +- if ccfg.ControlPlane.ApiConf != nil { +- ips = append(ips, ccfg.ControlPlane.ApiConf.CertSans.IPs...) +- dnsnames = append(dnsnames, ccfg.ControlPlane.ApiConf.CertSans.DNSNames...) ++ if ccfg.ControlPlane.APIConf != nil { ++ ips = append(ips, ccfg.ControlPlane.APIConf.CertSans.IPs...) ++ dnsnames = append(dnsnames, ccfg.ControlPlane.APIConf.CertSans.DNSNames...) + } + if ccfg.LoadBalancer.IP != "" { + ips = append(ips, ccfg.LoadBalancer.IP) +@@ -435,7 +436,7 @@ resources: + } + + fname := filepath.Join(savePath, constants.EncryptionConfigName) +- return ioutil.WriteFile(fname, []byte(encryStr), 0600) ++ return ioutil.WriteFile(fname, []byte(encryStr), constants.EncryptionConfigFileMode) + } + + func generateCertsAndKubeConfigs(r runner.Runner, ccfg *api.ClusterConfig, hcf *api.HostConfig) (err error) { +diff --git a/pkg/clusterdeployment/binary/controlplane/controlplane_test.go b/pkg/clusterdeployment/binary/controlplane/controlplane_test.go +index c4e6ab7..0a73c71 100644 +--- a/pkg/clusterdeployment/binary/controlplane/controlplane_test.go ++++ b/pkg/clusterdeployment/binary/controlplane/controlplane_test.go +@@ -20,6 +20,7 @@ import ( + "testing" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/nodemanager" +diff --git a/pkg/clusterdeployment/binary/coredns/binarycoredns.go b/pkg/clusterdeployment/binary/coredns/binarycoredns.go +index 411dba2..aa3fada 100644 +--- a/pkg/clusterdeployment/binary/coredns/binarycoredns.go ++++ b/pkg/clusterdeployment/binary/coredns/binarycoredns.go +@@ -22,6 +22,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" + "isula.org/eggo/pkg/constants" +@@ -292,7 +293,7 @@ func (bc *BinaryCoredns) Setup(cluster *api.ClusterConfig) error { + return err + } + +- if err = nodemanager.WaitNodesFinish(masterIPs, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish(masterIPs, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Errorf("coredns setup failed: %v", err) + return err + } +@@ -375,7 +376,7 @@ func (bc *BinaryCoredns) Cleanup(cluster *api.ClusterConfig) error { + return nil + } + +- if err = nodemanager.WaitNodesFinish(masterIPs, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish(masterIPs, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("wait to coredns cleanup failed: %v", err) + return nil + } +@@ -414,7 +415,7 @@ func (bc *BinaryCoredns) JoinNode(nodeAddr string, cluster *api.ClusterConfig) e + return err + } + +- if err = nodemanager.WaitNodesFinish([]string{nodeAddr}, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish([]string{nodeAddr}, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Errorf("wait to coredns service running failed: %v", err) + return err + } +@@ -431,7 +432,7 @@ func (bc *BinaryCoredns) JoinNode(nodeAddr string, cluster *api.ClusterConfig) e + return err + } + +- if err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Errorf("wait to join new coredns node failed: %v", err) + return err + } +@@ -453,7 +454,7 @@ func (bc *BinaryCoredns) CleanNode(nodeAddr string, cluster *api.ClusterConfig) + return nil + } + +- if err = nodemanager.WaitNodesFinish([]string{nodeAddr}, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish([]string{nodeAddr}, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("wait to coredns cleanup failed: %v", err) + return nil + } +diff --git a/pkg/clusterdeployment/binary/coredns/podcoredns.go b/pkg/clusterdeployment/binary/coredns/podcoredns.go +index 28ae908..8b509bc 100644 +--- a/pkg/clusterdeployment/binary/coredns/podcoredns.go ++++ b/pkg/clusterdeployment/binary/coredns/podcoredns.go +@@ -22,7 +22,9 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/kubectl" + "isula.org/eggo/pkg/utils/nodemanager" + "isula.org/eggo/pkg/utils/runner" +@@ -137,7 +139,7 @@ func (pc *PodCoredns) Setup(cluster *api.ClusterConfig) error { + if err != nil { + return err + } +- err = nodemanager.WaitNodesFinish([]string{useMaster}, 5*time.Minute) ++ err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes) + if err != nil { + return err + } +@@ -162,7 +164,7 @@ func (pc *PodCoredns) Cleanup(cluster *api.ClusterConfig) error { + if err != nil { + return err + } +- err = nodemanager.WaitNodesFinish([]string{useMaster}, 5*time.Minute) ++ err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes) + if err != nil { + return err + } +diff --git a/pkg/clusterdeployment/binary/etcdcluster/etcdcluster.go b/pkg/clusterdeployment/binary/etcdcluster/etcdcluster.go +index 5444e77..d7d2f41 100644 +--- a/pkg/clusterdeployment/binary/etcdcluster/etcdcluster.go ++++ b/pkg/clusterdeployment/binary/etcdcluster/etcdcluster.go +@@ -23,8 +23,10 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/nodemanager" + "isula.org/eggo/pkg/utils/runner" +@@ -155,7 +157,9 @@ func (t *EtcdPostDeployEtcdsTask) Run(r runner.Runner, hostConfig *api.HostConfi + return nil + } + retry-- +- time.Sleep(3 * time.Second) ++ ++ const etcdRetrySecond = 3 ++ time.Sleep(time.Second * etcdRetrySecond) + } + + return fmt.Errorf("etcd %v healthcheck failed: %v", hostConfig.Name, err) +@@ -244,7 +248,7 @@ func Init(conf *api.ClusterConfig) error { + return fmt.Errorf("run task on nodes failed: %v", err) + } + +- if err := nodemanager.WaitNodesFinish(nodes, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinish(nodes, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return fmt.Errorf("wait for deploy etcds task finish failed: %v", err) + } + +@@ -258,7 +262,7 @@ func Init(conf *api.ClusterConfig) error { + return fmt.Errorf("run task on nodes failed: %v", err) + } + +- if err := nodemanager.WaitNodesFinish(nodes, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinish(nodes, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return fmt.Errorf("wait for post deploy etcds task finish failed: %v", err) + } + +diff --git a/pkg/clusterdeployment/binary/etcdcluster/etcdcluster_test.go b/pkg/clusterdeployment/binary/etcdcluster/etcdcluster_test.go +index f19394a..74ced0f 100644 +--- a/pkg/clusterdeployment/binary/etcdcluster/etcdcluster_test.go ++++ b/pkg/clusterdeployment/binary/etcdcluster/etcdcluster_test.go +@@ -24,6 +24,7 @@ import ( + "testing" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/nodemanager" +diff --git a/pkg/clusterdeployment/binary/etcdcluster/etcdjoin.go b/pkg/clusterdeployment/binary/etcdcluster/etcdjoin.go +index 97be436..f86499f 100644 +--- a/pkg/clusterdeployment/binary/etcdcluster/etcdjoin.go ++++ b/pkg/clusterdeployment/binary/etcdcluster/etcdjoin.go +@@ -20,6 +20,7 @@ import ( + "time" + + "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/nodemanager" + "isula.org/eggo/pkg/utils/task" + ) +@@ -48,7 +49,8 @@ func AddMember(conf *api.ClusterConfig, hostconfig *api.HostConfig) error { + return fmt.Errorf("run task on nodes failed: %v", err) + } + +- if err := nodemanager.WaitNodesFinish([]string{hostconfig.Address}, 5*time.Minute); err != nil { ++ if err := nodemanager.WaitNodesFinish([]string{hostconfig.Address}, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return fmt.Errorf("wait for post deploy etcds task finish failed: %v", err) + } + +diff --git a/pkg/clusterdeployment/binary/etcdcluster/etcdreconfig.go b/pkg/clusterdeployment/binary/etcdcluster/etcdreconfig.go +index 9757997..df2cf5c 100644 +--- a/pkg/clusterdeployment/binary/etcdcluster/etcdreconfig.go ++++ b/pkg/clusterdeployment/binary/etcdcluster/etcdreconfig.go +@@ -21,6 +21,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/nodemanager" +@@ -229,7 +230,9 @@ func addEtcd(r runner.Runner, certDir string, name string, ip string) (string, e + return output, nil + } + retry-- +- time.Sleep(3 * time.Second) ++ ++ const etcdRetrySecond = 3 ++ time.Sleep(time.Second * etcdRetrySecond) + } + logrus.Errorf("add etcd %v failed: %v\noutput: %v", name, err, output) + return "", err +diff --git a/pkg/clusterdeployment/binary/infrastructure/firewall.go b/pkg/clusterdeployment/binary/infrastructure/firewall.go +index 81bf7c5..4660cab 100644 +--- a/pkg/clusterdeployment/binary/infrastructure/firewall.go ++++ b/pkg/clusterdeployment/binary/infrastructure/firewall.go +@@ -21,6 +21,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/runner" +diff --git a/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go b/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go +index c9e0946..4ffa7a9 100644 +--- a/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go ++++ b/pkg/clusterdeployment/binary/infrastructure/infrastructure_test.go +@@ -20,6 +20,7 @@ import ( + "testing" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/dependency" + "isula.org/eggo/pkg/utils/nodemanager" +diff --git a/pkg/clusterdeployment/binary/loadbalance/loadbalance.go b/pkg/clusterdeployment/binary/loadbalance/loadbalance.go +index 34c25bd..f059372 100644 +--- a/pkg/clusterdeployment/binary/loadbalance/loadbalance.go ++++ b/pkg/clusterdeployment/binary/loadbalance/loadbalance.go +@@ -22,6 +22,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" + "isula.org/eggo/pkg/utils" +diff --git a/pkg/clusterdeployment/binary/network/network.go b/pkg/clusterdeployment/binary/network/network.go +index 0c35a9c..c88f28a 100644 +--- a/pkg/clusterdeployment/binary/network/network.go ++++ b/pkg/clusterdeployment/binary/network/network.go +@@ -20,6 +20,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/kubectl" +@@ -79,7 +80,7 @@ func SetupNetwork(cluster *api.ClusterConfig) error { + if err != nil { + return err + } +- err = nodemanager.WaitNodesFinish([]string{useMaster}, 5*time.Minute) ++ err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes) + if err != nil { + return err + } +@@ -133,7 +134,7 @@ func CleanupNetwork(cluster *api.ClusterConfig) error { + if err != nil { + return err + } +- err = nodemanager.WaitNodesFinish([]string{useMaster}, 5*time.Minute) ++ err = nodemanager.WaitNodesFinish([]string{useMaster}, time.Minute*constants.DefaultTaskWaitMinutes) + if err != nil { + return err + } +diff --git a/pkg/clusterdeployment/clusterdeploy.go b/pkg/clusterdeployment/clusterdeploy.go +index fde1fde..1ecf46f 100644 +--- a/pkg/clusterdeployment/clusterdeploy.go ++++ b/pkg/clusterdeployment/clusterdeploy.go +@@ -22,9 +22,11 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + _ "isula.org/eggo/pkg/clusterdeployment/binary" + "isula.org/eggo/pkg/clusterdeployment/manager" ++ "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" + "isula.org/eggo/pkg/utils/certs" + "isula.org/eggo/pkg/utils/nodemanager" +@@ -98,7 +100,8 @@ func doJoinNodeOfCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig + joinedNodeIDs = append(joinedNodeIDs, node.Address) + } + // wait all nodes ready +- if err := nodemanager.WaitNodesFinishWithProgress(joinedNodeIDs, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinishWithProgress(joinedNodeIDs, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + tFailedNodes, successNodes := nodemanager.CheckNodesStatus(joinedNodeIDs) + // update joined and failed nodes + failedNodes = append(failedNodes, tFailedNodes...) +@@ -149,7 +152,8 @@ func doCreateCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, cs + + // Step3: setup etcd cluster + // wait infrastructure task success on nodes of etcd cluster +- if err = nodemanager.WaitNodesFinishWithProgress(etcdNodes, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinishWithProgress(etcdNodes, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return nil, err + } + if err = handler.EtcdClusterSetup(); err != nil { +@@ -166,7 +170,8 @@ func doCreateCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, cs + return nil, err + } + // wait controlplane setup task success +- if err = nodemanager.WaitNodesFinish([]string{controlPlaneNode.Address}, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish([]string{controlPlaneNode.Address}, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return nil, err + } + if utils.IsType(controlPlaneNode.Type, api.Worker) { +@@ -195,7 +200,8 @@ func doCreateCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, cs + return nil, err + } + +- if err = nodemanager.WaitNodesFinishWithProgress(append(joinedNodeIDs, controlPlaneNode.Address), time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinishWithProgress(append(joinedNodeIDs, controlPlaneNode.Address), ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return nil, err + } + +@@ -229,7 +235,8 @@ func rollbackFailedNoeds(handler api.ClusterDeploymentAPI, nodes []*api.HostConf + rollIDs = append(rollIDs, n.Address) + } + +- if err := nodemanager.WaitNodesFinishWithProgress(rollIDs, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinishWithProgress(rollIDs, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("rollback failed: %v", err) + } + } +@@ -255,7 +262,7 @@ func CreateCluster(cc *api.ClusterConfig, deployEnableRollback bool) (api.Cluste + defer handler.Finish() + + // prepare eggo config directory +- if err := os.MkdirAll(api.GetClusterHomePath(cc.Name), 0750); err != nil { ++ if err = os.MkdirAll(api.GetClusterHomePath(cc.Name), constants.EggoHomeDirMode); err != nil { + return cstatus, err + } + +@@ -302,7 +309,8 @@ func doJoinNode(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, hostcon + } + + // wait infrastructure task success on node +- if err := nodemanager.WaitNodesFinish([]string{hostconfig.Address}, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinish([]string{hostconfig.Address}, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return err + } + +@@ -325,7 +333,8 @@ func doJoinNode(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, hostcon + } + + // wait node ready +- if err := nodemanager.WaitNodesFinishWithProgress([]string{hostconfig.Address}, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinishWithProgress([]string{hostconfig.Address}, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + return err + } + +@@ -471,7 +480,8 @@ func doDeleteNode(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig, h *ap + return err + } + +- if err := nodemanager.WaitNodesFinishWithProgress([]string{h.Address}, time.Minute*5); err != nil { ++ if err := nodemanager.WaitNodesFinishWithProgress([]string{h.Address}, ++ time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("wait cleanup finish failed: %v", err) + } + +@@ -511,7 +521,7 @@ func DeleteNodes(cc *api.ClusterConfig, hostconfigs []*api.HostConfig) error { + for _, h := range nodes { + go func(hostconfig *api.HostConfig) { + defer wg.Done() +- if err := doDeleteNode(handler, cc, hostconfig); err != nil { ++ if terr := doDeleteNode(handler, cc, hostconfig); terr != nil { + logrus.Errorf("[cluster] delete '%s' from cluster failed", hostconfig.Name) + return + } +@@ -522,7 +532,7 @@ func DeleteNodes(cc *api.ClusterConfig, hostconfigs []*api.HostConfig) error { + + // delete node with etcds + for _, h := range etcds { +- if err := doDeleteNode(handler, cc, h); err != nil { ++ if err = doDeleteNode(handler, cc, h); err != nil { + logrus.Errorf("[cluster] delete '%s' with etcd from cluster failed", h.Name) + return err + } +@@ -543,7 +553,7 @@ func doRemoveCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig) { + } + + allNodes := utils.GetAllIPs(cc.Nodes) +- if err = nodemanager.WaitNodesFinish(allNodes, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinish(allNodes, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("[cluster] wait cleanup addons failed: %v", err) + } + +@@ -603,7 +613,7 @@ func doRemoveCluster(handler api.ClusterDeploymentAPI, cc *api.ClusterConfig) { + } + } + +- if err = nodemanager.WaitNodesFinishWithProgress(allNodes, time.Minute*5); err != nil { ++ if err = nodemanager.WaitNodesFinishWithProgress(allNodes, time.Minute*constants.DefaultTaskWaitMinutes); err != nil { + logrus.Warnf("[cluster] wait all cleanup finish failed: %v", err) + } + } +diff --git a/pkg/clusterdeployment/runtime/runtime.go b/pkg/clusterdeployment/runtime/runtime.go +index e996dae..f8cc424 100644 +--- a/pkg/clusterdeployment/runtime/runtime.go ++++ b/pkg/clusterdeployment/runtime/runtime.go +@@ -6,6 +6,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/clusterdeployment/binary/commontools" + "isula.org/eggo/pkg/utils/dependency" +diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go +index c60d061..0ab75cc 100644 +--- a/pkg/constants/constants.go ++++ b/pkg/constants/constants.go +@@ -1,5 +1,7 @@ + package constants + ++import "os" ++ + const ( + // certificates relate constants + DefaultK8SRootDir = "/etc/kubernetes" +@@ -30,6 +32,14 @@ const ( + NetworkPluginArgKeyYamlPath = "NetworkYamlPath" + + MaxHookFileSize = int64(1 << 20) +- // 750: rwxr-x--- +- HookFileMode = uint32(0750) ++ ++ HookFileMode os.FileMode = 0750 ++ EggoHomeDirMode os.FileMode = 0750 ++ EggoDirMode os.FileMode = 0700 ++ DeployConfigFileMode os.FileMode = 0640 ++ ProcessFileMode os.FileMode = 0640 ++ EncryptionConfigFileMode os.FileMode = 0600 ++ ++ // default task wait time in minute ++ DefaultTaskWaitMinutes = 5 + ) +diff --git a/pkg/utils/certs/approvecsr.go b/pkg/utils/certs/approvecsr.go +index dfebbee..d4f81a4 100644 +--- a/pkg/utils/certs/approvecsr.go ++++ b/pkg/utils/certs/approvecsr.go +@@ -24,15 +24,16 @@ import ( + "time" + + "github.com/sirupsen/logrus" +- "isula.org/eggo/pkg/api" +- "isula.org/eggo/pkg/constants" +- "isula.org/eggo/pkg/utils/kubectl" + certificatesv1 "k8s.io/api/certificates/v1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/cert" ++ ++ "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" ++ "isula.org/eggo/pkg/utils/kubectl" + ) + + type ServingCSR interface { +@@ -309,7 +310,8 @@ func ApproveCsr(cluster string, workers []*api.HostConfig) error { + } + + // maybe the serving csr hasn't received +- time.Sleep(time.Duration(10) * time.Second) ++ const approvedIntervalSeconds = 3 ++ time.Sleep(time.Second * approvedIntervalSeconds) + } + + if !approved { +diff --git a/pkg/utils/certs/certs.go b/pkg/utils/certs/certs.go +index e57cfe8..0772679 100644 +--- a/pkg/utils/certs/certs.go ++++ b/pkg/utils/certs/certs.go +@@ -22,6 +22,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/template" + ) +diff --git a/pkg/utils/certs/localcerts.go b/pkg/utils/certs/localcerts.go +index d613ea9..c6b2fc1 100644 +--- a/pkg/utils/certs/localcerts.go ++++ b/pkg/utils/certs/localcerts.go +@@ -14,11 +14,16 @@ import ( + + "github.com/pkg/errors" + "github.com/sirupsen/logrus" +- "isula.org/eggo/pkg/utils/runner" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + certutil "k8s.io/client-go/util/cert" + keyutil "k8s.io/client-go/util/keyutil" ++ ++ "isula.org/eggo/pkg/utils/runner" ++) ++ ++const ( ++ certExpiryHour = 24 * 36500 + ) + + type LocalCertGenerator struct { +@@ -151,7 +156,7 @@ func (l *LocalCertGenerator) CreateCertAndKey(caCertPath, caKeyPath string, conf + KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment | x509.KeyUsageDataEncipherment, + ExtKeyUsage: config.Usages, + NotBefore: caCert.NotBefore, +- NotAfter: time.Now().Add(time.Hour * 24 * 36500).UTC(), ++ NotAfter: time.Now().Add(time.Hour * certExpiryHour).UTC(), + } + + certBytes, err := x509.CreateCertificate(rand.Reader, &certConf, caCert, signer.Public(), caKey) +diff --git a/pkg/utils/certs/tools.go b/pkg/utils/certs/tools.go +index 24cbc04..d18b7fd 100644 +--- a/pkg/utils/certs/tools.go ++++ b/pkg/utils/certs/tools.go +@@ -16,6 +16,10 @@ import ( + keyutil "k8s.io/client-go/util/keyutil" + ) + ++const ( ++ keyBits = 4096 ++) ++ + func GetCertName(name string) string { + return fmt.Sprintf("%s.crt", name) + } +@@ -29,7 +33,7 @@ func GetKeySigner(alg x509.PublicKeyAlgorithm) (crypto.Signer, error) { + return ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + } + +- return rsa.GenerateKey(rand.Reader, 4096) ++ return rsa.GenerateKey(rand.Reader, keyBits) + } + + func ParseIPsFromString(ipStrs []string) ([]net.IP, error) { +diff --git a/pkg/utils/dependency/cmdhooks.go b/pkg/utils/dependency/cmdhooks.go +index e6fd9af..b1f93ad 100644 +--- a/pkg/utils/dependency/cmdhooks.go ++++ b/pkg/utils/dependency/cmdhooks.go +@@ -20,6 +20,7 @@ import ( + "path" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" +@@ -75,7 +76,7 @@ func ExecuteCmdHooks(ccfg *api.ClusterConfig, nodes []*api.HostConfig, op api.Ho + func executeCmdHooks(ccfg *api.ClusterConfig, hooks *api.ClusterHookConf, hcf *api.HostConfig, shell []*api.PackageConfig) error { + hookConf := &api.HookRunConfig{ + ClusterID: ccfg.Name, +- ClusterApiEndpoint: ccfg.APIEndpoint.GetUrl(), ++ ClusterAPIEndpoint: ccfg.APIEndpoint.GetURL(), + ClusterConfigDir: ccfg.ConfigDir, + HookType: hooks.Type, + Operator: hooks.Operator, +diff --git a/pkg/utils/dependency/dependency.go b/pkg/utils/dependency/dependency.go +index 9b464dd..ce4a7ca 100644 +--- a/pkg/utils/dependency/dependency.go ++++ b/pkg/utils/dependency/dependency.go +@@ -20,6 +20,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/template" +diff --git a/pkg/utils/dependency/dependency_test.go b/pkg/utils/dependency/dependency_test.go +index 58ea756..c50a6fc 100644 +--- a/pkg/utils/dependency/dependency_test.go ++++ b/pkg/utils/dependency/dependency_test.go +@@ -4,6 +4,7 @@ import ( + "testing" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + ) + +diff --git a/pkg/utils/dependency/install.go b/pkg/utils/dependency/install.go +index 35c3521..62437b7 100644 +--- a/pkg/utils/dependency/install.go ++++ b/pkg/utils/dependency/install.go +@@ -22,6 +22,7 @@ import ( + "strings" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils" +@@ -176,9 +177,11 @@ func ExecuteHooks(hookConf *api.HookRunConfig) error { + srcPath: hookConf.HookDir, + shell: hookConf.Hooks, + } +- envs := make([]string, 9) ++ ++ const envsSize = 9 ++ envs := make([]string, envsSize) + envs[0] = fmt.Sprintf("EGGO_CLUSTER_ID=%s", hookConf.ClusterID) +- envs[1] = fmt.Sprintf("EGGO_CLUSTER_API_ENDPOINT=%s", hookConf.ClusterApiEndpoint) ++ envs[1] = fmt.Sprintf("EGGO_CLUSTER_API_ENDPOINT=%s", hookConf.ClusterAPIEndpoint) + envs[2] = fmt.Sprintf("EGGO_CLUSTER_CONFIG_DIR=%s", hookConf.ClusterConfigDir) + envs[3] = fmt.Sprintf("EGGO_NODE_IP=%s", hookConf.Node.Address) + envs[4] = fmt.Sprintf("EGGO_NODE_NAME=%s", hookConf.Node.Name) +@@ -220,7 +223,7 @@ func executeShell(ccfg *api.ClusterConfig, role uint16, hcf *api.HostConfig, sch + + hookConf := &api.HookRunConfig{ + ClusterID: ccfg.Name, +- ClusterApiEndpoint: ccfg.APIEndpoint.GetUrl(), ++ ClusterAPIEndpoint: ccfg.APIEndpoint.GetURL(), + ClusterConfigDir: ccfg.ConfigDir, + HookType: htype, + Operator: oper, +diff --git a/pkg/utils/endpoint/endpoint.go b/pkg/utils/endpoint/endpoint.go +index a2b82d3..17c4dcc 100644 +--- a/pkg/utils/endpoint/endpoint.go ++++ b/pkg/utils/endpoint/endpoint.go +@@ -27,13 +27,16 @@ import ( + ) + + const ( +- DefaultEndpointPort = 6443 ++ defaultEndpointPort = 6443 ++ ++ parseBase = 10 ++ parsebitSize = 16 + ) + + func GetEndpoint(advertiseAddr string, bindPort int) (string, error) { + if !ValidPort(bindPort) { +- bindPort = DefaultEndpointPort +- logrus.Warnf("ignore invalid bindport: %d, use default: %d", bindPort, DefaultEndpointPort) ++ bindPort = defaultEndpointPort ++ logrus.Warnf("ignore invalid bindport: %d, use default: %d", bindPort, defaultEndpointPort) + } + + if ip := net.ParseIP(advertiseAddr); ip == nil { +@@ -52,7 +55,7 @@ func ValidPort(port int) bool { + } + + func ParsePort(port string) (int, error) { +- tport, err := strconv.ParseUint(port, 10, 16) ++ tport, err := strconv.ParseUint(port, parseBase, parsebitSize) + if err != nil { + return 0, err + } +@@ -77,7 +80,7 @@ func GetAPIServerEndpoint(ccfg *api.ClusterConfig) (string, error) { + return "", fmt.Errorf("invalid host") + } + if sport == "" { +- sport = strconv.Itoa(DefaultEndpointPort) ++ sport = strconv.Itoa(defaultEndpointPort) + } + + port, err := ParsePort(sport) +diff --git a/pkg/utils/infra/infra.go b/pkg/utils/infra/infra.go +index 2b36e2a..0addf5d 100644 +--- a/pkg/utils/infra/infra.go ++++ b/pkg/utils/infra/infra.go +@@ -110,7 +110,7 @@ var ( + } + + // coredns +- DnsPackages = []*api.PackageConfig{ ++ DNSPackages = []*api.PackageConfig{ + { + Name: "coredns", + Type: "repo", +diff --git a/pkg/utils/kubectl/kubectl.go b/pkg/utils/kubectl/kubectl.go +index b299a2a..057815a 100644 +--- a/pkg/utils/kubectl/kubectl.go ++++ b/pkg/utils/kubectl/kubectl.go +@@ -22,13 +22,14 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ++ "k8s.io/client-go/kubernetes" ++ "k8s.io/client-go/tools/clientcmd" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/constants" + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/template" +- v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +- "k8s.io/client-go/kubernetes" +- "k8s.io/client-go/tools/clientcmd" + ) + + var ops map[string]string +@@ -109,7 +110,8 @@ func WaitNodeRegister(name string, cluster string) error { + return err + } + +- finish := time.After(time.Second * 120) ++ const timeout = 120 ++ finish := time.After(time.Second * timeout) + for { + select { + case t := <-finish: +diff --git a/pkg/utils/kubectl/taint.go b/pkg/utils/kubectl/taint.go +index a6af75b..fc9521e 100644 +--- a/pkg/utils/kubectl/taint.go ++++ b/pkg/utils/kubectl/taint.go +@@ -6,12 +6,13 @@ import ( + "path/filepath" + + "github.com/sirupsen/logrus" +- "isula.org/eggo/pkg/api" +- "isula.org/eggo/pkg/constants" + k8scorev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/strategicpatch" ++ ++ "isula.org/eggo/pkg/api" ++ "isula.org/eggo/pkg/constants" + ) + + type Taint struct { +diff --git a/pkg/utils/nodemanager/node.go b/pkg/utils/nodemanager/node.go +index 08af098..5474719 100644 +--- a/pkg/utils/nodemanager/node.go ++++ b/pkg/utils/nodemanager/node.go +@@ -22,18 +22,26 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/task" + ) + + const ( ++ // status + WorkingStatus = iota + FinishStatus + IgnoreStatus + ErrorStatus + ) + ++const ( ++ nodeQueueCapability = 16 ++ runTaskTimeOutSecond = 300 ++ waitTaskMillisecond = 200 ++) ++ + type NodeStatus struct { + Status int + Message string +@@ -115,7 +123,7 @@ func (n *Node) WaitNodeTasksFinish(timeout time.Duration) error { + msg := s.Message + n.lock.RUnlock() + if !s.TasksFinished() { +- time.Sleep(time.Millisecond * 200) ++ time.Sleep(time.Millisecond * waitTaskMillisecond) + continue + } + if s.HasError() { +@@ -177,7 +185,7 @@ func doRunTask(n *Node, t task.Task) { + go func(ec chan error) { + select { + // TODO: maybe we need get timeout from task +- case <-time.After(time.Second * 300): ++ case <-time.After(time.Second * runTaskTimeOutSecond): + ec <- fmt.Errorf("timeout to run task") + case ec <- t.Run(n.r, n.host): + } +@@ -212,7 +220,7 @@ func NewNode(hcf *api.HostConfig, r runner.Runner) (*Node, error) { + host: hcf, + r: r, + stop: make(chan bool), +- queue: make(chan task.Task, 16), ++ queue: make(chan task.Task, nodeQueueCapability), + } + + go func(n *Node) { +diff --git a/pkg/utils/nodemanager/nodemanager.go b/pkg/utils/nodemanager/nodemanager.go +index 5fff50e..b3a80e7 100644 +--- a/pkg/utils/nodemanager/nodemanager.go ++++ b/pkg/utils/nodemanager/nodemanager.go +@@ -22,6 +22,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/task" +@@ -148,6 +149,8 @@ func RunTaskOnAll(t task.Task) error { + } + + func RunTasksOnNode(tasks []task.Task, node string) error { ++ const pushTaskInterval = 6 ++ + manager.lock.Lock() + defer manager.lock.Unlock() + +@@ -158,7 +161,7 @@ func RunTasksOnNode(tasks []task.Task, node string) error { + if n.PushTask(t) { + break + } +- time.Sleep(time.Second * 6) ++ time.Sleep(time.Second * pushTaskInterval) + } + if i == 5 { + logrus.Errorf("node: %s work with too much tasks, will retry it", node) +diff --git a/pkg/utils/nodemanager/nodemanager_test.go b/pkg/utils/nodemanager/nodemanager_test.go +index 52ad91c..cbd46db 100644 +--- a/pkg/utils/nodemanager/nodemanager_test.go ++++ b/pkg/utils/nodemanager/nodemanager_test.go +@@ -22,6 +22,7 @@ import ( + "time" + + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + "isula.org/eggo/pkg/utils/runner" + "isula.org/eggo/pkg/utils/task" +diff --git a/pkg/utils/runner/runner.go b/pkg/utils/runner/runner.go +index 09c9e1d..7b54730 100644 +--- a/pkg/utils/runner/runner.go ++++ b/pkg/utils/runner/runner.go +@@ -29,6 +29,7 @@ import ( + kkv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" + "github.com/kubesphere/kubekey/pkg/util/ssh" + "github.com/sirupsen/logrus" ++ + "isula.org/eggo/pkg/api" + ) + +-- +2.25.1 + diff --git a/0024-modify-dependency-install-command.patch b/0024-modify-dependency-install-command.patch new file mode 100644 index 0000000..cff1b89 --- /dev/null +++ b/0024-modify-dependency-install-command.patch @@ -0,0 +1,35 @@ +From c9dae67531cf99d97a3130b5b2e2fb04636370a3 Mon Sep 17 00:00:00 2001 +From: zhangxiaoyu +Date: Wed, 8 Jun 2022 15:42:00 +0800 +Subject: [PATCH 24/24] modify dependency install command + +Signed-off-by: zhangxiaoyu +--- + pkg/utils/dependency/dependency.go | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pkg/utils/dependency/dependency.go b/pkg/utils/dependency/dependency.go +index ce4a7ca..3250579 100644 +--- a/pkg/utils/dependency/dependency.go ++++ b/pkg/utils/dependency/dependency.go +@@ -163,7 +163,7 @@ func (dp *dependencyPkg) Install(r runner.Runner) error { + join += s.Name + "* " + } + +- if _, err := r.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && %s %s", ++ if _, err := r.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && %s %s\"", + dp.srcPath, pManager.installCommand, join)); err != nil { + return fmt.Errorf("%s failed: %v", pManager.installCommand, err) + } +@@ -186,7 +186,7 @@ func (dp *dependencyPkg) Remove(r runner.Runner) error { + join += s.Name + "* " + } + +- if _, err := r.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && %s %s", ++ if _, err := r.RunCommand(fmt.Sprintf("sudo -E /bin/sh -c \"cd %s && %s %s\"", + dp.srcPath, pManager.removeCommand, join)); err != nil { + return fmt.Errorf("%s remove failed: %v", pManager.removeCommand, err) + } +-- +2.25.1 + diff --git a/eggo.spec b/eggo.spec index 691c700..9bec71c 100644 --- a/eggo.spec +++ b/eggo.spec @@ -1,6 +1,6 @@ Name: eggo Version: 0.9.4 -Release: 6 +Release: 7 Summary: Eggo is a tool built to provide standard multi-ways for creating Kubernetes clusters. License: Mulan PSL V2 URL: https://gitee.com/openeuler/eggo @@ -23,6 +23,13 @@ Patch0014: 0014-refactor-dependency.patch Patch0015: 0015-delete-apiserver-kubelet-https-flag-and-add-lb-bind-.patch Patch0016: 0016-add-vendor-LICENSE.patch Patch0017: 0017-fix-Makefile-build-error.patch +Patch0018: 0018-implement-cmd-hooks.patch +Patch0019: 0019-add-design-of-eggoadm.patch +Patch0020: 0020-add-digitalSignature-for-certificates.patch +Patch0021: 0021-gitignore-style-global-ignore-IDE-and-gomod-vendor.patch +Patch0022: 0022-add-golangci-check.patch +Patch0023: 0023-add-golang-static-code-check.patch +Patch0024: 0024-modify-dependency-install-command.patch BuildRequires: make BuildRequires: git @@ -64,6 +71,12 @@ rm -rf src %attr(551,root,root) %{_bindir}/eggo %changelog +* Fri Feb 03 2023 zhangxiaoyu - 0.9.4-7 +- Type:bugfix +- CVE:NA +- SUG:NA +- DESC:update from openeuler + * Mon Nov 28 2022 zhangxiaoyu - 0.9.4-6 - Type:bugfix - CVE:NA