From bef5cd49cd458f86ee8ed50d206b90d3b19ee436 Mon Sep 17 00:00:00 2001 From: flyingalex Date: Sun, 23 Feb 2020 20:33:57 +0800 Subject: [PATCH] add Base Class feature --- .DS_Store | Bin 10244 -> 10244 bytes CMakeLists.txt | 22 ++- CMakeLists.txt.user | 356 ------------------------------------------- Interpreter.cpp | 23 ++- Interpreter.hpp | 1 + LoxClass.cpp | 31 ++++ LoxClass.hpp | 28 ++++ LoxInstance.cpp | 14 ++ LoxInstance.hpp | 18 +++ Makefile | 13 +- Parser.cpp | 14 ++ Parser.hpp | 1 + Resolver.cpp | 5 + Resolver.hpp | 1 + Stmt.hpp | 18 ++- Token.hpp | 8 + cpp_lox.creator.user | 215 -------------------------- cpp_lox.files | 4 + test | Bin 222204 -> 0 bytes test.lox | 12 +- token.cpp | 28 +++- 21 files changed, 208 insertions(+), 604 deletions(-) delete mode 100644 CMakeLists.txt.user create mode 100644 LoxClass.cpp create mode 100644 LoxClass.hpp create mode 100644 LoxInstance.cpp create mode 100644 LoxInstance.hpp delete mode 100644 cpp_lox.creator.user delete mode 100755 test diff --git a/.DS_Store b/.DS_Store index 47c1ed6138ec63e3b26db6c135e31e775438d968..52afa975327d0ebde584be1196e6a74c41759d1b 100644 GIT binary patch delta 32 ocmZn(XbG6$F8U^hRb&So9~b - - - - - EnvironmentId - {a792350e-130b-4b17-9442-9f782b4e3dc6} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - true - - true - Builtin.TidyAndClazy - 2 - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop (x86-darwin-generic-mach_o-64bit) - Desktop (x86-darwin-generic-mach_o-64bit) - {1dc348e8-307a-4675-a7df-a40c9c375037} - 0 - 0 - 0 - - - CMAKE_BUILD_TYPE:STRING=Debug - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /Users/tiger/Documents/learning/cplusplus/build-cpp_lox-Desktop_x86_darwin_generic_mach_o_64bit-Debug - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Release - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /Users/tiger/Documents/learning/cplusplus/build-cpp_lox-Desktop_x86_darwin_generic_mach_o_64bit-Release - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=RelWithDebInfo - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /Users/tiger/Documents/learning/cplusplus/build-cpp_lox-Desktop_x86_darwin_generic_mach_o_64bit-RelWithDebInfo - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=MinSizeRel - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /Users/tiger/Documents/learning/cplusplus/build-cpp_lox-Desktop_x86_darwin_generic_mach_o_64bit-MinSizeRel - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 4 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F - true - 4096 - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - cpp_lox - CMakeProjectManager.CMakeRunConfiguration.cpp_lox - cpp_lox - - false - - false - true - false - true - false - false - true - - /private/var/folders/tw/ss12ypqj7dj84rk07_x7pzmw0000gp/T/QtCreator-nklAxp/qtc-cmake-popfLRfM - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/Interpreter.cpp b/Interpreter.cpp index e7cb778..f8798c5 100644 --- a/Interpreter.cpp +++ b/Interpreter.cpp @@ -15,6 +15,7 @@ #include "./LoxCallable.hpp" #include "./LoxFunction.hpp" #include "./ReturnError.hpp" +#include "./LoxClass.hpp" #include "./lox.hpp" using std::stod; @@ -184,18 +185,24 @@ Object Interpreter::visitCallExpr(shared_ptr> expr) { arguments.push_back(evaluate(argument)); } - if (callee.type != Object::Object_fun) { + if (callee.type != Object::Object_fun && callee.type != Object::Object_class) { throw RuntimeError(expr->paren, "Can only call functions and classes."); } - shared_ptr function = callee.function; - if (arguments.size() != function->arity()) { + shared_ptr callable; + if (callee.type == Object::Object_fun) { + callable = callee.function; + } + if (callee.type == Object::Object_class) { + callable = callee.lox_class; + } + if (arguments.size() != callable->arity()) { throw RuntimeError(expr->paren, "Expected " + - to_string(function->arity()) + " arguments but got " + + to_string(callable->arity()) + " arguments but got " + to_string(arguments.size()) + "."); } - return function->call(shared_from_this(), arguments); + return callable->call(shared_from_this(), arguments); } void Interpreter::visitExpressionStmt(const Expression& stmt) { @@ -226,6 +233,12 @@ void Interpreter::visitBlockStmt(const Block& stmt) { executeBlock(stmt.statements, env); } +void Interpreter::visitClassStmt(const Class& stmt) { + environment->define(stmt.name.lexeme, Object::make_nil_obj()); + auto klass = shared_ptr(new LoxClass(stmt.name.lexeme)); + environment->assign(stmt.name, Object::make_class_obj(klass)); +} + void Interpreter::visitWhileStmt(const While& stmt) { while (isTruthy(evaluate(stmt.condition))) { Object obj = evaluate(stmt.condition); diff --git a/Interpreter.hpp b/Interpreter.hpp index dba77b1..a282aee 100644 --- a/Interpreter.hpp +++ b/Interpreter.hpp @@ -38,6 +38,7 @@ class Interpreter: void visitPrintStmt(const Print& stmt); void visitVarStmt(const Var& stmt); void visitBlockStmt(const Block& stmt); + void visitClassStmt(const Class& stmt); void visitIfStmt(const If& stmt); void visitWhileStmt(const While& stmt); void visitFunctionStmt(const Function& stmt); diff --git a/LoxClass.cpp b/LoxClass.cpp new file mode 100644 index 0000000..604ce2d --- /dev/null +++ b/LoxClass.cpp @@ -0,0 +1,31 @@ +// Copyright 2020.2.23 + +#include +#include +#include + +#include "./LoxClass.hpp" +#include "./LoxInstance.hpp" +#include "./Interpreter.hpp" +#include "./Token.hpp" + +using std::string; +using std::shared_ptr; +using std::vector; + + +LoxClass::LoxClass(string name_): name(name_) {} + +Object LoxClass::call( + shared_ptr interpreter, + vector arguments) { + auto instance = shared_ptr(new LoxInstance(*this)); + return Object::make_instance_obj(instance); +} + +int LoxClass::arity() { + return 0; +} +string LoxClass::toString() { + return name; +} diff --git a/LoxClass.hpp b/LoxClass.hpp new file mode 100644 index 0000000..9dfa1bc --- /dev/null +++ b/LoxClass.hpp @@ -0,0 +1,28 @@ +// Copyright 2020.2.23 + +#ifndef LOXCLASS_HPP_ +#define LOXCLASS_HPP_ + +#include +#include +#include +#include "./LoxCallable.hpp" +#include "./Interpreter.hpp" +#include "./Token.hpp" + +using std::string; +using std::shared_ptr; +using std::vector; + +class LoxClass: public LoxCallable { + public: + string name; + explicit LoxClass(string name_); + Object call( + shared_ptr interpreter, + vector arguments); + int arity(); + string toString(); +}; + +#endif // LOXCLASS_HPP_ diff --git a/LoxInstance.cpp b/LoxInstance.cpp new file mode 100644 index 0000000..c2e0d07 --- /dev/null +++ b/LoxInstance.cpp @@ -0,0 +1,14 @@ +// Copyright 2020.2.23 + +#include + +#include "./LoxInstance.hpp" +#include "./LoxClass.hpp" + +using std::string; + +LoxInstance::LoxInstance(LoxClass klass_): klass(klass_) {} + +string LoxInstance::toString() { + return klass.name + " instance"; +} diff --git a/LoxInstance.hpp b/LoxInstance.hpp new file mode 100644 index 0000000..749dcc6 --- /dev/null +++ b/LoxInstance.hpp @@ -0,0 +1,18 @@ +// Copyright 2020.2.23 + +#ifndef LOXINSTANCE_HPP_ +#define LOXINSTANCE_HPP_ + +#include +#include "./LoxClass.hpp" + +using std::string; + +class LoxInstance { + public: + LoxClass klass; + explicit LoxInstance(LoxClass klass_); + string toString(); +}; + +#endif // LOXINSTANCE_HPP_ diff --git a/Makefile b/Makefile index 7bafd9b..081b0e2 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,20 @@ CXXFLAGS=-g -std=c++11 -Wall -pedantic CXX = g++ -all: main test demo +all: main +LoxInstance.o: LoxInstance.cpp LoxInstance.hpp +LoxClass.o: LoxClass.cpp LoxClass.hpp Resolver.o: Resolver.cpp Resolver.hpp Token.o: Token.cpp Token.hpp LoxFunction.o: LoxFunction.cpp LoxFunction.hpp Environment.o: Environment.cpp Environment.hpp -Interpreter.o: Interpreter.cpp Interpreter.hpp Environment.o LoxFunction.o -lox.o: lox.cpp lox.hpp Interpreter.o Resolver.o +Interpreter.o: Interpreter.cpp Interpreter.hpp +lox.o: lox.cpp lox.hpp Parser.o: Parser.cpp Parser.hpp Scanner.o: Scanner.cpp Scanner.hpp -AstPrinter.o: AstPrinter.hpp AstPrinter.cpp -main: main.cpp lox.o LoxFunction.o Token.o Scanner.o Parser.o Interpreter.o Environment.o Resolver.o -test: test.cpp AstPrinter.o Token.o -demo: demo.cpp +main: main.cpp lox.o LoxFunction.o Token.o Scanner.o Parser.o Interpreter.o Environment.o Resolver.o LoxClass.o LoxInstance.o clean: rm -f *.o main \ No newline at end of file diff --git a/Parser.cpp b/Parser.cpp index 520c995..083e512 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -423,6 +423,7 @@ shared_ptr Parser::varDeclaration() { shared_ptr Parser::declaration() { try { + if (match({ CLASS })) return classDeclaration(); if (match({ FUN })) return function("function"); if (match({ VAR })) return varDeclaration(); return statement(); @@ -432,6 +433,19 @@ shared_ptr Parser::declaration() { } } +shared_ptr Parser::classDeclaration() { + Token name = consume(IDENTIFIER, "Expect class name."); + consume(LEFT_BRACE, "Expect '{' before class body."); + + vector> methods; + while (!check(RIGHT_BRACE) && !isAtEnd()) { + methods.push_back(function("method")); + } + consume(RIGHT_BRACE, "Expect '}' after class body."); + + return shared_ptr(new Class(name, methods)); +} + vector> Parser::parse() { vector> statements; while (!isAtEnd()) { diff --git a/Parser.hpp b/Parser.hpp index 19d179d..8e9d800 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -56,6 +56,7 @@ class Parser { shared_ptr expressionStatement(); shared_ptr function(string kind); shared_ptr declaration(); + shared_ptr classDeclaration(); shared_ptr varDeclaration(); vector> block(); }; diff --git a/Resolver.cpp b/Resolver.cpp index 48f37c2..2bf4222 100644 --- a/Resolver.cpp +++ b/Resolver.cpp @@ -95,6 +95,11 @@ void Resolver::visitBlockStmt(const Block& stmt) { endScope(); } +void Resolver::visitClassStmt(const Class& stmt) { + declare(stmt.name); + define(stmt.name); +} + void Resolver::visitIfStmt(const If& stmt) { resolve(stmt.condition); resolve(stmt.thenBranch); diff --git a/Resolver.hpp b/Resolver.hpp index af25f90..02de04b 100644 --- a/Resolver.hpp +++ b/Resolver.hpp @@ -37,6 +37,7 @@ class Resolver: void visitPrintStmt(const Print& stmt); void visitVarStmt(const Var& stmt); void visitBlockStmt(const Block& stmt); + void visitClassStmt(const Class& stmt); void visitIfStmt(const If& stmt); void visitWhileStmt(const While& stmt); void visitFunctionStmt(const Function& stmt); diff --git a/Stmt.hpp b/Stmt.hpp index ec96dff..2f4d3ec 100644 --- a/Stmt.hpp +++ b/Stmt.hpp @@ -3,10 +3,13 @@ /* program → declaration* EOF ; -declaration → funDecl +declaration → classDecl + |funDecl | varDecl | statement ; +classDecl → "class" IDENTIFIER "{" function* "}" ; + funDecl → "fun" function ; function → IDENTIFIER "(" parameters? ")" block ; parameters → IDENTIFIER ( "," IDENTIFIER )* ; @@ -59,6 +62,7 @@ class If; class While; class Function; class Return; +class Class; class Visitor_Stmt { public: @@ -71,6 +75,7 @@ class Visitor_Stmt { virtual void visitWhileStmt(const While& stmt) = 0; virtual void visitFunctionStmt(const Function& stmt) = 0; virtual void visitReturnStmt(const Return& stmt) = 0; + virtual void visitClassStmt(const Class& stmt) = 0; }; class Stmt { @@ -181,4 +186,15 @@ class Return: public Stmt { shared_ptr> value; }; +class Class: public Stmt { + public: + Class(Token name_, vector> function_): + name(name_), function(function_) { } + void accept(shared_ptr visitor) override { + visitor->visitClassStmt(*this); + } + Token name; + vector> function; +}; + #endif // STMT_HPP_ diff --git a/Token.hpp b/Token.hpp index f34dded..ff5e174 100644 --- a/Token.hpp +++ b/Token.hpp @@ -10,6 +10,8 @@ using std::string; using std::shared_ptr; class LoxCallable; +class LoxInstance; +class LoxClass; typedef enum { LEFT_PAREN, RIGHT_PAREN, LEFT_BRACE, RIGHT_BRACE, @@ -39,6 +41,8 @@ class Object { Object_bool, Object_nil, Object_fun, + Object_instance, + Object_class, } Object_type; string str; double num; @@ -47,11 +51,15 @@ class Object { Object_type type; string toString(); shared_ptr function; + shared_ptr instance; + shared_ptr lox_class; static Object make_num_obj(double num); static Object make_str_obj(string str); static Object make_bool_obj(bool boolean); static Object make_nil_obj(); static Object make_fun_obj(shared_ptr function_); + static Object make_instance_obj(shared_ptr instance_); + static Object make_class_obj(shared_ptr lox_class_); }; class Token { diff --git a/cpp_lox.creator.user b/cpp_lox.creator.user deleted file mode 100644 index 0f6d990..0000000 --- a/cpp_lox.creator.user +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - EnvironmentId - {a792350e-130b-4b17-9442-9f782b4e3dc6} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - true - - - - ProjectExplorer.Project.Target.0 - - Desktop (x86-darwin-generic-mach_o-32bit) - Desktop (x86-darwin-generic-mach_o-32bit) - {f6611be0-def4-4474-824d-587e399e46ac} - 0 - 0 - 0 - - /Users/tiger/Documents/learning/cplusplus/cpp_lox - - - - all - - false - - - false - true - GenericProjectManager.GenericMakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - clean - - true - - - false - true - GenericProjectManager.GenericMakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Default - GenericProjectManager.GenericBuildConfiguration - - 1 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F - true - 4096 - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - /Users/tiger/Documents/learning/cplusplus/cpp_lox/main - ProjectExplorer.CustomExecutableRunConfiguration - - test.lox - false - - false - true - false - false - true - /Users/tiger/Documents/learning/cplusplus/cpp_lox - - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/cpp_lox.files b/cpp_lox.files index 184e433..00e22e8 100644 --- a/cpp_lox.files +++ b/cpp_lox.files @@ -14,6 +14,10 @@ LoxFunction.cpp LoxFunction.hpp Resolver.hpp Resolver.cpp +LoxClass.cpp +LoxClass.hpp +LoxInstance.cpp +LoxInstance.hpp Scanner.cpp Scanner.hpp Stmt.hpp diff --git a/test b/test deleted file mode 100755 index 6dc42884dae7f208cabbe1edabdfca277e48a115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222204 zcmeEv37lM2mHw+Nkg#>JNrtsRkX@=nHV8@uQqUnJ6eM9)sym%d(vYP|cS8UJ1xYYX z+uABiaHB^Zjmt3YfCZ)j@Cw$v?*rZ?#UNpBJgkU!#z^yGHw zn9bHVx2$Shu|)4g(_8uxNpGcw6Z^kt+DLEZiso{GMALgt(`(a2h)VN|% zwsFN`>JUw@_M@U-mnuRW)yYqveiyoQX3m&DBYXZObLWZobxArwTw?>fpJJMm|Cu&# zWwT3GmUBrwbb41JuKRTfUr|8+m|_6u!FH=m@5(OGZ?kfUwTSgj<*72CURZY|pTO=n zL_T>xn_X6yZN7Q=!j;RiO)aZ5pF(j*O|M)1HvsnaVm+PVMbBmz)wR@>Z;0K>xcdvD z-#EQR?59_bDOb#=v_}`unmao^bC#555aczV-Rcd%{QczhoWpL*`kcl}}c zIj7w@{x6BIFIsWyMBGc@Ke7-6RZtNBc`dd)Xw)gVMz%`7laPO=Q$YLZ|0tJsVVJYr z-U%cTE9(M%>Q6oOt<`UZQjH6pp40sJK@3)_j6d(@=9Y%#Z#_>bh#drP!GG%0{ZbGl zAn0Vpy|AzO0&ea3?Xkcf3+%DL9t-TTz#a?ivA`Y+?6JTe3+%DL9t-TTz#a?y4_IJ9 zP1`SP)^3m2w5=IvYkj$&tCZYu5IRtLd10!d+M<;e5Sj?Njl0KDoHlk6+W) zS|p*Sy|oygkChUQ^wz3l);ZOyjtTtu<@Ce#J9q9J9D8Qq#UDWOOnRVZ?bdNMZRuk8 z_8dgCr;AFgI>zGPu|0{kke>8kC>0rTigmR1)wJ!XX?r*cS>elAgQ)3f&C9Kmc#CV| zHSJp%T+{xryLA9=VS$2C(_r`1w5?At>Q+YGxec)iYudJk_wY{J`U!waShEqS5Qp2! zsZ0)GiJFczx$wzX{g@rCxp2$vE{S+4iT3rp?g_BEBb<4R(Xplvif;^$8#73^ag=sS zNjF03Ho&~Ltq)2GcWhb8p!SD(D?Hg#Z;gcXNU$IZz5~U(f6IWKH|q zy59}w=()`aE0!X3OuiDD!c@E!p2q98^sMrq%|Tj6JT-L}5B94zwwxTfSYP=OW-UuD#e zH5-2&tZjfaCnmKgVc9c%G*#Oi?~&Ab)>Z~JoF%nZY|VIPgbpaC-Q)thq%%AH7-(y zZ*sv4P^F#=KZGU7ns!{b-@t(|91RX)_k~|UMxku-oljbm^=aMx~KIIgDs+?taI zY99Co7es4z>_i*qHD4*OJ+l03dsly)6U|1^BUt=Q*zriujrEW2+fq%<Kdiga;w~Q2pVS}1 zb0wbVFJ*iEb1BT1R|NjM3^Cws5&^KKO4YcJ#gU8ktcI!#e zwPC+}yrw5zbk`lI0p<(n?wyUUKmu~Y=PTQ zvYdmUq)#B5C5`^_WOvQ3t0#0rtwH_Q;QCydzUxZhP|vu=AB{}UUPv=={h_!|NkxDD z#x`q6`wlJ-ktg;pgse|yZ>RRJD9uT71LtDfobBjyT##!|IYe0XpF4M!`h$#l51lVO zk!`rk1bXws%b*aRPH;U&MCjXUVm+=S(@yO7lqsa%@Q;5)KPd5f%keON=m}l_CGqm% zPf3z^`EtC?ES7dQ&K$-VzdULo+@|5wL^pgH%d#pV-U>>U0O;LTqvor%?&T`T| z)%Cg zzessFCB?e!RW&DXt9jt7GM@gEG=1ed9`z@*w{h#=pwP(rx555h(!ZvCYIx<~{E7Wp zAEW)xsU?FB*`7H4u8=sMeo5z#u72D2nw1k}#ELsT9agQIBqdh}KO;k|5J@2lqhYxJ zN%W8K#y(bPmWQhz{g0J~XLC^6GcfDn+{QHm3wp!a9opVldp1P-GR*jg`A6Q}cmjPn z>b|x|!^9VRO8Uj{rI(?s8-ZK-MD1zggV8k|lP>!j8`5ypfKBI}yGkYs;fG&AwJtR; zmY&GlMf(C<_-Z z-&~4U&W)vqv?BE{S>Z3}&$+zD`uz?hQ*Ij3_w=N<;}+`Df+F=Wjh6cn5xiF8(^Wzbluov)=;vDu&0batlyU zSRm2Xz}5F@REgc4>(DX3U*c}a>c{oG)+G(g?_m2SD*VX_vi`gtX``OE?S)h#wR=SA zp$bP4-0#II6KuXM zOTJ4Sj|}jRd>odB*(1jfquyuVmw}m;RcEcUe|#dxy2PKr3^4fP_DxJO5?8t z^efr824gtL0t32YjRCHN^%*Yi4qG3~{F1+hVV>Q#YYTRS$7AduWirK?uKkK}NEWL+ zkB_4#{t*)ZXNK~z z>sVbZStF%??j&?E8(tJ-S(6T4IkJoMKyep*YeB0w- z<;`F7oO0H%CdF#5Ul8Ka1`?eSck=~zi%&an>lvi5IsC9ocFyLSHqIt8zO}vfyX>!# z{xsC_BK*9@+JXwk!<2=oojxbm7N{?k%$5&XY`lRr8)&4hqVBujdc&Ce|hoLX&-xcBZXk`%{Q>wSLD&p_&fj|MTI`vR@Aib zUFqI7-u3)1Jc1qJF#U&)aisrsV*;$x%%d>p;o4K=p|w00dHy%rjg@Eiz2Pk}7rzhr z=;bI!)~Cpgqjdl`-v1!l9q3T&U^`Q{{ybSunR|woPS8HEQY%7F9PmI_eD@WQEezzQHTRBobe8Amr zWvfGXfy!w2*wVGn$$R89JK?B3wDVqWe8DCeE!GeGkP9$2#L$CvA3?JI zs-z2WYll4lTstkOTJIW7_*mE??LE@Pkn?^4XbY$HU+YpvjLXU~`ogpWNR$d;z^&NMYb1#63vMRpw%drUZ`&1ncZPM>M4UTzlm8CsFLRM{Yb9ZO^>$ zVaHE?e-%wXioNkM{XV<`iZhorSd6Y(H&s!XvFWI{{(Lb5G5^u-rBu87!jE$d?+u%K z!~Bb-^+^;P{f7T<8t0z3AnK6)J@t9cX&@?%Z2dS<_P0v^WL+w)F5382@{fXsAG-M; z8z{D|m}gC&5wBV|T})62=eTJSde!zz&{{tZ_rlqYr24|&g~+fj*|s9{&LsU`Dz)Y8 zl-saO`_&h)!Z~Dpmi}wPp#IA*?<4x1Sz#-`y(+hlrSZs`ZEV-u(>QTk+tv`Bv@>Bi zfjyA*9n%FMN6b9NA=qOQV*H^iimv%|F2B!=g=JkPnaKw3c&ljK?uM!}=?3l*Z()*0~2mm{YSq#b&th0a7@8 z&+`I%jHoqx+N7kl%>{m6z~=ssO95qQ(9-k81nU8K#qe`)b_&ojI7J)?&vvQ0xjLLl z`;&6~eUFdC-)E@!$S?Ba`g7#l9BYmBBI&^=BKno$58wXLzQaBbko=YEJI6nT zFwd&x1}E$ru_$|tSQ1^r)(~#MJi-ox+mFHRDf6%8%l3;d_IlS#cbOmBL;Ur6&L_&t zN%5idwf02ElgM+??RRl=bt%Y5`viMotnbDQu8CkB1?C`*7(>B>r5!7VRBcDRj#5XLgV z0|go5`0ZyL@vOYiC+T=<(oWAJUi~P=nLZSv|f=M#(ppt>?dQ` zFy$=9wLRBn^|JE5i0Oq_oDugcwO7zTV$XS4I2g`8cWlq0C@NHHn*&v_A}z(b8BeUK z#%A_y9Vq1vb|Z5-YuX+UPZN#uC|mrea^3FIjlcM~3iiPB%Q3jXPFW-Z))V14ve-hm zFUY(5ZLJ&NKe=!=7MsB6MBoMl<|yKY%Y+=xWgrD`&+Q#9W-Gx!c#i{Uh3|NZd133s z^U&k1JGS>CD4Jh928TMxGyCs3x$p)NhD@Qq?7)gkCvV8A;I?oy9>{Krb;mZWza6!? zYJG|+wqyJ5heR#*Jwi)@=+ z($A3Jmfi%7HX-@$@Kv!YoA&PT2Gn%XXo=J4Y}05QX&q}&cEep@2tynZab-!Sx?I}+uvBv>Y(bmdx(dT?cVVps5ei$q zl5rUt=x=Z#xbqIl5iRF7IX_A)IucXIKjBtMukj)d@ze0FH5(rT4#Hn?c^XevoYiDM zcN*RVkLp;{>Gs>>q6=2*45wo)TC8>n()Y^od#;~$V~8$jlXB8!hq=tJx42vF?iS1O zaS%4FXDWBQV@b!^v=+P}yq#*TT|EvH6PahBY)fY1gk~I+9_Z)uTbLBun+Xe2u?G6z z=7Ky6e)$r_C5io!4!SE-ZAVRZMTC<+Rk-6R`akQ4%?F#<4BC*ZeF3iNE*NrQWbnWb zrMKFeehF%=3B|;p;J$A+23pWt{Y@F3ZNh>ktR6n%!jJ-=WwkHZ6#hzXpgBn+S$UXs z8D_J{a)OQbT_U1WGXPVyxQv$Di)WF7g>DX~fV(v{E(Voiui$^x`V*M_!*Fn8(`{{Y zo`R~I!*{|R`rTBN=n`?3ZnT3T|uWeUPXRf z{}_gkyh-BVB^uld!%q|UFmIsZ-f;aT)Bhaf4q7i0`TqFg6DTZ+SMDCm{>b>0T@1he zJaUH?o;5$~s-zogV;mFduOt1PKL0|z;nJ7jvi44ESNMXk~CiLGyQ z(82ZNBb;7vQn%$}t6R@9y~^_w%9H%J@9j*DO8EHRl*VLmi-RJ_H2=s*Bswzk?*;{& zk6}Om_n@wO-igZ8ei2e&FS>S3ADsKGtbF1$2)xtnU_!N^f3NLf4)UDSU;q%_qZ$(|m6Dph zPDj^nAuQ;BPW0Ore)A{v0J_@VUT)M6GDG`wqEtSvNk+Yy=Sq`4nKcm{zYF| z4@O1SPCXiq+8*oGUM!u77Zi6dq=By0-*cmXwh zYVDe*P~}(z?dhl5(tqin&h)thWqNvB)mlD|!dsIV;q2@`)(>$Hst^J(K|dVN-mT;d zaBH8ch0jLX!zA*DJkiPVglUIMi_fO8MeP&x|QZvlqcoG_HgZ*0)}*I9f%A1 z4^g4W1hR={`EF<6zlcFl5hM19oBrXxPN!ktHz|)#nBNgRzq%EgRDER}Ut7Xn6MFQ$ zPvl;NM?WDR?e~r|{rR}qQ}#EqnXBjz%KEbXMf#8bDOOXjm86_xseH=uhppdUeH>gr zE6evVIN%WFOPjZ){qog2(ekzW&hg4MNDIw)e7O8gXZYGYhE^kczhfl%^Pk^Eo?qGe zm2(j*kBYVpwZOGE6P<6ht*UTQ>#vi}KiL+$CHq5Z2#(y^r^$X$c8^!sP1uZ8G3>;R zl38`FD-1s?Ml5Jg&ZZ4E)@@W_*e=1g;EyKCW*HT0{m(w_?Jw2xm8sA=3`nUQvgJC{ zfqsm0Q6y1+pg+1u@tWz=s_xNddC2-{Z9)6(@VkmNKeJESA5Z-@grRKRB*FQ3*?nz1 zI-Ea7`wRFG%55;;f1a>*O&CpBAinn~q)st#2Qui`+5IwCd`K_8GV_J30f9WIKxSau=UlY=ylY~R0a z=T5JE<}`o<#JHpa?+_*MP)WU~)Ze4N54r!Oifyfwd89o~Z0L0@GD`UP*oO3PUDtwY zcX#@?98lo-pHL&kUC}@I;}NN|c#aXyE)o6tOUk6Vaf6L1+;fle^XytT(F4}!*`4ee zclSK|RyQB8Y!3GSc7{jBTSK-_3*ZaUNO>g(+YjR}x83DAd4GkkX1OWR6Xo|O zpc(3h_*Y+8y*1)r(9G;b{~x+MwY{%sucPY)Zb4-P`@1>AaAP9O{_CAvv+%ddes8C1 zh5rw!U+H-t#=jU@qAH+{VG#0H@9#F_m(oj$j#H(*#&~p4`TFghn=hhK(SZ=`h#mrS zM?50vlmTpf-c4^Y7v=C^dh0;dJ$YD` z?bihps`DEjchmOi3kEjKdA@30sWtxA0DJ^92y2ad@2;7U``u1Nx;y=RX*BSl8-$}# z|A<82X3hMz@M_#C#hb|1jf3qLiI=x{`Ea4!*=&L~*RmxY5ejm z^pqFDSpD*l2kD~saJLf|zKL={!!DIb-HLabluhxgo;( z)o2eilDoEeLm8^z45jZ2p*)d7sgzGP$?uhP`9QSIm& z?QlZ2PyBx_Dl(e+)o6w}yx>axy2D*&Ir7A9RD15%6R8M*HVna#g&X0ytCn^ALcB~> zGL}pQozEiXtT+~_`rjfgO70nQGTB1#@^O8--e}1?|H00zZ+qDi}B%B^NAt$+larIOt(L>5O&ft-KaB! zL0OpS7qEiCYKDU9bF1;LZIk&IRyvNtOUejB(du|R(%sp3qe9**7mUN8z7_9?%HWIB zH54J7V(sGzC=IF4gy(N@Mz(pFEKG<0^{7@jwW!-duCqZ&#XiH~_?|!YhQ}hs@_57Y z&UzAEzbid!c4I7f^y^svyXN1K4}C18{katGI{3v9>k}g^U#kS}`xAUx!u56O1X zNaTaq+ZjdFi@6&QISwD`<8dvgee%Hi5#DwW-WU7}l5wG z7~crw%NJeYTfgcI(ziAJ928yCCy!dExp^Pjla4w0>hDS1jVS8QaIVYC`myXqy;gs$%>w*q`Fi2fl#% z?$V32A2#0b`vOnDvw{BZw&&tRJ9yIh%J{*7;PwcRvMR?IGp z<91Q@@5?l_Y@fmTk@QRX!FXN2Bd~VO_R&>qwPP%{&)JSG9X(@uX{Pq{cC0S8rMJ8F zNEj_)&l4^GOmAfUaXEi7pQml%FPP7t>hg$evR;g0R^58d-Q(~W4vj=%1IEO=%U?9V zQEdA9<#jOSN?Sjuyw+|{mCHlhgf_RII{b*#c;{AeNrJvqNJM+eh8rae*VjkyEbS{`SQ}B=om}18_51lJ;jyPQjeHM(%9BWFi1+i4=6!aK<4>q%0C z;e3`Qx)+z{s>fOp4SO_J;O>TWj~OBicOw4X>7J^`@{ogqcDuU@ZF7FY6vG!JwL+fg`C(o*;2yM1sL5#uGyBy!wcg?`vRJ#fvg4}uOG?9%tNGE^JzihuOJc%<< zdKCLbw_OgmHie&Zp1NQYUf>&t-mgzQu8XhqVxOY>K4DK<8dY>}9b8l7MifMVov)2ys+{|7f}P#|H-usjTzDGhaHt}EusxeP zYi|;53urWPS#?*el7}7Ko#s5se_r6XH(!?+D35ag=7D=Y==hbR2OH}zw|Xbw6i zZ$Tpl?F%8d9+lQMbkdGmKl!7G5Plbd`d}ZE{nA?f*6@ee#KW#h6!)9+l7FSV%!c6| zB)H)}rvS79EO#6;#!=2$TdUTMhpesXoq>Dm=c1tb;U;XiPSJz52Q#dFkc_vjgwOWf zW6=$BcHW&XZB<9DaZ@Rbg)TvT_0=nnf8)>(1%h#!8<(^e!}?w9r@v!+(UmtD_z!d1 z4!N~k<24=ouR>#n57BO_X>(sHzL+z)hilj#wtc6jy+f|xAHyiFWagc3{B%N<;><>F8j61K3wOnUUU%U(iHEOZuT4$I7B`HTBa&d(NSRH$N}?a{~VSaWrZdcj%J&7IvfJ()?Vw zxU^i|%WsDBs}61Jx4B5`^EidqIvX8&ExRDMn)0x_{Q|87fpCjUNL-q= z0u^bqOPVe%SL?f(^g9vVrO~sVo{oZqOFN(MkR9tCuKFNl=(LH9Tb%&MHkWqp2(RvP zBIwnO39sgjvR7|{^LEyB+?&D8umwTtyoatwPeRW`_@;2*Qh?-YHFI?zzl7B8=c-5v zZCf_F6LTe3>pO8Hd^e(NuJ|E%$rZ0qQ3INz<6+@5R~yLqCnvzMOSzIt`f!dscAob# zCUV6ai9y_d1Wk68#0NaU#Nv_;<3F_>-)V;EP!YEV5;3+>!7a7MbaftjO*6dGTyfluP40`*~c(wBZhX} ztb6vdkG_B7(sJ?5S-H66{(ypb>Xk?ep2`fDJazI3(kR1Wv16L!IjeutTGLa}eY9JP z;OspEnZ`vvoF*6D;pZqEFTaFOh!(UHT&f%CY46e5Hs?M4Cj+}a!J$$QLF5wVLW4{A zdAaBgFSCRjUBW1dMF<+^ec+@UPtL%u#PSFNqX;*WMq}-Ul^44aZ@~?YmQxBElKscC zK&3rD&|TZmva&tj_4wp_$Nu%>llQy)9{PSH!Th6WU9CL?wN}c*8=pMrKBzU~@kuA5 zyEH~TK6%Iqcpc-De@0yswL1=dGQljB$0sw&VQBDn;JF+!oC|;BE~HLfOZhrJS>>+b zYX2rNH-%5};=g5la-Att=PC2uKa`dErMreQDN|;uQwDzj9X#?JG(M5>FV{2NdUs?! z!<%1l93S?$>WPa^CaRIW@s9d*)xL-w`U7sA54_&+3VrZ21KWn&T&gETEr-c5LPlMw z=5=I6%jRF@{2oz?Rh}tR&%Q&%_w`we{eje`YMp-Z4%K?~xG+SI5LL!|9-jb( zt+BQNXnnEVnRJ-#== z_pb9-w)ar>8*K04=Eu&aL(Gqp74vClGFa(cJc(s5#et;TPl^oxD1fVhj@MV8&Ty|~7IdxsE%argS-Sj5`Zey#X7#xcgbm}(EMm^cP&=>dKII{C|P zKy&E5?u2T$2r)f>*tNZOReocyW0LN>P%PHH)#)ncBkf}sSR}d~r@U=g`WQ-n%`pD# zc6CH5*N}WpD$4#-f{lzYSG~K@K(h6`+r|T>W{ykv+L&@^tW>R>-_Hj=<_CB-$H&-p>~9) z(Is4du?q2^Tka|MFTazu#$EO=SQ%v77VgTvuD*HCukHD?`R`4TJJ^3Q!i@Ou8G2_| z{`+;8hvDC6`7p!ZsP|cPJ={GXqx*1OXP|v%`BZFApa?SGexk;aC{L`--3cZ@v&!Kl~U`mx5t zWDYY7$gXRfl;_s47Puc9Ev10nYBVVQScZ{19g}~C#y4b)erYw*h2K}jQxjan{1L=e zL#N*PstE`Xc=AT&Gz& z>`C!&#s$zN%~+`kh=mOmJFuZb`;Ab(PhVbiuIS&q{xNJvS3S6YDfh3p?mbj^3gaU7 zBT%h?vg?C-y-RRyNFWZ> zc(rV>VmL}fVY@LOTu1DcDCZaHVne3ue=v|nUPm*pJt;hEa(%02uhfBm)~zbR#a+7P z=e=e>q{qi{DBfC$$u!wdqZUpR8;0)hwV3G;x35&t#qc6w6_7rjpp?^(wAUS2*mTc~ zQ7C)~i(BfqhHF^5{7Z0r^>|%PfQ^#{(aAxvXfW;#wW%yGS@)* z7|mhPV-BR?uev?UhXwMEG%QKC=nW?#i*9Pk=?H3h+l-}{s;_h5M~2hC@PtUk5NpPqcu%&YOk%h}+tbmz#$ zws59gbcfUBVq-Xw7wv8pYKS$TtC3`R&FB0IbXo=Cqp?yJ7>QRp(*)F?!kkdA9W*cRkd4 zzUyCincjia1L>>@qquMi9+F@D9|hg#sdR?jqf|5;tO z^!%_Cf5`n7R$q`_*bbL6kFT6h=tKwdPJ}%5S0L9zy2i`ZYV6ZG@%`-Fa)?z?zo>6` z4Q}ot{qV;Of8+KOy;1Y?INIyM&BqY-MGYC0KeUCfX+0!5-g6jbEq@=RrsqPP8kO7I zQu#8!u3wNjqpatkkXF;d1~q>p)Zg=u|MvOpPI|q%Z>9gCVlz|LhoEl%jpnoXemL5j zNdGDG0d!)}i(}Q&Zegh1#1SFx-Gp-!s5d2WJ_+ZO+G~<+mn2zl!9@LKkG|F3AHXof z+BYd*zdzg6d|@d4WHE;pbZ@L+!oBu3x0-|30(7Mfvv#cHpk-qLxG~OO;~)55wrh{r z^AB=3X%9;NoGzlZLDR(r$Klrx2HD%~zY4=H{5?F^&^y1t`d%Z3MX)sT!4h~PY#?@7 ziN3##LfCEj9V@C8TyM<&#Qk0H9{GC?Y9MRhy!6nAd+sWqKDz(&KuCyqAggU(!3ibZdz8oV~sIOUf5i0~wj}jD596;U z-}>A85qI!>`v&%$73)Rrdv(qUYECEQDlWFEY>#NaBb?pj z`xb8gDK?DEkEH!#{9*b>v;piR2dDp9!Sa9pCGYo$mMncf7|P z?{mkE?)V{h{D?b#%pJSj@#F6JNq78|J8p8v&${F1-SHuJ?8fopj-$SS(~NmLPnd<# zN#|0oFZcfn#$LLdS3lv^mw1H_e(hXZ;MF!>jX|w(e}{1C@x1yn@A2<-^?#OE-{ck7 z4VE5>y4-&sulQB7{`c^Te{QP(PG0e&$o+g2z4U5c@jZ&A8+o;eSAD#?npgZY2K}6K zEuF)w3wU)aug>AsMqW+i)mM1MeK1R(<<-%=nu=L({~^4(gjf6Us)<(tukPm6E0}99 z{WPz(^9q>^`d{SL*LkmxS5NcmJG}Z4ub#ry&YiKz=U#=+QhqcRfA`qni?RLh9UHt5 zyByb#jym}BV}oZ$Wxj^%(e8Tmyl2M-pC0ovEQ8<95APov`_AJ&5{s4bn8cweg)V$d z{H*zvczm(~U%X#S1wMYCvnucrr#F@G&e#FLZ9#C`Tl2Bt^D#an6d9-NKgWx+Ux1P4 zQTwHXlh4xdsrxS~g+u2tm+W_a3Ga;U7hD4pI?rDU~I3{2giPJFT2AuaqsPS$G&eQmlxcd z-X8mI#XZQXKCYZL_2WFLJ$B`WQNhn+?^OK`+5a?49eEgRC+73bLGb2dvcY+0yL=uH z+z6DOM3;cjy?oWT<#xp*pK%L9vbrmY6;UgD!3P^-5WdlW21u2u|qyTD)?^fkgtsj zei`ea6c^{U=rr!s{pJNzQNBofzu>$eIB&oDU@n$-fKPDvun&w18slA~g4+&xXjJg= zSkr;PSDiEe?Ps5@sNtmM z##e`UJ^I!m)5PywydgaY-yfVpHB1UStVt82fsj5n0RKxin@i% z8nVqGH7v?5UbS+0wq+%rP_UhSOF`0sr`dk2CL6q2L!R?fymQ=IOD-U?w}x6 zi}_mNV8lNRIvs{|4u_6M1hFnWNRB7KKLPr_1?RUQy%TXC_D`M^#Cog2n;67`vvB_` z+=pFLZx3QcjJ0y9Al8ZcR5%akH1bvh*|Tu}BFLK!IkO=jc5liAvBYKIUlzo=VfW4} zfMNHpE0OM1$n#Z*cMZqXe|=rz^Tl_`Ile~Dy-jjvxkC|G?mV;Hd1kruoYMHUdd}$?4{O}- zmneJ2Go1WrCGOL3MrLL=cS*Qqe4F8M2;B4AV}U&u*kge`7T9BfJr>wwfjt)3V}U&u z*kge`7T9Bf|DzVz4{Ji4Kable=N#4_h!0X+m@oK9!&paR_*)bw^_)0P?k6sl^VxcT zrk>~O`AR)6)blbu->B!Dp6}N4J$f!AB;DXxIdk2KdVEa7H|d${P`uCeDW02-(D*au z9KTr3T%Te%*SmO*V;zR)&U(FnzMQ%4#`|B?^tql!%=Iju3unmrQ4Qa!=UzSkKRqLA z#qSq-|2KLb(DNuQk2mQ#q32WdT#?8gu*U*>EU?D{dn~ZW0(&g5#{zpSu*U*>EU?D{ zdn~ZW0wc7*fydQeGb1-<+@)_0YEM7!ir~OhHhVQTxl~VF*05qp%hGJas#Pmj&8$w} z7+kt4=+sc#M6)P+Q$yYL*`^kW;RjEuU)kD{u3${AZ@Iat0Xu0XHZIbT`Tmxia%!c} zs3MZy{LAN7C$ri5)vN0kHr`lWJr&o>>YAIgOh4PWV)4p!klPTejeo&u6p22uI-9+5 zdE*e2aTdM2O~}_N*XuU_asOYfDKeab^IFd09;T+2#+551?xJPbd(j+@>cVGMj)Uc{~<%+sxjV(84Z%hWOYB~=}ExLKxBJ5gfU6@_ixMC4@Hi^Y& zm-VgO)-=?vrs$@osr4(DH(?VKN+Mf5)!!JEy|J<3rdjp#CT6+y3BhOSrl-cmv#xAj zbtb%^zHUW!VMDfl<%$~{xIHV|vQl?dmC5r#pL}E8vet%lV|o&cD1F)Nc{8%XrOojQ z{ikHH{i;C}nTRqX#TBVjZP1>rkz@`Msd)8S+3fPVCQZ^ZJa1}t-n1-&CoOAeZk`30 zPG7vR+U0d}b{4{LNk?0?a%Bsh9F-s^J~CHLKIO)Sdf8Z(Jre?6kD`@&%$)}fc&n+d zan-EZ&<#1^&jrj&Q?+T>9hc>PI8QJ2gve&LDN>o!nc4M0PK`cvO!Edtop)w-xq6sJ zo|>K6U_18C$3?@ciKu&vR%REKZfBR)tysj3anvhw|s7G>$Uny^z zctmzt!{Qc{LQ7ps!>kO;Q(YyyV&$TSEPNKXZ=`i@oS&^s0g2P6va1@GEFF0gl{R7? zT_OwXmesAOZ^+gy#;!uNGtKb%-RgsatWfEV^OGrXg1Pf1Rrtvi^^?Zc=}YEKsg(S` zvwoqbFGgdQZMdPeZkbfV%XU%5D1A2It~}7}G`D0MQ5f7$$_nd<7EI^h&3QF2)UtG1 zlAWyN2FR2c7a@4w?CfQ;BhK@G!d|<|^xsL2Q4X%8SGCr+NReH1*=*+rO^prp4L3D5 zyB-L;c^RRF4gTbo)~00*vo5;CHR`x?QFhivY#^jNNVcwMyaAmH+H}`sM?Hp(2?fA6 zouj#CW>JGkaQleaKU@mG;csTsC4U#5Gn^fxeGGD5{l-}6lD|I-Nvkd$OI=IaH7J9c zj9s)(XlCGS_*c>B|F3LHCL&)A%bS+fp-a;Waec$h*}7Fr++gT+Rx)l2+_>A6fYbMZ_A-7+G{lqnYCM+ zH%m>koLSdRkEpCjf6D^ru#>NDB zYHq@$SZ~fkJ}#Sg0jw`>GJn<^__EKcqD;|Cs}v)C?MJ;}{;Wak1G%o!B7&P2&7b!M zDxB+7h3CE2_mouOkuFjM&A~xf3tF(^CJx;%YiMp=-Vk&K&EsVK=nYwrNH1TGNhoHZ zLGy%)WGAA*6(@C5KMW3+FJHN0mYcdWtYzsc)J%W<3KL|ca#BSqQ}`O%vWBx-F?w8# zF0h6EmCVZ8RM0%FBJ#AxmCa7rlqC%mW#>{(TjpP0NNhHVPp6UMS0?a(!}s7Gu}>)##Tp zv#|~X$2-e8UO_})c^In}%Ntist?CdwtsrzbVpn%QIXnVHp7wK$<91{%grYy6rk@+8e z()Sn&?r+(W_)p6Ibin_{rZ)1J@o84Wx?s$hBEK~{>NP$i2_CD0X9iElgHiB;T`U*9 z?#Crh#drIBVe`Rb#uVC^iy;^B@zsSlZprnF@Ux*7+5S6Lvp;|E#OnV|&mThAx%j>q ze5UgQ?zoZ197b$o#&mt0$HHfL?8et=alM7d{5N>)?BTKZX?Nt8X+}+M;+IqK2t+=Y zlGI^5AD2u@uWsT)6MQkHa>V-@zM_J~nx7p~9sB}cck22Xlg5_ zpxDo2;dead|H!;dYgswZeTfI-{Z}Sb2Y*4_?)P9qF>2!Sy6YRV!H50<1AJU8T)A>t zcICqB(hGwvhXgJiHf^3tdorJ%Ra#)hvU;h6-oJCUtN9i%GKQQz>ogGeZPrW zO6zhLeNpg*!y84d8-phgN7mju3R%l_^4R%)9*gdn$5)d$xB2+~j9I z_QnjGkr8^kPN*7#4<1?l-;wMCMswz7(Fle#*vp-OzmDcYF6;lQ5Z-0 zA7Xmus5fx2^9M(%twy{m`{Sd=1bttH)?aXjxBz|3cB@*4SL^7F+zy_>UO57-BL`A{oyyO$H#SHl9Lah>?jGVmO1_6-(i=mMJ5B z7c0|CI@7LgN+ik5#WGzn2u1uPQpk;p$K!|}k2gUL2uO6slK7YGqP|EM5s^SL35D^i zO%`JD&b>NE#q%+$gv2vQH`z5h$=o0!Bo$&Aq@QHC%O8$R4{;Hy$)}PTs739Q%t(l^KUQGAUZEH%29p zVTkS?lgSkK&W*0^9s?S!8Be4#&hXGE1)NINCNofj5?K;VIEf=*Zd9_CcB#$O)-vJF z(U}ZWP9>lE77*4@`iUWMd ziukxAB|M?{e#I%pXW+d@@{5YUt~jpmQ_enG!c&T$Qe0Hri0@>P-;H!B@6(EV75@hK z=vXdD>id=T35lOk{99m#Hz{6ptl&& z_u7aPia($@srXH&NO(^1If}a#->EoptfW_cs>IJI{(#~p#aEps;hl;f@r_`HrxZV-7~ha{@vogG;hl>Athih817}Hiui~@M z7R>L@QQr3y2k=AU)zc+BsraCC1oJzA4F8(qUd6RwLzBwh~1;xKnj1M+C{w*`ao+-u0ohR{|6h8#)?5+6n^CdihpHu!ZGX*CU ze^+rv@$G2|&nZ6R0>Pb%2Nd@zzUD#+FDl-lIF5Qld6Q}+JgN8w#TmsfDXvxgz$}TM zSNsFTy^8n0NW$Z&cTE4AiW7?0&X(|u;#n69Zc^N>IH&mHITDW5ahKi>#l4C@KUcyN zsJE1N1>Wgg4^Xd}{(k_o zJi8RX8{ZWm&Z8bP{HO&g5A~LKy5c6qS1ImNJfJwQ_=A@Vzo7UL#YM$0DNdmsVETJs zA@Q3O_bBdEJo`!s?^gV4#l4E(f0cw66+fXkKs&ZTv zmlfv}SJkR~#SbYiC|*z};Q`t;ruPTM3B?aBl<+Ra_tXn6Dn4V8;7+uA@NUJYtrXm=c%fph#WVe}O%h&I{25^S z7r*1m@N;jF@FvASQrxNdrd680;$xcy^ZT#l_bbjR-q0f9{C+9JPiz&OSKI~c{2ToO z!)tDo@SNgFHwliPE8!0*PAPuNYT-92{tmEfk5UqU{mp`til^KnIHUN$TLtG7=M{G; zzW-ek-mN&hMsTlUeiNJWii&@%I5k7$-*LNyXB3~16P#20jN&fE>+X>7yyE{-TvYtU zJ0(1Eo}~ZbwSt=zU$jnem*N4%y^8;7y@Uto2V+4Hy!|f0NyX18u2uYlcT0F)@#+nN zduIy&;x)$Kk!EA}YLvcoN+xsNENpW?j;4a1gs<@!|^7pH}Ig;Mh9}rwn{0GIsTnYce2PHhI zc;!8UGm4M8S8$W!t%^Gp-*TUXcPsv$;)3F7_e*$Dai?N_SDE%JD6Y*2K7XU8r}#aJ zgG(j+n~IwhAM}94?^1k;;=JOIDh@6a{_hnh6xV!6_!-4tR@|icln+aIPVqd&or*uD zxS;q|#lbw0cg079pH#d-aYpfH71t{MmEumt$9+`zdBwLWuAMLGe^qg(;=fpY#nm4Z zetdz%U#2*rc-n&!o>BakF2M!Gk0|DMuUTFP|D%L=DW0piSMf`VgDWKd?H`x;DaChx zLU5Df3qC10uehkVp!k#jB;mo8lHT#35?rhJzx%Ti-lh1Y&uMxVUvW`!`{y_kPcPf4wnEges;>5pb|88eA;^V(0;RVHyDK08r@?{B+*9rfy zhXv;pKcqOmP{OBwMZ%Mcf2KI2xZ@ECZ&G~BX2D&GKc<-9>}Gi#@Kp)#Rs4wJpkBh4 zeoeyTickBx;FRK`;#$S`KPut*MZ(`_i{PT-HH!JS3Ml_8iW7>@drabYE|%~QDeh8y z^fx5DTk#UbdBs(Em8bYs#kClxx%@sM;k}AqP|WYeGyJ9}B|NA2!lzW8;=}$`aL_36 zI~2ziAGTG(lZvy7YZX7KIH!2u9*N(pxJz+C@vjvpuM>F-wn_Yq;-?kYDqi(X3GY^X z`qP5*imy}LtN3}v1;rP9OXA0`7kU4zIHUOPZ%cSi@sfYj^c8gBLyjJmA#Z8K*_NqL^KULhlT+;vIcO^VnA^4*23Fi0zDgSoGdBtB* zTvYsh!z(5J#P16~-XwUn;#$R%pOyBcQ}KO@yA^)}*tIV=2;bI6i;Dl@2O8cY;Vp{0 z6#tvz+FK<2q#uer`>y@l6x;XhFH>yauYXFheaC*%bHcap*?&xN*BVLxOTg5(ptxVd zIc}x>&gm0=T=7E1NyWB)*QD6i@A8Um{jQ+c*6$J+_cDE3zso4L^}8m;8&qCS@%}#& zeYzEY0GRrxa+2OxG(4yH`-;017d3uC@!0<-=>>NP|E<6-J;e(Z=M=wRaY6C76vyur z{)Qh*dbNseyw#=H#!p4XHhxO36~2w1GKy{dlv8Zur!K|T-gYat_9(B|+Ml9gYkyMf zM4q)j8O7HAbSbv>C$G34`J;V$729|*v0l=%@mxl+jpu3=+jy>9v5n_?729|&xJ&J+ zoq)gw_vM(P45wG^)s({qw?b&68;C} z*D4Pu0v)tC7DBt0v?gkmed zl;THJpN!%cfH_`jQv5r`-HMO+nS}Q$w)zq86nR!ZGK#H!bSq9Pzo7U^V3tSb{ldRX zaZd4<756Ish2o;(s^^8D_<-=O{mCevrQuzQZ&qAXJgOl4)CYxszv52CKU3VLxKzIs zm+F_|QvFg~s$cg=`c_{uimkqMDYo{ZSFzQf#J$3|`jb>_?MF_r)u+5-t4{^R)_%nA zlk}|pNGi7amQrl0yvr5m6gMjFRQxW* zU5ekQxLfhZ73UQ{thiV4HpK>t$zf|#3#qUzgzhT7iPQ@D(e^N33rV+z8E9T!eBL22w{*5Ezg5qZtzpVHd zipTw2^25J<#P~-l=HEafPAcZ#LL#22n12(A_;SVk+epMq74vT-5#OSie=CW&Loxqm z5^9vf*G~bE?|Lzs9*CG6P5A)vf_@Bgo{)p$|;A8Ub`S$yj zZ+N8qoXY=+@(qua->v+9Vl*Zqwe8a}?_T;hrd`$U8<=_7+k#E@ei3s1v#{1lIr->va?DBti%`Mt`2 z>i1fHuTg$cG5J2G{9Ho9HY?vSf<`oc=~n*Fly7*X{DSh2|D)({*!T!`KVs^i5a{wl z{expg|9a&cX3+8YpTK|qh=<}Ql>c7k8#aE@vCDiPQ@-s_d)q6bzhUDiB77f{-*l{` z{W0Ym9x1<5`3*ZnzG36XBl3Mr`CZC?MEQnC%I{YGF#{ssu<@l<`wM@ne8a|1kc^-46AqQ-+kV7j{!`=|Hh$cTPx(Hk{DSH~UHOKM@5>|K$K>07 z#~$SyHhwLl@JCF3EdhSSigkI4_-BK&h>!Z$openR=rDBti%`6=bsj}rNY zjqjJ&T-@|A_0K5(W#t<-ekziGACupy{7$Tm(0+!EpNQ~%On$fWPah+E!z1PQD*s!` zH*9=AzeDA}p!{WHMZRI<`}&gaW9o1FmB;KQe8a|1A_{-R+u!_I~s>UVO^;G5Nj9->!Va#`pCl-^b+Je(Mj6)BK+#`izv1zd7#m zcI9~C8#aC-qQ8$R-}ZC=RQZODpNa5&Oup^^Ub2tKH*9=g9`o;G^7E?y*nNd>c%=M- z@;|41!^TfV^!G94+kW)Kej?wn@qK-V(%<&4e_r{9jqjH?`97w6+wVSqf01w4`0Lf69Vqe*8$T7vzmLi9RsJal3E!~seS1;9kI648 zzeD+kN6NSN6HY!@g<+H*Eac zKz_vJ`Z!^Yp8{`UUKi^?}_d|w{z=VQw6 zQu(({5c!6U@8_3%ACup!{FDDd%TKZKGm-rJn0$L5=4Z+`Z2WkH?_=`q??JX5F7gc< zzYyX3n0$NxX3`PDH*EYwgzsY~|E*H~-&MZ7zhit~-?^0MrANNK-*dx}BHys_eR<^j zn0$L5=*XjlZ`k-5PagR`Cg0v4`n~cE8{gNLd>@ma*ZeA6!|I*_`zG0J(-`?+9seHpD<#(z44&@s*enP|t z#FX!2%FiqRv^T5$6f-`i))n!G;ukc2kMa#0KaMo`BPQR+lyC2+{k!rF8$aXNWxkKe zxA)nOz~qthN5jTXM)*D^ziFbRJze>Rjh~3{eN29*^8c)S!z1N)EC2QrM1R90<@YN8 z=(h;p@JRVZ<^QYl4I4im$-j@8e|z8W73CW?ekQ{AG5Pj>;9E`<{S6zxH^TQZ`Sw0x zUipTNpN#N*?Bq|9@?Ub2%2zy6eoo`>b+Ygc8$S_|?_~t0d(UNjFFo?@{mgSu6TV^N`}&ga zWAg2N&VN^2qlw`S$+jzboIc@e>igkIA?9MfX2l^fzpLKfjdkWAg3&(vy^L z*!Zc4d>@mapCaXVzVZzl-`AJ&eN28q`7bKp@JRXgzH1v2WBY4(q@rpon;$~Vk#_FozN=Z~0tACqtI-)>8ae8a}?A{js9cR5s+Z}02Y zR}0^;@#9{6%J;F;f10Efe2q*zfzwH*EZ5gzsbW?fvK3Q$)UD z!t)ClTvGI4Of0M?)RLjh{f4`6Fij69o7X zGymPn->iJY3?Iq(w^#YK=ZJj6#^0U&?EUuply7*X{G!S~>un<6@JRXg{`^msZ`k-v zG!}luw4aY@KYQQ4`RyX#u<;Wl<7fPYLuLDSo+H=$pR47k*!U?gKIQwE@_RM@=ag^Q z_{j+0$K>1l{|izg->~s>5x$Sf&%I6bKWc{X4I4iZ;rp2UF6BR}e8VH<=aqlWc_QDi z@jD~(eN6e8w~PMID&Mg2eS6KtO&`1bEB{^RYyK4*-FOnx#Y{I4qCFyoJ; z{mCf*x(h|VVdL-4emUi*YlLsu_zCF2AMsH7ccmokW#t<-ew<|djPGOSzdI#i-5cyRX3*WHu{rr;e zWAZb~e^~j3jh~Fj_c8f7NTdz_3X?hGFN&jWv*E#VWn*Rttg>?91dX%3cz>k>n?Rz{wRK8(`k3_zG zzvuRMihRSy-<|*2_kQ-fR``ZT%J05N^72LH8y+d&z9&?h75RpZpMV|sBc}Zl1o#ot ze)j#L18RkDm_f8(2LJgZCf~>8+xLn-u6)DBPmqkC@e>Y}<=gj-Ce?|2!^Yp8{q1{5 zKT*D6LX*B@2H*EX_ z(&5jE!Xe>MS$;J>q%3b$zG34RB77f{ zUz-vBlN_slL*zG34hBl3OB{CBCm4=UfV@pq?xUirPsH*EY=M81zH-@dPQ^m56+VdEzv zd>@maxJ>NVtbD`9_w!5p`IvnBe%m*dZ`k<0Jo0@^zJ2d)@(R)4u<_#&{e4V+PWAts z@(qua->Lj(m2cSinTUKJQ+`4DC$1Fz4IAIj?_AvUG5Pkry4#g+*!anad>@l<-?!^i zzG370@`jRc-@_ZEdRemo-I$CPj1&pTE5hK=v*OZh$~zjL1W-xB2;9w|Ss{7)#~ zu<^Sh`uo`FKVRhUH2oDD-`96Y{WbpCH;Dc0dw?V5=as)k`G$?3i0JQQ>R(X)7nN_= z_`B0TzCiL{w@UOkZ2WjczK<#2zGwIm5Y-zxGA8-I85?fZ?lDc|r&`N0)Zeuv#C@(mk5 z6|tX>seelO|Dt@u#^0U(_C3k3-6Zl28$T0~?_@l<-}9WhM)-z}pLFap-^b+J_dj~s( zBYYo|-=+FLa+}CEY67izw1AHr7mA+!Jl#PCQbO;%4gunYWy8Yk5c%cP<*Qvir6aFzz<3GxHq4VM&y{7T2-@x@} zTJZC8`j2R;ze%g|uW5Xf@sBZ`7k`(Zf8J|!`9cfcY;P*xq^bNT82?Vj3oZEhIsHd; z8vkc}&41&yx_qGp-*xaNP37Na{IkDNbY6Uy@!$B(x_qGpUvl_2Y2shcH zgQoH&KlN|FPUD59$MX1JC7<=i>os0z!JF+(<(o8>FZr*3j`2bZejbm|AJK%LCjx&& z6JGLV|25-!KI{22#t(uBXu_%D8oE?;QDo8=MzCQW$BXWwJI(1JJXOL&te{N_Wt{XWQe zp#^X9OL&teyyVN@dQ|f-wBSvC32)Mbzr*GKE#rk2yjfma`I3+S?cb-%7dkKgaW4PQ z8838R{9VTHeLwdf(}FKK{cqA#f4Lvv*BCFf;LkaDlP0{}C$RJbx_qGpZ2KBi3!N8#t*P7ZO^g>>@MlmD`XidkH)*QB z+~@F&AJ*jyE%;4^j`1c<_{X^XpJTkxf;Y=cEB|rE2mex+FSOwAI^~-*l`r>AeAbU> zywHL-`K9trn(%Tz#h)-pAhHYrv7cv|L~uifBQV1Z^)1M?ECGl6GG#8!q4MFe}bP^R9wE?=W>nl zLeukv-!z`5@=cn`zt+|7dMo3F7JSLUn>69&zL@&I)%*)B_<09!(uBXm<-d#ZLg&Rl z&iFrNywHNb?UZlQRQ~3}y8bV@qxlzF@Q*rplP0{}fAbE;3oUrFy)NTRlP3IpPnZAX zf5-B}bcBDhW`JmgH)z6d4m7^Yc%cQq>F{sTgqQny-otpI^WvZ2@}K`>EWb<({)wm9 z{F^kDfA^;5|8+zs=A87UPA^i+_~y=ijc&7h3S=jQSG)CQbFf%lP{lFSOu~ zs=wR^_05bITJUF_@=cn`m;0kW#CV|ve^mLUf3ExQX+Np!FSOvz`li*t%lH>CUTDFa zAOzsvX!GhS%HAH~1im$mf{U4NkkUz*c@L=*oeP5jIKTED<} zp#?wh;7ywF-IsIw|CBCYXu+Rx@Fq=oxxedqj2Bw)CckO?-{JD#%6Op#|A++k77n+`bK0fF0p+BMt ze~t+J5l#5JxAnhY%Xp#bcf!x(Lw`i4l|T1&`nT_8ywHL_M_~L3{+yyTP350s{JR-1 zbYA>z#{V7Tg%3oZEh zIsHd8;Z2(Gn~ZNWUTAurJWu7DG?jmc`F|_ph0cqAOxo{fb@@UI-mGt0{hwgG&v>B)zv=LA(!{^q*Y_ig z7h3RUebeeM_xpYM&uRXJ7Q9&=;Z2&#m-_%;!+4xg%-S7U&5O-)nD#o{L=rZ`4?L7N0l%4H@<}NLJR&= zoc0&`<#?X_M{-};w=*sGmHhzIa$nionU?#?eu-(huj~U%%Y9}46SVNISoj5--gM|! zIrMiq^dC9&bKhmZkLuf?|KUH^pYlRH-;f{i-&N4$PkGDsS9}e9O;GBO(yR5qd-(nN z22H<{K2{I%f2coATH(JzfAw0yGc9gulkmznAes3;r64q(7nwe~k$I5l#5V z82<$0g{I$$|9O1qk7&Zr6M;XX34fRIbN@-#UugP04}R`7`dw!jFSOtvp~CP-G?j1C zRQ@B3zs`7}1%Hje_!Im!MaBF-!T8rOUTDE@8qZVtCQap^d#!%g4>De8!JFj~-lPdH z_o4nC(G?g#+uXY(PwBSn)-lPeChs%2fLgxjtKk_P36n|yT8JCq3QQL<;#7&U-qAM`w1<0v%jf)lcw_J ze&1IzUTDFe10VE9bQ=G1AMl?uUTDFa{Y7|_rt+WoR{ie!FKhmV7W_OFjz6LaKTiby zh$j4*Z`1$&A;t?$zf=32!H52cCcH@#UhXIUdBzJZ_;~{3Pw?}Kip!V#jKB0fnt!1M zZKvy2xyFJA6@t}|X}!C#xxe?(LHCavoKi0;eRG5!wIf-gCElP0{} zC;cmo7h3RL2XE4Zm;0wbB>aE7=11^mdBnd-6JGACe%7z*_7__4n@;&AO?bKA`X4i1 zXu;1rc#|f)+=qRg@j?sUoS+|T`-U(@X; zbY8sN=Y5IsLg&TH{on6pywG{^a$k7(>zaR|1%JlrKa*DVf4!EsJB*k6#`EIuF#aiz z>+*%pi+_yqhm03m@Fj|F31d z(1JhXlyA~hzT5}@gNzqi@JE$@o6G+w3%yn{Ds!rx{5 zn;9>(;7bnPqzNzg+5Z*eg%-S7-er7g(u6O)LAU?Tdo}+;3*KyR!kaYV&oTb}j2Bw) zW_fAlUt|2!e^Zw)wBXJ1(#r2L{soK|TJT4e{|Mu6GhS%HlMP3IL{s@fzYouoKSu6% z|6``*e)qp)TJCrMl=tc9<$ia1UxWUK|DKHheky3$PexdiqGiATcbJy_^L0E+&rAFQ z-1&-@{qQfv3+Z=>H~C(s<-YW{F)jD6|Fk^+S-P(8W?I&R9~3;V7yrpq^!w+Selydu z{{8^dvY!7a)7RKv@fm14;!peyZKlP4@J&pMf9LxZeLKqk@sg(z{&sX8{F#W=Q8We! zz4lS2=f6nPzbG{4pZH(${Jj3X^obfj_dHF1HPdoF?2Syzd9UALTF#$+@h54#+(-T> z(~_U-*PgC_mwY`x`^lP?^9N6Trluty*Ylsn&(}0Rp9V)D)lbfQ-2bWk{005{>o8DM z{XbvRS3gbDazDz)n3j0IJD<+apViOzKLa#)eE*}GewCtc&;1nBzsdA3G5yKU#`9>y z_rFO$|6E1ip8Er)n@pG9tbhMLqVfI*82{r$KS_^n>aTYz8v2ms?^i+Ndq|!B`=F-j zQT6x2&s4uhblai7)1iOdp?}q(|IneIqWOs4zv<9#a_EmZ^zvuh{Jq?v-{sKH`W*ZD ziw^xVhyF2#{;)$o<8$rzJ=dWZ9eUlNeTTm3(C>BVKXB+LeIAv6J8HkrRG#Gxw={bdgQmyrFx z!smVXd=#JG!soB?c|SgXgU{dM^V|6RH+=pNKK~b=kKr>1J@F)bo{Y~^@OdgePs8UE z@c96K{~dfjh|ed2{v>>U7ytecK6ml?@A&*4KEIF8hw=FXeEtxhKf>pa@p%TG{|Ns3 zKk)eze4YvVS@?VkKA(!uXXEoZ_}I?UflM3x2iY0 zz3SGbB}LROZx0qcuUxL|`2Dc%^#=g#)#{hG%lNXs@Atex&kqOvTD@AOFW3BLvs3p6 zogRIIzhqfUs;u+!j?64a;4o98dY1?)Jc@Ktm?KAqD}oKS8j#LlPGURm3LpS zbI?V^v0I2bu+b zf90g!&xMsME&qDp?H;tf&dx)rZC);KbZ%b2nDcj<0XLqFZih{U)-CD$cF2x$tJLZpWCtez+dD2A5m86w=r`3gILL9yFimAK2!!Wo} zt8Z64(oXn!Eof8YdEsvDfqriR+OF=my`8|TciM+RZvg2YbXf7l;H!Wy9s13Kpc+;e z2aqu6%_IsOnum(#si!@9RB@GP&^+}*VZ?KJ>A*mtQG$-CpswS3Uf^ z*bMsp8pvvOW2daDx#ZRG8~#}?d0wy68PJgB;UerFLcpQ7@dETy_c%=2JY3#J>GW0C z4|}ys;0v{&KlQ_QmDpNs`8U0O_|kxR;?8%J#&R=g?+x~=o0saUq0^s|&Zoz=7rd7F z=!$nS;3+DgaTD|^E1uWrc#Y_5Z{Ke>AP|b1&BG($=n0_fcvW>%k1=LyRrkKv40Z=- z@qs@GYMW?XSC zB`<9EA=F25f-W7zQ|18;H4I4wl%Gi?=*#UFp_!W1s($Sfg9DVQpIFDw+n2npOP0v| zy=bkhDxZq_q8C&z_YUd<-CgTjmy`^2!=N7A2>WVk!Td@OkSXOY4Gy}^ptgQRscd|+ z?$y>wC1_<|I%tOv9|X$CA_d|~3#kt(0CK4YyizQUK$oBtI%)r}gv`+2#qO0;AT`5U z(Vau6JtosWS58~|XicuC5r0rsiX@>bGV~JE3j_`SZz%dgs*nn56|}ldACnjlh3mmB z&+qLiBj=dIOG^~Vku=_s>X`-{wDS&H5E_^URH^WdxB$CP8gU;>xZy3CHpE748d681 zrjm2s_NGUZ+o@^06{So&xAYj3ddXx>(qImuS(?$*=-q?r=|#a|Vy>Dg!%&X>8(4L94hCL5?9~sNaDVL_?Cu6|n2`cO zjr!eYIN&d9sKwUyy=Zq5kE=D)X3M$C<`US;QCZ+MEqiBnd!3dy z*bn;_3(VGbg01Zdv$Z`ATlYI`wf4Q>W>7yE1m1q&H-g?AR={B!?fByM4YJ0!g8o4( zPy=xyu7hf;h4rIe{qYMc(4kra)w&IKUaQq<*VG!DejDufFyQnW)eCyPj=RDp*Jv|X zJAetei`i^IVpH-eVM8krE@n0C^i=`Nd%*yZXh~cyH#>Xq!m3was2I!Oa>Xq5VmX3{ z^S0sL2>k10LZvaJ{caa)8>2eH^%#uB@3I!|<1wa9 ztSSkD60GCY67EQ7VQX2P^poak`-ya*zn$b}LHo%%SU3cJi=6yPcB%{AgF)45ja;y$ z-6p0bTP$+{n|*fm#%>YTYD%E%orCs(6mKtR2JodQF}I6>BPD@Y#IU+g+$9jIHD!Hn57yw|XA?s?9t&o+@H<^DiYkR2i-x~A^rYfqp3Y>?He?t z!JY4k3lDQb{Gj?}C)f+y@W&16`||KExzQ32DrHTN?A^TSb%S2N)AliU-|`Mim|B8X zz13C!?FWN7a{ofX&NXf|8~FFZj<W;fp^q0MrPVbiwRf#)C2{caut}fc-PD=;#IvRc(}EF!P~U9E23QvaskI%>itQJMHR~iEWgz@ z`4+b1lrf2o)IGJ=>qVBfX#&o+9m}P74;!w1G~D(*?&deSEV?~J2T;ro?Z#72igP#G zU(DPzI62W+iA4i*pxUfj?gwxmH!N`_32>_6Ve!|Zx)`e`s@aJN?M7JEp%rL5NQuSY zjE55iB+%Yp=T_Q)qE=aoQDz3c^x9bS8x0cb&aP4AQUq2wkZ!6fCP^p_<(CnUh7 zcxWlDYw3zj)YEj9ZBTeoGu)|nyGB?H)OE{z3eEvHl!k(*hKAB$%}xQI(OZfkU8tn^afWr}SS5hfUeK+=fn0^th_)QC?Pz*xPOP*_ zT4|ZRahwW9eS`fCvwB$t8cGuiHkzBAH&{hMyA7BzO6XiA&h!j)n|^TcC1 zJZ0^CIgh5vA!*4O)PbCgb{Gh_e>bKh}d>Y1RGZ;7#;zdxF zg=(<{tSzDz!{T`m?j3Xv`n1*?AYcNqDw~%Mw`-pMf2B2w(9w$xf8g_sUj%+u>wed- zV?WTcLN-+Ne#h(i2&~d8fho?<$}Zl%Py6(_kqTigxQ$gL-msRXr5w7`magI$0oMA7 zn{Md*IEyJfZJAUAy}MLL%ty}}pn05cqgkS(TNGH}Tb|f^;fbwU9+pB3TAEquu&&*H zMd()=nsR=@^9MA3tJH*siCc(%j&?4<8y4df>uGOR6oN~`A*}g?1vI1sG^d#og>K*}3_GUsMcieS|>IF;B zLVF}n8c(OqDyO2&DikJWw;6>^o-P-DewT8K`u^mFLY)yuQHBpkyUED=9jX>rE~V3O z^lIpCQX!Q9sWcr#OW`86ad-*^d-UB4Ojqg{t!w~hpOrWKoK{;6UBE%8ZChpvQ3~!v zI8qgz;M~#n+MJS4sOFKsm4k|$Qqz|Dv)5yl3_TXR|6xx|%KP6kWVIG1T=H?5>b&|) zm3&s6aiC5oTrrk|S)*;16^U$MY!ItSE79s{vPo0yNJErN(Gwb4DM4A5ze>l(WVZik zRf&WYutaE85xf%#hoWwRneN$CZ~|)Ue68ly+I1Y>>Idibo=K;tZTkD{6>N?`#nD!1 zqpuFDYwBD$CBdL`vN*)AoD-23C3&iTmfKLn+ZQ%mqtiaxPMV_M)<~-~%21smhgoC1 zsN+bj^9neQ$b1|!lxQAF5B4-1eTjkQ*a4#{0&^PD!H!_USi}vDJ;^k4kPay^<=gY! zXk142V$59j{=BKIE-Gbp5w4x;A>6%2`xRl|lEk5hpy^hNyylkQ(oIi*%8%A;V|Ols zS11LM%JhZ_snwEAOpdHA24_y7@&+2`W~~K}I1-i6p{xbdF@|5m_RwDo;rNep>S1!d zw|Kk8=^IdsZKQGNAfk_TCnggi1LWN%R=-Pd5NMVh^ShY=61Vts=6>1D;=LHoBb)yp(&aahK8}XMUL7~M^hiC`9`;V zqcvg50;hrn4oBX*!$7$|(}n^msT@P0P^uOVn#3e9Tlul4D1{`Hk^0 zoctS$lzwlTu{J8Nu9+a-_xrs{IqZAt7)Dfu5DDaKaZ31pue>VHAbS#yJyM4Gn$qZ; zH2zSM#^Xz=r7Tuv>FA_XT2b_PJGfza5N7L|!&)zFBiJTHq&TvfH=9u&?Y^}-EQExc z4kLKCkMM0HtXv6HxQiSOI#bnD!^$xm<9-etv=1rg7LuAj;Nw&{M12injKdcyui+6Q zuZBgv)4dgsY&9$}*+y3-zz=bscZI&;D--ZfV}KW;=aT+Z?mTLw<9JhnpOUqkX{V)a zpH9{IF^2|xsfeyjdQ$a-Ke^`0j1ny4+5s!pbV}t`+;TS-X^hp#oSAxP5H1~9Gwu$d zyFzrp)nx=V*6N}-yA(i(C zEyX)#@hHqU_FiPxsE}hXnK&>_x~A0H!-Gsy7EVKb8F5%u%3{zEtI5qOndbxYjC4y* zgvBYY^z-m&%_E7_>KG$aYERQK7ajC1lr!Br1}D2Q#n@7H4~7=1-AMBsbqO56n!TcTJ;0zEav>r?eS;wI<<$Y%@ptFj41Ai|{OH}B- zDCsk%bf|D-SNBOuJf`z}GEeP3+)z;`BTN;Wwk9mNgxMRGEKNh#j3+1j3B8mRZgdLU znYQogcGTe`nf+H$0<|f&HP*GmGqu6bod{wslz>pvUN9pgSc=o6Wab{4k;hvhj)7So zB5vO4Sapka*Q~>#6@4-71Z-(F8qI6gbKh@7dEg0co8W7)369Zjc8Vfa`KHt z*BFyH$lA>M()Nc;T54h)ZfFZFIb`;zrQ(z>@jx*(x`W+nvP5tf!nUxoMZ`Dh^e!F`ifL_fzyMR#aNYIn3*Z% z7^H>l)3hy!DXgN0<e?H6qP)}ycljOybwRMT;XHetx~lJ3 zYTK)+8BdSO*CA^Ds0?FB8A)4^hVGv!_c$)3gdyiPPm=rD%LLAynpF_7uBFYhr@-wQ zucn-QlhK8EQ_$B#qv+Ci9(W4Y5suUu<0W6M%H+#w0 znqA5G3U_h(iLqoqm-CXn73zJzNB&&oKCsqhs{RzOLq7oWf9cW z!bpA4T+$xE1KRg@WuSAp##O7C3}akuIV`XEjYFUAEQ2sK3$?t z<{y-0Bj{qqPMUFWtE<%*%pSd&NB6|@{d7IAzZ+Sd{nm(g;WOe%fBp?#y( z2?fbUIcqq6Io2LgN*cBkro}*%{Lb{H7DII**8KFSuIR>tDXA_wKS&mZ?CU4Df=_Cq zsl%kpv?CM#TiUIq6bX-v#3z z>F7QjlbMb&8=@ zv^$$K$W@cQFk=&rywz$uTcy+=ZpD!rOFxRClY+Z8p0-b?WCWz!p=yVL>`+pFZqjYd zADgU7N1J}@+S8&Y~F>6gG9T+)DL-ghzc6KHg+9~Ea8cGeC+S-c6yW&+VlI~;Gm1- z$?IxRjmP2@5)OwM7F_Pjaeo-~f z1W)$R`(!q zKsFDEw9UuEQ7>9Zd69M_P@9VSnPSI90S`NLbv8_nt(}b>N)Lt}as9|S?uE3);uvz5 zw0P55F)?GXa2VS|heg!8^sw7VNxVzX@Gt6bIm}=`FO2n(NcA6|#>l-Z$=OehIoYL_O zsMy0-CVwO|q@HND#o3TXSP%NO^#}Uht7T%JhZNB&26)o-sYIDch;kq+^wYA*F(uDf1)dTzXGt`t%8O1XhPH z4SJm;UF65E6XNGaahM*ryewa6VN5LKP|7l~V%0*eF-vnW(BZ-F3@I?gdfkdG);T=Qi;Jz@-|1|xR`q757T0t7>ax%qW0?aNZ)}~>r+f+`f z)Sr62N z)^)m5tQ;D8W|f=RJV?3PmXk3EB8nuomi{+>s8~NF&uS<&Jvm>3>*95`!e^iYC8|9A zfUxOxo^(@ar?ce+%CiU^E$Labum<vcRGSqS*TGo!rF&md;D{GCO-t=}H&S*^^h5W{X zq4SaB2SYGa{sko%rdZIe_o-Jku}^YMyJo{qKRx88x^yE%?0mIu^w7rI0sMr!ejV!` zFtAitarH_n=+1TJQCx0z>V7k@atlNcTJIF+XsM6mqCtZq@@tFLo86w8D#tS3(F%^g zvjS%|UFL_AkgAZ~UZ>>^_QQUyTsq$$Z1%$TAm~-g%kJ;C(lvQpxj*cOgU<2Tgq313 zKr0P&D=qZVvQGYoMI0K#9^+xq8>lPVHnIHMR5Lthxw?#bABwr{!*iRks>%~*-pycS z7GTxNc`$f5UDl|^d@m}RRmsy4$FMh@oFcHVa-O}W=5_4Z_;mLbwBrfB+TOyL5YLKV zVq6VWv-zXex4tZ~WSd`>R}M+0@ArEl4Hg=NIGesIGzR2A-8Y*Ul;z}UZ!#p^-qhN_ zDsfqrxY5}Qp)R<<6(&!jyaiR>1&A3Jwn+azfs&k9nw$zKLK)g+NSl|^+Psu(^XQej z^Hy&J{&l5f&3>pxLX!QIV}uSJ@w8<@3kWqA#6{-SYfI2;1dsGuC8u7q>O{u&l$bCs zfZp*Np0u$&dtlhaKRJdz=_2FDxSiMZy`s3^6V5O5h>fMst$I5>PC*Pjttr0horCs( z4#si5JpR#sIbEQmr^-B!Z!F+>x!HQqX@zwEnc^O&j#?m|yn0bmGxSE3$lL=OLUIj%1E$XV6=HQ7&(EZjx?P zGl9QNZ{w)Y_-**kbU;sNDx+BpZ|12?N}EK>L=C_bnWew13cF8^)e)H^)-FzJCp{zd zk&Nc=!$>W}E$Z}Nh5(>FVgWdkDO5c1bgCA@PJ`cQu_azzT8{IB zRwT4sWo|#}n(D{9ZG17F_u|{e7dzD-p4dq; z_&Qw`G?gYbs9dgB-gn`Gr)N*3Mu0uLIOl#-DJ8yINItbxNj$Zj1g<23E2|0M>QdsX za%m;`T{#IYFP4+ftt1&Kr*KkUNtRJ5CCjL!RKK#6F3QOYl#~3Ilg*L*rd%>db$Kl%4vSVz zjayB4Mtb3)KM3Z|zPKOs`ez5>UeG&xu~R>wt>XS!IH`N>u)TM--fbTA>4SfDkx=U9 z*||Z`AG{FM+}T6FcXqeaY^XQfINR@+E4R82KeW<#Xmzo7y|m)pTb`pE8FKPEIm$&WoYv# zTg8+vx4}Lq+zTqK!mBrZWPQaBNYleMWD9A?VCH+?gR?Byv>3be#bR2xG&D@YYcl`U0YcOl${1l*ujM!XxEo*-=mSpActJ&CTTbGQ_T1*g6iuK2GzFR= zI>5^PI;L2g!$rsBRB6aiMmjZ0EM0s;0vrXWumD@SViP;vrk>a!UnOr787gJ-uw_04 zZE`WvH?#v0^cJw~+~`33L=AcSK1^?fb0DR)=QqQ>cJ=7DR1hFO^eu!p#508nlK+lU z(s))qT4eiy@}Y{}wFDtOa&RoAPgOqr9XYh|WnejO1g&sFd zR_d4$-=7s!pKnrhwFh>~O>Z2lrXgK9)^-^BUlPQ_^|!HuP*+%D=Ad(~3|MXk?Y+T% zC=Dddm52rt5x(7YahxUOKpGkTV@4 zesZn=I%uf;ws@-;|EUgLd&;NeBL+{1w`;XJZ6&N#m;IEnL3>s+r~^6DX*{W;7UqB| z4vVB+(pZd-r;zr^I4OcioSitX0-gYob|9 z;aH(0l9U#qYnSR2++oiLIh=tfZBf7t5W8gH&&X zFqXrLLW!NNH^lnj7&5-+r6)0`R`&>1vyZnGa?e^vv)egapgm@E-#ymEr=iVMOuyY` zDGGvQrNEB?Y&-E%4?x7c08K z#A+T{nOt+noth@Mv)5yl3_TXR|6xx|%KP6kWVIG1T=H?5`jYoqD*3EBr)BfX8f~+j zts)zkF1w;hE79s{vRQCr!SYw>&F9SaA5)I+&9~0iYF>>F zcKZF`yxueE^t4TXpS^-Dgj*uM-V1ICx(_QmO;bVJ7dBj@(+;e;f3~b*|0g<(3UMIFtypN9{5wInUzkSBX@$f&0& zFFj7y@JZ4+rIIPVj>$4PuTo~1Or}MK%cT?X7`D|r8kdo28!v{lLkZk8XLRrl5io}c zur=DR5PSO&hh9LTMC9PNT&$F5rP~Y#-p;}9ZlIEhjn-^gF2l^u#rZVzRBNjx`>jQo zgZczEO|77KBr@O8S(6~{UdJ#l%HTAmg4anTh zT8r{EUG?aoqm|?pzlQChzZPPHDy|l0|9guUHvoT9$`<5e8%OthNS4$LTj8KzYgVZr zEDMX<9y$?2LWOy?&`sP?OCE->OcWwr@ng7(ZtGIZ?#n{-7WoMyIXq%Qbh~q^Q%o#Y zR=|I8Y)N}#?5L0mH1%{+3*rs~SI1$(Cc+5XxGX$O|mMP zB`JuD&LBs}1gI<;Rh9SaDs#;`Nf{?}_vKP01ZF;e>%?QE>L&IE&$nsHRE<$YN!df%xPe zh|UkRgBzA(X0{$rto6b+&Txk~D?sO)o1WY}*|%1Qg^+O54~PAYBX&1%uz<2edf_gz zhUn~!Q#|;mq`X|lfNX>V7HB+M zR+;#_x8jklo`DBV9-`!E_jy<78|@|CvfXQi=((hunmZ3B%dwo)z)wwWWdseRZJHIvuwel}#b;jnS2L&VsaGSAw|6#1YH(9r_1a`oJKvq_{ZDyratf2*Fp7X|W7$q4!HXi5Ew5$ZdofH9ScD{T}~ zrH-!Ai_97oQmB(jK+~jaO07LS%s6G?G}M<72iB!52904fxmhK13v*;S5f-NyR*{EC zYaS`euB9E%S`eY!mUwo8U_swQW;rERb0H}$#;>$cjC zzT4GwDilN>625m4*Ax?Diu%ah{7F&$lhfRp>kt*VWi1E_Ifd((Qp+%%P6I86ZRGe@ z*DI0(kq)LQcSPg|BA-bGVMVlZO8LoINa^Ex%9a)krEIMsH3sG0#KlbXcL-19rZ%fs zR;N?hC3Omi9a~c^8Mi_9mlN37E(Cm0_XHn3-&rGb))J5DJfF;G8!Cwrk+vo*xP;jo zmOQeDt{G7o+vj?6dMP@Dl(ITKh3!oDSJFP(@R6+77;&7$6x$l>S|lTZU9#X@#^>uj^~*@x76H zQ2Wr+$KX`0y2ZL{*5TNaI_fzITYCIvgwr;~1jkj=VuE9|8=m^<7~j0oASE-2))~6e zcu`zU%z^iq6`e%6C)X=j1IpHfOm!1jk)0gB4f}{*u^YE*8+p+iC*6+v zb{H&(Q^*clfCiHr()Qt0Knher*aA7pfU!R)$;HW z(Rh=^Z`8m?bRjUqTvfCezv*GP(ZM6*)ShlTG8xq}drDXGpqN@prNRGN(54$?5w%o% zpx+}a5fMOrzZIb6>W8@NyawMH9Y5rlH@fd6J@BWH@<2*;H-wuYc=!MzQ7V)4R)$L> zyGK)pvs%eeN2^~&gd+dR_BtAm;vgXh#sDv7Yk?~@G4&{IqjLWYA1o!U0XKdx2rR^fN~*-Zy^SOy_;ySy_;vp3fY;X8qrynuww>qEVhH2IvQYRZ0VJza!xo)Q1<5Z?ODMzcp+}zJzGvRo@Sp^a68hJKcyW$k=F2#-)C;zPni@l{* zuqSVA3=LM!++5OIQEKdswaZl%V+JQctQFtne1~Mzr(e(79OT}O+fhq>XMul}^1xih z9cfkBTM^@MtOGPF)cbyqw#|@Y#%_&q8du(@1Zc&4gLfDPH){3mic(DIJ$q)Mn_ugG z8;P39<#LFaxB$T{9Z&CI#$aQv3B~btNwTURt10S-BvQk9wll+w)!ODs0pT^RKw`wX zBC}dG!Mr|oo{`3k=Aor_Uk-gk3SpgW1HmRp|9KJIGc_=V| z3(U$KnRbuZC18=HPZCoduh*a-sDZm3iVc@5l8*OEHuIDqO!B>u*H{+p7xTbf?4#WjuZ97S>5eh%GEvn!zrz3+{(aq+=j~=T&7Q zd~?T+n@oR>)CbL&YBR0x?>Ym$m@8JaW3SV}=o!e!;bvO%8;u?=747V1Hw}jImeay3 ze&f)`0*X0QT&W8_Ka!NBGL&WK>4RyluPS^;Me^e(th}P#SCfFEO zv+FF`?02F;VjV)>4?~AwsErVP4f!NRAbAqGYhxXP+?JWc-_;>Ajzo?VD$yphsjoBk z5Y3sJRGoN{)Gj1_G3FX4c{Bji2=TRJ2v)hU8$0oBK$}=LQ9D3SH-au45v0h;1*Oy& zth9I=mv86od3|h|`#3~HnS36g1qj7j?R7d0uZJLZ*kZee6HANTjAh5jM}f*pY==6D zO?l}l*tmK~-3PsHL}Q3KRoH&)4lMU@aRshiCJV3uUrKDOYRNE6>q!pKC|?_&-HEkF zl#Y#icUlZYiC;~Jelb)R&RLxv)fL_MG$qv~XXhcEGw7{KocKbYsUkP_h*=`i+^=fp zpVVw<&ax_So+7?S3E{weL=vbHnd5kca|ysH;2)R&4CmhnR+>t)XGSt%($0TGWh(4O zZWOvg39SghfeaXSRNQ_=8iT`60i~ti%5p*#L#^mN2F{*ZP4>c!O*k^$qu@g_PKQ`= zWJF}$GveBKQ?)|U?NGJtLv|?L|%Eh3gb)yp%Stpv{%9Wyf!lSI_fzv2x+l z9oc>pN+)4CU(0Z;t9L2KYp*jva?>MUVa$IN8Kv;OaBqJA&*jK3NcHfN@1sv!2+Dhl z>)0I!I_cXMyx9FdwjR5F*wZ{0#%Qz#@ewjNmEjT@GAZ&@+@<+NC*f6LogGUMMQBD^ z_8Eg?2F6p;`G*J!hpich7r~4++NglX#c=hzmDr`&$2GCfC+xDB9b3k;*DEa1=!6XOo6hfkC3&>)cf|SKVQgl4vXKWo;mNjK z#WDcYcFDLh4(8#F9+vP4#|rZCpjsj0MGGk}%Fr_>FaA*=(GEO^wAa7IDQ8pmXL8&& ze}a)0=}uMI+$R~$qv+{21StBANYSUn18B`zbVvC3H72P#rM~mLm8QJv)_m?uvmaFxR7B+j1;Ewd3s8MDQUzz-o%+Tyi z1{2()jj$f{YwHj6yXsJe3@M`ZNrws7rxLaD?CTRxKF6AIGG+-VspND+`44K;nd`?Y zR^KnapgWQdJs}dTM&Vty2q>XsE@-#b=+E)Crm)((;`qz4IMr+*S;DTW+A(UT5~U|| zM2uw*zz^i`YD9;mZF|w^7^@@^g2gwJsrDFh)W&CcYoaS zvfT28F|m-BGt0z^RSUJo3|2#tIhbh z20ZM6M4>X_9Yg6<$!K1u>7Ue(zN^7q15KtFOn}+NkgJbp=T^6=+A%p_D_a28z_F{W zjS9L;Y@PlO3q`d5PQAm#sEPR90#D3aJ(`rr7$*(OYEHz+kdIggCH+u($l%s>T-7cV^< zg1G@Q>87Zv{SV8RmS+(XQcmHdypk-VQc9LlNvVEiDamtXIa%AvO3HIe9Pms10D#mCL36 zKH|v`FowLJi`AQ5%KlkOSp?%dCtU+xQA((Jj89dfYy_pfKIQFcFHd>5v$s>h?xsq2 z%XQf8bz0tFKkV1c3Rla^?(de(WHrIc{b4^GsC=g5vx&8Y#Q+@ufi5F&A=HVTIHbI& z?&wx2L)7Kmn{d)>Dm$EW^j?N_4)dvv)S$_=&*YhRlSrC9Xw@ou(EPT%d`Jzrp*H@S zBv05uU11WUrG+lBFf6ADKshM^#^?ziPFLvE!nlbZ+L^jhDeWUN(QGN#Q_VOt&lL!q+a?oywd`xBw9q{` zsM@ePI)teg0LzZa5*mL?YZ1b7q8)7cAQm~nwC8=5?c@)lIPUx2RR!WQY@ zCs2|T@tbqji%`atHbnd8o!g^VYSCW35%|}Y;b8WBH4>8SryT!8VoFGx5nRm<_lT); zd3H%TevwpnITa-)UddGi1y5H8Au`B35qu)M2=KV0YAK~<9nx_0`Dhi4obK2%F{_tV zpgqk-Iq#e|SWh{>S=NgsL}+X{Au0R{T^9>lUK45wCKSOV6RMKagtD1{_iai{=!8G} zJ$Mgx{DvnZ%jyg2;P@xU^XL2+_u`sfe}iX>Rj_C=WxLK z1tZUrg41QaOUKIsY%INM=IT4vi$0$E&R&Wb(}}gE%8i_*Z6~AN!GL>Q(cBUrOIk2y z)IL=5f<>rny;~Pqt~^DLRZd#u!8q}@(1Rb33YdgNWQnlu*_lZ2ctc~^?@|IKI%PeH z)Uk_3x=`H~AI~WnxnRhIpo~H~zvzkPlyn{JN$+&h51sV#mXi+Ra?(FsR_@%Z+oruh z3-qhoh9z>$MVEdbd(LvM{ge;(>ir3}Y7=Hl7P}*{Wm#8qS3B2(_LzQdjnyvh__xR=XF6I6+gK!pR@kBL z(3}f$v*gSACivnL^zfn&*ip%y&KN@?{ycS)Ya2@|r90_|x5i@shTlboORM!Z)VH-w+s1IW(|y0+tCX>! zPG@D~6P9XUom|J-9gK@{SLGRB?a7i|Q`=sQo`92I`z^NcB|_+wjiEb67@_rZn!Lgp zf}hMi{;4pf4+p!=bF^E=N_-@qAa%NSNaeD$Nb^Afb>-h-B)OT*w3Vxpl1{_`XFsW-|W^g-*^x-tDrdfK-%ZXt6W88lt ijW*WYN=J*xuXgg60l99qWT0g^>1j)GnIYbl|NbAAsO?Pv diff --git a/test.lox b/test.lox index 9d74ecc..2b8ac60 100644 --- a/test.lox +++ b/test.lox @@ -1,9 +1,3 @@ -fun count(n) { - while (n < 10) { - if (n == 3) return n; - print n; - n = n + 1; - } -} - -count(1); \ No newline at end of file +class Bagel {} +var bagel = Bagel(); +print bagel; \ No newline at end of file diff --git a/token.cpp b/token.cpp index 6655bf9..6d56ce0 100644 --- a/token.cpp +++ b/token.cpp @@ -5,6 +5,8 @@ #include "./Token.hpp" #include "./LoxCallable.hpp" +#include "./LoxInstance.hpp" +#include "./LoxClass.hpp" using std::to_string; using std::string; @@ -20,6 +22,10 @@ string Object::toString() { return str; case Object_fun: return "func: "; + case Object_class: + return lox_class->toString(); + case Object_instance: + return instance->toString(); default: return to_string(num); } @@ -54,10 +60,24 @@ Object Object::make_nil_obj() { } Object Object::make_fun_obj(shared_ptr function_) { - Object nil_obj; - nil_obj.type = Object_fun; - nil_obj.function = function_; - return nil_obj; + Object fun_obj; + fun_obj.type = Object_fun; + fun_obj.function = function_; + return fun_obj; +} + +Object Object::make_instance_obj(shared_ptr instance_) { + Object class_obj; + class_obj.type = Object_instance; + class_obj.instance = instance_; + return class_obj; +} + +Object Object::make_class_obj(shared_ptr lox_class_) { + Object class_obj; + class_obj.type = Object_class; + class_obj.lox_class = lox_class_; + return class_obj; } Token::Token(TokenType type, string lexeme, Object literal, int line)