From 8e2d5b227ca4a35534e800361b284debbeb1e6fc Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 8 Sep 2026 20:47:36 +0800 Subject: [PATCH] =?UTF-8?q?chore(repo):=20=E6=B8=85=E7=90=86=E5=B9=B6?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E6=9E=84=E5=BB=BA=E7=BC=93=E5=AD=98=E4=B8=8E?= =?UTF-8?q?=20PROF=20=E6=80=A7=E8=83=BD=E4=BA=A7=E7=89=A9=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=8F=90=E4=BA=A4=E4=B8=B4=E6=97=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + PROF/main_prof_60304.prof | Bin 255464 -> 0 bytes PROF/main_time.txt | 1 - TODO | 6 + Test/AstTest/.tpv_build/temp/_sha1_map.txt | 27 --- .../AstTest/output/067c78e9f121dce3.deps.json | 1 - .../AstTest/output/06f53cc594b4ac6c.deps.json | 1 - .../AstTest/output/0c67644125bea0fd.deps.json | 1 - .../AstTest/output/28de517e3820658a.deps.json | 1 - .../AstTest/output/6446627d4f07a1b5.deps.json | 1 - .../AstTest/output/72e2d5ccb7cedcf1.deps.json | 1 - .../output/_shared_sym_includes.pickle | Bin 1742804 -> 0 bytes .../AstTest/output/d137b1f3311f3a7f.deps.json | 1 - .../AstTest/output/f6b51804a0ba8ff0.deps.json | 1 - .../AstTest/temp/067c78e9f121dce3.stub.ll.dep | 1 - Test/AstTest/temp/067c78e9f121dce3.vpi | 136 ------------ Test/AstTest/temp/06f53cc594b4ac6c.vpi | 109 ---------- .../AstTest/temp/0c67644125bea0fd.stub.ll.dep | 1 - Test/AstTest/temp/0c67644125bea0fd.vpi | 44 ---- .../AstTest/temp/285b6aa29a34754d.stub.ll.dep | 0 Test/AstTest/temp/285b6aa29a34754d.vpi | 23 --- .../AstTest/temp/28de517e3820658a.stub.ll.dep | 1 - Test/AstTest/temp/28de517e3820658a.vpi | 189 ----------------- Test/AstTest/temp/6446627d4f07a1b5.vpi | 86 -------- .../AstTest/temp/6c658cc728d0bbf4.stub.ll.dep | 1 - Test/AstTest/temp/6c658cc728d0bbf4.vpi | 22 -- .../AstTest/temp/71e0a3ffcb3ebfad.stub.ll.dep | 0 Test/AstTest/temp/71e0a3ffcb3ebfad.vpi | 20 -- Test/AstTest/temp/72e2d5ccb7cedcf1.vpi | 91 -------- Test/AstTest/temp/_phase1_manifest.json | 1 - Test/AstTest/temp/_sha1_map.txt | 26 --- .../AstTest/temp/aa246c6e6aa30484.stub.ll.dep | 0 Test/AstTest/temp/aa246c6e6aa30484.vpi | 26 --- .../AstTest/temp/b57252077e6b596b.stub.ll.dep | 0 Test/AstTest/temp/b57252077e6b596b.vpi | 53 ----- .../AstTest/temp/bbdf3bbd4c3bc28c.stub.ll.dep | 1 - Test/AstTest/temp/bbdf3bbd4c3bc28c.vpi | 138 ------------- Test/AstTest/temp/d137b1f3311f3a7f.vpi | 81 -------- .../AstTest/temp/f5522571bcce7bcb.stub.ll.dep | 0 Test/AstTest/temp/f5522571bcce7bcb.vpi | 100 --------- Test/AstTest/temp/f6b51804a0ba8ff0.vpi | 192 ----------------- .../AstTest/temp/fc980acec33d69a7.stub.ll.dep | 1 - Test/AstTest/temp/fc980acec33d69a7.vpi | 100 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 8 - .../.tpv_build/temp/e3/e3ac223bdaf94a0c.vpi | 100 --------- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/5a/5a548a4b33e11918.deps.txt | 1 - .../.tpv_build/temp/5a/5a548a4b33e11918.vpi | 13 -- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 7 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../.tpv_build/temp/52/52e6b51da061882f.vpi | 34 --- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../ClosureTest/.tpv_build/temp/_sha1_map.txt | 7 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../.tpv_build/temp/44/440f18f9dce85a95.vpi | 43 ---- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 7 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 7 - .../.tpv_build/temp/b1/b1122357fee8fd68.vpi | 32 --- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 7 - .../.tpv_build/temp/ac/ac0d686cb2cc783b.vpi | 78 ------- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 13 -- .../temp/aa/aa246c6e6aa30484.deps.txt | 1 - .../.tpv_build/temp/aa/aa246c6e6aa30484.vpi | 22 -- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- Test/G4/.tpv_build/temp/_sha1_map.txt | 12 +- .../.tpv_build/temp/a4/a45655b992cc8767.vpi | 2 - .../temp/a5/a5e9a83e9db303ad.deps.txt | 1 - .../.tpv_build/temp/aa/aa246c6e6aa30484.vpi | 6 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../.tpv_build/temp/5c/5c5f2d19bc9e75ab.vpi | 8 - .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- Test/G5/.tpv_build/temp/_sha1_map.txt | 12 +- .../temp/a5/a5e9a83e9db303ad.deps.txt | 1 - .../.tpv_build/temp/a5/a5e9a83e9db303ad.vpi | 64 ------ .../.tpv_build/temp/aa/aa246c6e6aa30484.vpi | 6 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../.tpv_build/temp/12/12c1b8e59d117476.vpi | 2 - .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- Test/G7/.tpv_build/temp/_sha1_map.txt | 12 +- .../temp/a5/a5e9a83e9db303ad.deps.txt | 1 - .../.tpv_build/temp/aa/aa246c6e6aa30484.vpi | 6 - .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 6 +- .../.tpv_build/temp/bd/bdfc8bd243b7e5b7.vpi | 23 --- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- .../.tpv_build/temp/42/42e09c6149524d9d.vpi | 32 --- .../.tpv_build/temp/_sha1_map.txt | 7 - Test/NewAstTest/.tpv_build/temp/_sha1_map.txt | 28 +-- .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - Test/NewAstTest/App/main.vp | 6 +- .../temp/74/748d0424e8976fa0.deps.txt | 1 - .../.tpv_build/temp/74/748d0424e8976fa0.vpi | 27 --- .../.tpv_build/temp/_sha1_map.txt | 10 +- .../temp/a5/a5e9a83e9db303ad.deps.txt | 1 - .../.tpv_build/temp/a5/a5e9a83e9db303ad.vpi | 64 ------ .../temp/f5/f5522571bcce7bcb.deps.txt | 1 - .../.tpv_build/temp/f5/f5522571bcce7bcb.vpi | 95 --------- wiki/02-type-system.md | 116 +++-------- wiki/03-variables.md | 16 +- wiki/04-functions.md | 35 ++-- wiki/05-classes.md | 12 +- wiki/06-oop.md | 194 +++++++++++------- wiki/07-control-flow.md | 15 ++ wiki/08-c-operations.md | 85 +++++--- wiki/09-exceptions.md | 14 +- wiki/10-imports.md | 26 ++- wiki/11-builtins.md | 29 +-- wiki/12-project.md | 89 +++++--- wiki/13-bootstrapping.md | 38 +++- wiki/14-oo-refactor.md | 12 +- wiki/15-multiple-inheritance.md | 12 +- 144 files changed, 451 insertions(+), 3910 deletions(-) delete mode 100644 PROF/main_prof_60304.prof delete mode 100644 PROF/main_time.txt delete mode 100644 Test/AstTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/AstTest/output/067c78e9f121dce3.deps.json delete mode 100644 Test/AstTest/output/06f53cc594b4ac6c.deps.json delete mode 100644 Test/AstTest/output/0c67644125bea0fd.deps.json delete mode 100644 Test/AstTest/output/28de517e3820658a.deps.json delete mode 100644 Test/AstTest/output/6446627d4f07a1b5.deps.json delete mode 100644 Test/AstTest/output/72e2d5ccb7cedcf1.deps.json delete mode 100644 Test/AstTest/output/_shared_sym_includes.pickle delete mode 100644 Test/AstTest/output/d137b1f3311f3a7f.deps.json delete mode 100644 Test/AstTest/output/f6b51804a0ba8ff0.deps.json delete mode 100644 Test/AstTest/temp/067c78e9f121dce3.stub.ll.dep delete mode 100644 Test/AstTest/temp/067c78e9f121dce3.vpi delete mode 100644 Test/AstTest/temp/06f53cc594b4ac6c.vpi delete mode 100644 Test/AstTest/temp/0c67644125bea0fd.stub.ll.dep delete mode 100644 Test/AstTest/temp/0c67644125bea0fd.vpi delete mode 100644 Test/AstTest/temp/285b6aa29a34754d.stub.ll.dep delete mode 100644 Test/AstTest/temp/285b6aa29a34754d.vpi delete mode 100644 Test/AstTest/temp/28de517e3820658a.stub.ll.dep delete mode 100644 Test/AstTest/temp/28de517e3820658a.vpi delete mode 100644 Test/AstTest/temp/6446627d4f07a1b5.vpi delete mode 100644 Test/AstTest/temp/6c658cc728d0bbf4.stub.ll.dep delete mode 100644 Test/AstTest/temp/6c658cc728d0bbf4.vpi delete mode 100644 Test/AstTest/temp/71e0a3ffcb3ebfad.stub.ll.dep delete mode 100644 Test/AstTest/temp/71e0a3ffcb3ebfad.vpi delete mode 100644 Test/AstTest/temp/72e2d5ccb7cedcf1.vpi delete mode 100644 Test/AstTest/temp/_phase1_manifest.json delete mode 100644 Test/AstTest/temp/_sha1_map.txt delete mode 100644 Test/AstTest/temp/aa246c6e6aa30484.stub.ll.dep delete mode 100644 Test/AstTest/temp/aa246c6e6aa30484.vpi delete mode 100644 Test/AstTest/temp/b57252077e6b596b.stub.ll.dep delete mode 100644 Test/AstTest/temp/b57252077e6b596b.vpi delete mode 100644 Test/AstTest/temp/bbdf3bbd4c3bc28c.stub.ll.dep delete mode 100644 Test/AstTest/temp/bbdf3bbd4c3bc28c.vpi delete mode 100644 Test/AstTest/temp/d137b1f3311f3a7f.vpi delete mode 100644 Test/AstTest/temp/f5522571bcce7bcb.stub.ll.dep delete mode 100644 Test/AstTest/temp/f5522571bcce7bcb.vpi delete mode 100644 Test/AstTest/temp/f6b51804a0ba8ff0.vpi delete mode 100644 Test/AstTest/temp/fc980acec33d69a7.stub.ll.dep delete mode 100644 Test/AstTest/temp/fc980acec33d69a7.vpi delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/e3/e3ac223bdaf94a0c.vpi delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.deps.txt delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.vpi delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/ClosureTest/.tpv_build/temp/52/52e6b51da061882f.vpi delete mode 100644 Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/ClosureTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/ClosureTest2/.tpv_build/temp/44/440f18f9dce85a95.vpi delete mode 100644 Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/ClosureTest2/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/b1/b1122357fee8fd68.vpi delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/ac/ac0d686cb2cc783b.vpi delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.deps.txt delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.vpi delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/G4/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/G4/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/G4/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt delete mode 100644 Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/G5/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/G5/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt delete mode 100644 Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi delete mode 100644 Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/G7/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/G7/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/G7/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt delete mode 100644 Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi delete mode 100644 Test/GenericTest4/.tpv_build/temp/42/42e09c6149524d9d.vpi delete mode 100644 Test/GenericTest4/.tpv_build/temp/_sha1_map.txt delete mode 100644 Test/NewAstTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt delete mode 100644 Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.vpi delete mode 100644 Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt delete mode 100644 Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi delete mode 100644 Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt delete mode 100644 Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi diff --git a/.gitignore b/.gitignore index 0c818bf..f292a10 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,7 @@ Undo/vmware/ /TPVAppBK/ /TPVAppBK2/ +# 性能分析产物 +PROF/ +*.prof + diff --git a/PROF/main_prof_60304.prof b/PROF/main_prof_60304.prof deleted file mode 100644 index b979f43787a124d90291ed6d715df9ef477d1ae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255464 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 z

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

N@}ZC&fWzula|RT%>hH5@ZjECH1P7Y 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 diff --git a/PROF/main_time.txt b/PROF/main_time.txt deleted file mode 100644 index e60e879..0000000 --- a/PROF/main_time.txt +++ /dev/null @@ -1 +0,0 @@ -成功 120.25 diff --git a/TODO b/TODO index 1dceabe..9ce654d 100644 --- a/TODO +++ b/TODO @@ -54,6 +54,12 @@ TPV 虚类判断问题,参见 ast/parser.vp:2037行 元对象协议 MOP 的编译期版本 多分派实验 Mixin 方法直接调用的合法性静态检查:MixinC2.outer2(c) 用非组合类实例直接调用,编译通过(兜底 this_adjust 前移)但运行期越界——Mixin 方法必须经组合类实例调用。日后"编译器提前报错预警"功能需在调用处验证 self 类型的组合完整性(NoVTableCrossMixinTest Test 2/3 边界) +if not c.CIf(T.__lt__): + c.CError("...") + c.CError(f"File {T.__T_file__},{T.__T_line__}.....") +def a(b: str, *args: rawptr[list], **kwargs: rawptr[dict]): + # args和kwargs是栈上分配的list/dict + # ========== 去除 Handles 层(计划 2026-08-21,StringTest Phase A 字段分裂已修复) ========== # 目标:删除 lib/core/Handles/(32 文件 469 模块函数 98.9% 纯 _g_gen 委托壳),逻辑并入 Gen diff --git a/Test/AstTest/.tpv_build/temp/_sha1_map.txt b/Test/AstTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 121e361..0000000 --- a/Test/AstTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,27 +0,0 @@ -f5522571bcce7bcb:includes/stdint.vp -09c0472e6fd0d088:includes/stdio.vp -7e4672b992208969:includes/memhub.vp -989dba6e92235032:includes/stdlib.vp -93ab1a1df8ba3422:includes/sys.vp -b8970f3b6886efa6:includes/string.vp -6394599d6a61cabf:includes/ast/__init__.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -001947a1f780bd5f:includes/builtins.vp -aa246c6e6aa30484:includes/atom.vp -2c175afd85852faf:includes/viperio.vp -e94ef9e139461915:includes/_list.vp -b57252077e6b596b:includes/platmacro.vp -e710417730391023:includes/w32/win32base.vp -652aff7c2e85125c:includes/w32/win32process.vp -22fa78c72db5c469:includes/posix.vp -eb09ac7f10988a63:includes/ast/tokens.vp -e9dfb296a8674aee:includes/ast/base.vp -4618d74293c6746a:includes/ast/stmts.vp -c0def010dcebadb1:includes/ast/exprs.vp -34dc6a647fa19b7b:includes/ast/astaux.vp -3b2a307c9c7d0129:includes/ast/match.vp -43ee0269efffadc3:includes/ast/lexer.vp -df83e214ee82d0f3:includes/ast/parser.vp -95a546a38b5b6316:includes/viperlib.vp -cf900a640e6eeff3:includes/stdarg.vp -662151088eb5374c:main.vp diff --git a/Test/AstTest/output/067c78e9f121dce3.deps.json b/Test/AstTest/output/067c78e9f121dce3.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/067c78e9f121dce3.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/06f53cc594b4ac6c.deps.json b/Test/AstTest/output/06f53cc594b4ac6c.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/06f53cc594b4ac6c.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/0c67644125bea0fd.deps.json b/Test/AstTest/output/0c67644125bea0fd.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/0c67644125bea0fd.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/28de517e3820658a.deps.json b/Test/AstTest/output/28de517e3820658a.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/28de517e3820658a.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/6446627d4f07a1b5.deps.json b/Test/AstTest/output/6446627d4f07a1b5.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/6446627d4f07a1b5.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/72e2d5ccb7cedcf1.deps.json b/Test/AstTest/output/72e2d5ccb7cedcf1.deps.json deleted file mode 100644 index 1570839..0000000 --- a/Test/AstTest/output/72e2d5ccb7cedcf1.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "sys": "0c67644125bea0fd", "memhub": "2408ce147bac090b", "stdio": "285b6aa29a34754d", "posix": "28de517e3820658a", "viperio": "2c175afd85852faf", "ast.astaux": "34dc6a647fa19b7b", "astaux": "34dc6a647fa19b7b", "ast.match": "3b2a307c9c7d0129", "match": "3b2a307c9c7d0129", "ast.exprs": "43ec967d0517abc1", "exprs": "43ec967d0517abc1", "ast.stmts": "46ea1349c980c7f4", "stmts": "46ea1349c980c7f4", "string": "4c39369ffedaddac", "ast.parser": "6b2a008dbdcddb7f", "parser": "6b2a008dbdcddb7f", "stdlib": "6c658cc728d0bbf4", "main": "6eed58d6587aba87", "ast.base": "71b20381eda0450a", "base": "71b20381eda0450a", "stdarg": "71e0a3ffcb3ebfad", "_list": "7cadfe07e983fd90", "ast.__init__": "876e256c06636777", "__init__": "876e256c06636777", "ast": "876e256c06636777", "atom": "aa246c6e6aa30484", "platmacro": "b57252077e6b596b", "viperlib": "bba983c61a970f7c", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "ast.tokens": "cea844466f10ac61", "tokens": "cea844466f10ac61", "ast.lexer": "d0072d5282b9b65f", "lexer": "d0072d5282b9b65f", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "d137b1f3311f3a7f", "fileio": "d137b1f3311f3a7f", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/AstTest/output/_shared_sym_includes.pickle b/Test/AstTest/output/_shared_sym_includes.pickle deleted file mode 100644 index 739433bcef0db3d8d8a9dc96051c1ae75d0052f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1742804 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 fwax@e zNEqZn-z-K7#F-V<4!q1E7W894kh0eNO)>Hyj%%nUPwC9~Kfi(gl^8t`M-^1-5T9lj z&`qb9WH>sc6P^U@DPp63wWsb+=RQ4HL5P=$5dyJI{ibTKtNy-qIw^)5u|<2I7w&p{ zwrRG4`*|@cAa*BLD+Hg~mFZh6DDe(4N+9;;dQ!rdW?lLTlN3(I(27Hx$m4g#2!q&` zT5Us}JIY2i2VwT9-dCk29Q1b8vekQlTpWnmxOy*_0xi@eyvWuI5N<%hAZT5*y>YYcbqlK0%EquR$D+De9QF9Rv!SH09kmCmtbon^MjHXl7Tf9|z$QY&OaOAvZM6xo{r^^I!mZW-PRnLXbmdlS02h46 z7i#)8UG518wMO4=HU1WA`Sa163h!3$_}+tcnON z+Iw70h!$-|uC6<4mG0ynE6)P*ePE`dcwv<^oG7yUn zs)GZ^;%eWC$g#+w%b7%xOu*n~7JL-i^=lc;8xFk>ngk(8VKK_N!lt1a7zcScMEVYr ze)!h|203bw!4NqXf=xVoVFKrk2H9tjn+&qwAUDH~r&~khHiO&_U)=-0?h_e34Ge}? z*&kM3!!3ivWPrgU#$^qjYRNeg?~(A2*= z3#Eo-DOa8PN=C zTBZnhDcZFw>1@oKdeX$0&H4(&__<>Kg(6$Hb=dm=H-U>GQ+7Lsk_naLoJy12!z(4X zbwi*+r^0ys&*Y2xMk*`l2LNT zDY-dEuWyHVQ-Q(obtahCmV}e3toErn{Sf?8^H&cw_>#gE4AH-4iA8xMQg^#hL;hj| zsqN z9hUk?R90>ky>VPi`nX)wy=68dD=V<-E>rYeaeb^^S6x8QgsMl$u$trK52PvNx@rO< z{pyj!$D${q$6|;3`cJH=3FykGI{4#FoQp1WEap{Sy0{r44w(*TuPO54+v>&3LD$%)KEOgr@qeZhEGEeIklhG4uCIbf+*^y$qZrpr^ zdcjNDwH9SEeGM}`UNs6$pTuj=LS3o1?6p9BhJ0sgIH~41r%IX~K2mkIH${`2577)R zaSI>co=aC^VTkE?_km5XzqT*}w6=>PQ;AtgkQun9^tKVwbl9USbXem5yG##s zh+`Y1F?VDIa}UsMJO`{9>{IK?u1wWr$?hb!Vj5o|yRGYd$W%<`MbZ*Wz#lSIRAbWc zt_YcKWg1HIt+xwsGpE?fza#Z)tH~J(UduN3`gPL8xjt+ILKiMEh1$He8?Jw1~Ap7Q3)1 zs$caM(x3>p-rLyj;dBa0a8sO15@~0JRYW{KQLczMQ0PjebZGrZayZ?&wf0DhljcZ^ zwz`ISc$8arz-#f!tqVQzWLm97hW8Ed$p9lw6hFuis;)Y}b~h>+x^jB9hAcFHYg?fg zy1sIH_);RpQ~aBt5x^dD<2mEy4mk&+dHN4JP9;*48EFY!`M@nM2%E&ZB?Zax4 z6PHSJ6i=)?yoL67p4*Jv1jm=|WzBnDHn!1oZ-+}7f9VST9w=-A277;qX0SPh-bF11Y5gE+IK8&TJL{Tr&;<&r0YaQzDa7{&yZ#q*D!IWWCww!S+Hhxa!2Ui}> zz_NHOl~dY+-D)-F>URuXQ4<`WTAE}3BP%4giPf&mxUA!1LQ8T=fTZ#6Cj#F2aZS`? z^6qptjlIy~Z2|xM;NP~>=`6Hc>RPN3t<&#X!NdbitU=Av`^&Jemb*ctMQT1b$4!w7 z=Q0{^2SO8EoXHHMd(Nd3DJ?dmV^8t;g%#(ub*~^~`a?ZKFqte7$?MpKy}!JIy-lr- z+rjE_&QA+8ztS0Q$#&2HR_7$*o|$|k7tJOz*zxFZw9@(Q$R!iJInT{-ix!+vd1Irx z*pQX1hMjZxbPJu&Kz!wiZ#yew@V>p0mM{D4O4+4vYtFqyXDcgmPWco@|FPH7eXP~Rx+dei!WKd|&=^Cequ^I45O`V2d zvwaMT960hJ?HvA(mFJM2WZMS43fG%~hfREuBU3y(Co`dR4BP+thZVBf>RqKWll$h@ zVh!|9?hsQ&-d0MQ7J^ZduF)OzBufIzb9l_H#TM2LF%FRGa`A3wvrjF&jh_KVKPMNg zImXulyAh@-(QT|7N}epc;IabdMo-T;ttLtXw@gXZQs!C{%iM05t`oW-7qiO@HNH`S7SO;pzOtYGl3cLn z`W8!?H%2Ku{j6NT<^n1U@CK?Kr++6GwTsOgqxhCS@Pt$??E<_p%2BC;26$uC@6k8O z1?+aSHb6NP{S&!xUBOYq%V+3+$i?b%HyU40L0>*CRa3dZHvWR0s&c`))bhr-$)rCk z7qBZiw*l_P=zo!m*4&u6bNXPQ%HD24uctMFhyfBx8 z7QBU7ExVKmX;<^Pg%K@xNl#}MW?>IOZtB`F{9R687|QA9@4B{>Sr{19)V?DFC!!~g zAC4Z24^%8sTOXy?HR`8xD3?ntrjSKpH;BS}Wm0L$DpYl#g#!$TL0sCo)i*MgAPZi1u+vfSQNCAUpo z8b+s@x$v!ZPi3Jao>Uh(PC{$UHjr5w*fCEM=w9=oD%BL2RMK}4Hb5UC0|q&2kU_Q` zHJHtns4<(Xb6V5$S?n-oaE0hLu^TV5UbTG`zgGUyfOUS%cG`Rz7JKP1ZfHcq4#h@R zaPR;*=N*SN|H@_B+#77R#k6SJob??}a=Vh7Js>S~Wla;ubAFp(o)tYk$IGR(#K4%s zX8l@53q#?zy2N2~vrDM$24mlC}%nB|ZD0IWc6Vtmbs&Q%ed7ja20+&LjJ?S1!s<|9~;1gdd z!mS(l6gnbmu4PZ|dsttS*VSXQdx`Wryg;Gpksst~>t;tTQLb=kqOgJl{0NF)qO< zC~{wjyuu)l801l;wC#kp3Cv<|Ggknp*D$Acc5>N%+su`#jzxI)7UOT4ML=HR0 z`sOO}-lSb^;ypZtj;NaFQMnn+t4s;qG@IpY$(1&t?j2R~*-g|`ED2pZ-iDyrb1N-e zP}~zwq|{_29peaLv$J02(Pq76S{8eYz9bEsxC1Z+9r2N~WXe4F1&>45mMSfs=Y^cH<(GyX{kO`Hp;a zKfZ#q60<%Xr?Q%Q2^rs~@bGoRv}Qe#%45f-zmEs8b8IP-Mt6Tcw*p|GeWpWX1~Rp? zAu?wWpGw$zE#5X@DfyqS;O~J#=TePf7p<^ov}Nrp?Ag&SYa9nQxEk=d8hG*6w(Hv1 zf9skv(J`UwQS3{Czoer!VQbLya1ZRB_`a z(Q|e|ZAf83#V3t-aPg#Y(}}o*ai>7q2H8?)SSj{A#L>h6uOtypUPvZId0H` z+W3hKbWtu?*LmFlP5ksNa?zS2LM_%dyz8BQL@w4nW!>a-{NQ&>RJMuJFUy6zy9{}Q zbQ{uhtYTcAu5vMXqx9y{gj~qxb^+TG+2aoy-pNLn)wsw2_tdcxV=&UM9zJ|L7Kue;vB6v!k2h=CY&si`rt>M@{eNrBNZggtQn5s8 zF(Mw*j)IF?8`b@tPK)3$f7~W za?M779Tjk+JZ&SRC4l~+h4$r*Ld)$Qk%IPX7TUvjXnTRTu?UDWZ?}{boZqr=K7ogG zvyJnzn&c=%DL}t#0iDJJ>M%6QGlWubb}yJpX$B7`Q%X#5lL2eTjZc7ddz-Djbl z#Y5Yh(ymx0hvUkwg0s*LV>}NR$$MWYs+Py@IZ3P1VGJ?hZBB<#V4%sZesbIDyjv!h z43ad+l0i}iNk3O)qg3*d!WNs=;Y2FIac5WI_W>8f%`f{*-kV?cn_p_R#Goa7WdRwu z9Zv?j!)olZnu?0KmM-?!JnsRcy{8x5iO1-kFytq~Y{asV1q(Rs(wqWE`ffZwXEinaN-d0DHOk6KvvaX+Lv}7oGxO)sn4UjS z*ydXSzW1#P#trF9uI}Li8i#?uWos^ax8h;V={{&aUQMB!wtb*v+s((Lm5+m^$H4Me ztzUf-PfWJE#3aJ)MP4P5>mer zbtw{4h5V_2m*iB44094V6pxqNY+l0rso-Fm#SV*C^>7FjDZgS3KoT0zHS_YP;G4HSq33=fg{5NSXU$7MW*+heT4kpyH816A$2 z>Ai}_N+(_gR$dKwDZ!0;RYQ0QQBH6!eLt74!Q-W)Vsj)B4^o2uM>nsmfbZvl_Bjw#J06Osp%x8^DRQ9M>Ux|f;KAXf1`R{1eJ zPCADY?nc=*zu;!H)>12hX4;>?W2JK_lZl|vPeQW2h{s9iP)4$9U@0ZA@+a|F>6C_n zKPw({dbqQ8KV%TBRP{E!6_2?)!)k`D&V(+PY#7?t^J3drJlM+uQ8RJWAM9N+*INmg z-nU~40*o(-s=6r%sdP+mLS3DL(3)Y-PvNoIDcX+1d53kmLhiB$kJr@O9%%Y1P5;w) zoZs!LBF$<9cBCf+3rRir?^5;^?d#ky7p-L9sg(nM+OJ^1&#^n|^HT%MC z0ki&YJWlVjPrVL%P@#!E2&|>FcDx6Vq0Y^`#ZV#p9bD(ux=#3cJYG6Ul4}Vq85AV? zf0g@wJXSh-_OhAoS5)E$>dP58;Wy9!CsxRo9lZlsU{-Y~@ZM z0S38bkfcGD43esEYr`+&Nx+Sc1SFO+NzGhwYN`Xj)P0}@iV>Jk`-*i>_5IIyGT^jZ z=a!%>&lCY6?gvp;ttji)@c6j}+O4lew6LCsBQ3;A5oO+*HyIznW2=+HWb-YA!>!C`*A$hIvLBXrsuOkfu8?quHVArrIWGDs)?MKEe$ko zEsgsLJXSi#axs~X)VH>R1vNESR!6@kB?4yOd=lE)r3@Y8Tdq1KGB!(80};LuRwiFkOB1HEBZ4$RyyvjXaj)9 zZA(zA$lc8G6@13(*=s>2(D%_6U&CXhQ;?=zjcOS^Oki$pGMM2e!Q=gNJf1o;F0P1< zI}OzCda8*30*|v!4FltB7z&AlxkCQCM}LXOPA8;^=Tp(3;{O>EAyI?GLPT38lG6Bp zg~!}d7AXliK~e4o*@s%$hp*#t(+NtKR6QEZ5cgl}{tX^0*>a>yT9|Ea4Xge&(XCo| z-gknh!XEvN&O5X5{7kC{$j8cn8iS}fqHG?(b_@pxM5ebQc;*HY2? zPHK%H)%2SBi%zQ0d@Rq23A&uCvitvtCj)!!>$oMD3J2q%>N?nK7lDB1RXqPT9?wgI zp;##7H^-UZ6&(0S46>e_)j#7g-zjG^Bd2gw4XXMjIA;Hf&(D|^O=n@Yc{V5W1}M0S zuTtFq3y;@MZShh%mWO8bNIE8V-REJbR}GhgX%*hnD!zlq{w-EKt*0-+EJvYJF2eZM z%#(ZvhOvZT8R<%b18Qc_Q~bT_pE~1V%0FslZB~e5$RDOc~?}gG`6W3@l}t z4Usv6oL^;=^V&kecIB1<{38OAifJ@b@+l{G}^?f&YdW`1|p|-{j_eA{Vx6+rol0@X&~~`{}l} z(h6F-8J+}8#KFdq#L9%{^d&JP;h_%?iP7LeJQ`F4;aQeCW_S8_B<|PgctVT}{di=! z)pa`9wuBN1tYpNCZEe@JvHwJNOj@oa&599W0FMZ6S*RpJec1>4W-;i48v%NKX$Jah zV$hG{L9g%!nMVZsq5L}dUll|DFdq7fAfBOT$;Xt~br1Bn zJ|pA;Jk}uexl4&mI3<>6^+1184E;$w^mn?fUf4#T3qz|}7%~RzAc&>YJZKRWqs1va zT2$l2zs)x~2&FYovTAVJwXHpB=rf=3W{0*P&ZWdsq77QM*vfeLbbSd1K}@yJn; zIItoGAF1)B3Tk{=j2dV0s8JytYSipe^^qLktsuw0i;?3T9yuz4YnE+=jjB0whlG$P z<#k?e3p4d$s@DD@y|esuq)6{EpX^#ndOth~1m5F#?+e*{4Neg?5E6s}0;yfNLD$bf; z7d`aNVz@6f2zU9=h(>E(M`qu4_mTOSDHx`hfR6di^3y<(exm$zv`Bxa{4`jkpD~{t zZS)85B%qC+#3Sr}_u(oNHj)-Bx$vUwx5^X(?fnnsC!p-NE9mtvV)R;QIK5y3vDih5 z7rk~p>z2el=942)``}4HqMpH{P(@6ggLGn4zbd4oy-0JSf*6m85#w1rVpQnsc;YJL zm(p2Hm?R#-Wmt>`5j+}HWSQ*TGOW80k_it2yk3j|F+2iPczhNCSf6iC>{wa)S*R!G*lt@C(D7(c;Ud^|X^=f~!;R9MENf`=}EZFgcfUmjUicMHeA zixK08@rdCe61jXN7tJOzVg_;*irf|zau*7C6!B0Kxn#n>#+Jv$DDb0r6!178Fa*Rm zWBIHY0e%dR03IR$+EVi^i}1V{1%3jL0v;mZ<9c-ZZZQHB@d)4{0+FohpBDICF$(-7 z9tAuyt6&+#eFYE0K&>hP=Qj46Vl;Ux9!)B8j4<6!gH$tAO@yIvChyygwQJg$+n3lJ z6SACdZxD5$Y%QwlCUsKjm|*#@hsX_*PBGJii~00v?CqvYLhC0O74*<%owq zrH6nJ<>r(=F|zz39$7r>GSDO}y3WIkB-0fnnG++)2k=O8Z?)~s1LBILL~7pzuyoe!>{3yp~Czwsn;S}SkHra z2vJ}aq3Dhanc|P&QNzPIXT@5=cGyEC4vG=sV|YaHxO!k0QQ`+<6|oo>qsYhcDB|I! zXEi`>+@Z zK7~gD5A_HwLCG{+(+b%O5B2y3F(P~#j|d)e01j0;D|RjGL4tn~Bf)3zNZ=8%#ljH|h)q9HCKS|t{!RsA}C%%XAwRGTi^#P%`+wv6#MGj12z^j|?8SByyMe(pfQ@d{jG3%+81PWG&2 zV|p98(IEQ_a+5*!8{}r#<9jQ80*12MKkjgd^c^Jq@TviW95u*bh#U*$Bjh%N+z#Jc zYwzzeITa$qA@9}Iz;O7PHiWvi+t%bZ{p?&o8_r3fA37h{rFNrNmIBxR8Fb4BKF<|8yQ5jZzI1O7V! zZFmQYZVCl*!;_mU0d2T)GZ4^*OPj}oK$A<>6wroCn_DIWUCh(PPX)B$%FUYs z+Hh&};ea+=+Wd7u8!l~jP6fJ{r;DEmXv3A8=L6bsY4fgtHeA|#GN28YHh&q=hD)2< zp9t&}&rY2TXv3A8*9WxW(&p0vZMd}g*MK%$+T1f8=whBOJ|EDAD>pwG(1uH!FP{z0 z6z@#+js>*g(IyknhI^)dHlPicHeU>A!=+98xj^6W^vys(8?M}ZCh%{#w7E_R&J^!V z^#`=!%FPo2ZMd|_1hnDO<|hK$aB1_^fHqv(ylgzMQ#?C05zvM!H_rvM;n5~9IR9;# zEE5P&G?9+w1^1rRoN{N>nsT=t#u{$Qfx@UBbVt9Ng+HH#$%k_WIUgeP zA#%YW7h$H}Q!p5B0e*jmL`c-&k2YLhIrF4&g9G+-J{8py>C}iOw(mzA@s8CIU*{v@ z9S-7QHVGIX?#|WWUhgB^k~9zHa*4$h@{rD5tApL-BiLStw`15se8cKM+kFJO*#UYw zokeEp?$wcY_=t3?gLGba36;2N+Os;=P9L$B&g!)IYF=@$dsheBXO(VHF2))TODeTk5J3jHJ!@oYD#RStT^18R)^c`Bixd9I+aLGW{{x#ymH?>UFqNcV6=T8+lUTa^s-9_U^+*u7qWJ(JL)GIXxo z%?7)VBiQQxR?<=lEd~zvFdOcEj&Q4yctXx*fw#B!v7sK|2(=oC`!k9>2aNT8Hr87> zVy#;7fR@UssXX+;^8g#}tsLQ2!|`x3t$~N*2iah6;|R98zb%0s%4qIJk-J}Pd)R;v zas*s;+%Y*9L%@#v5F6|59I;j{xnI)~;3c>tY_NBD0d`bQM&mNDvPaoq@8k%!YQ@7d zq%Z}HwU>?cE{<5MS;e3lgHDc*v7z405o&eM6H=g&_OX%P!x3pUrx;bUIir#cY{SRd za1U{WTP>OsVOxOq1RL$W9MM+AH9WQja8I(~c5{SVEg+v!Qlw;_(=zZe`4k)SVUCci z>rY@_R-r@H!)&bgd4ctkswCpTaq1B^*84ePt=7s-tS#6LJj%xV07tyLD`x}bW)zuR zpHt!&wr3%sFx zG#ksPY3Km`BpdG$j(Dx)Dko<$3Ur7*%|?5aBiibA$jF?5SEB$MYA;8q)hr{NPlI2r z?`LB@<^|SJLXAOJSO?fx`#55)Et}w)@_WNG{ZRs`Y7le8}6eV;a0=4QKHHyNJ+Kedgllm z^J5$_SC53o(~=g4&ND{YU?1lQwz>wHXMF=Q_?4+KHr^*V;;kO$ns{4L$&lE9pX3O* zTD~y>ht$+8xy}lHLwlSJ`ZPz-)v#3ptz6D4DexV`1RHaJBj##}-NZa5r_)4h;56$z z8*)EK$hFRFK0gKqJjn(;z!7k5v<{J44lv#j8}A@TywyC~wCMnJZW(5y4SI%l99r8c zHrgSMXjhXR|3L04umNAF1KC~Z9MxpX1`WM-_=V!NVmCS>p`(XUFKG(Vr=#OKIw7Hx zBOUoD+D&>#?9tI)9qrT6ejObkJtJ<#=eKlpH2Hr@>o*q$Clmy8$kZ-D!wY#t?5U2bQVx=vtBG(v18iM9@lyIi7on!d~^@k`=C$#90$9BV0KuvSm6q!fvSCoDp_I=SJ8Km78J8eH)P;7rKVCk|x}WZaS0} zz`}G2UBqyP1wAy=Stb06zOCw<5~rZe*b&E|baqw`r>;<2r;4~-SWOy`Dzpx8f*&t$ z^JT9=-{yO|?tY2=Hs7rA)9}5`x4v|VriU86J-bK)3lzTyuH-aZNuHPaDoRpU8qbu3 z1&TicuH-XpB{^K>t6pr|Q1(gs$3}S5jsx$#alqMM>(7 zHqVrV1&Ut>S2D_0lIN7rP35(++4Vcm#Dv9)cRUZhuZ*$9|TEarbkAiEdu(jkm#@5o3dJEGtF=4Udad0tb*kbaW(_4wM z#4)LN{yY;C7AuZ{i#f{{ljj)XEoIMae!tZ-IbqS_d2l%qTTY&%mMa?*c*leVir)*a zq{>#3=NRdAWyhr59QMp5VR7P*gA0k-Lh>AsT@jLY&Dk>{VR7PL1Q&9SEhNvW-xVQg zcd|Vb5*8=^Z{R{E*h2E0WnK}Ic7fb8Az^XiKLZys$rh65oc5}alv~T52?>i6e;-`P z6kAB11L!M4(yr!vCL}CQyy|Vx6UgFkEKvLwa3%9>CHHewvT_BM z{;J3`DPfV~_k&A$g)QX)FQkOOm=22+|0KAS^K2<^;V5P0xVhPTEzkTC7AyWDxR_Vj zV&3Y3n9UxSc_t<>)-|Lj@=!vC9y;@`Iz_t+YlgFd>_RFg+U!u;?5qx{N$R**@z$}h z=B%8hPuCFydHERh+B>03#_z5RAoj?_*G7sF4vSdzwZm&lUw(wD^PIa$aZ4 z$@4|1F)q@Svsp~_Oifs@_!V$9Uu3Jv^HpfoIh(Ekp2-P|7JvIJCD!7 zO_&3h*2a*Uh?7;Ku|+IpPj+*z4f>MS23I?-r7b&!&QLB%2{@i5I$x~I0c?A&C6BON zBD}T1tLaP&Cb@qJ4&pizCDIF#Y|h=xSTY1v&deSuqF1gL%`cA@@m`X2T`wx738jq} z<>2P#i}Ko=I3rt{*EJr@+H_8&&O!CMA8wIS#akO8i9#f;QQEXJe7Aw1BEDFsU0BI`;jCn1L`@+jqjI$rBT@+AT?qd^IN{e3;fd;U*4^6P zAU;&r2Wo5(HsQi1-VbLJTT4rZS#2RZEWV~8#CIY72jRru6p_N!6i$ zBd1j5qa4Rsl}?UqPIEZ2(H*fB|Ij!b13R*D5d}U1XACe(*(@gpgma-?q8WX;9^<$NjRg}R5A(@19%q(g;qG%XP2qsD2$m*MnZH!v=R!jWMq?8*pA#X-r1jlY?KkzDc&E%}m2-B~&r zJGh7vj%rR}LkZ;2=y(7c=38hmSMrBh)-n{H1lIDcG?1(KgIr(IvVVMh6d2_-8p=-3 zP)g%c5E$k2G?ZPQp&U3HfVSAT(NM1Dk8;z{Xy8m_I1~wlE=dExa=x7g)Qd1{0u2q1 zO^iZY?F%%R9)#JFo@WE0NGJ?$xbL6=^&kjsCAUj@qHVAD z9zUSoSw%gRPsMVomKs!MfFtr&w$MCZFy2yyToKwg(6?2g4+TF3>~m{u=V9RA#+C+X~m1% z9r4C0;vvo58yEM^yOS+0&!L%C0#XsT?ICZjs(X>#OodLXcd_;5IZAVP6>LRcAAq*j z-$^Bx&p@xgyV(-+oU!R#fBk@ZQ`NAI2baKGraf$hc@Ey(RmECy;`YaE=_|RtBjSD$ z-pkgP=PXXAzU`0Mwinh?*_`b1dYF5S_pvqRIis_|Uf377t!%4bO^v%d*>^AUezwRw zXLmZYEgyiks`67QIkNz+@d38RJV$!&bu7ldfNibE19Bn(oNwL2mYC<5Pv?5v{+KN< z9?+6TgEU}?Z)Ho&bN;8(i+usxs^u9w2!&LqHR#>(ZET@=&Idi<2-ki=Zk6_iQ#mCg zljFrJ&|ZCzEjG^?qRz8L-$1w4tjcj}cp(if_w8)Cc}^O=)#2Oz!EV(!2bF}9gI4+u zw$eODkveOfen7q5vhVzCOAb}ptjDJ$uPWx76VuLFk5Aw(^Z}4%l^P^<#)?IIE_tE-3w#Gcit~&GS z_Q!1H)BPDmo&(Oe?q>_ka~P{LpY{Q0D^d?=shpb1LvNZMV2jLiNUJka`vbR?bq$kl zk>Hv2gKU*=bKS6W5hZn$(venazEf~!U4B4qoiCTr4w1gUz#+Sbt@A;SIy=vo{es+D znaAW@47!y05L@QkIm+x@nSB7-irD>{mH@xlcZ4nR9ULWgMr=Qzwlp4g9IcPC zHNMkRjs1Yyiqyk1tk$z@8&45vkKDwn5{FX z5N%qkXYB;~*z(@PQC{bnQ`?720pny#n$>TN3ESV zuKk1E+C>HCWtX#W+#fYQ%oh4SjzT+kQ9b}|DSSy)T+S?Xuka&mh41%NVIP3D?pd2) zTW~z_C|l(RII8TtXYCWtiEO<4hq;qHGR6LgR=J_2v~b|5pGPb#S#^rNXE zw%R8-s_pdcHxBTZR&=cBF#dU_h@K`xD5uHq&!Q-b=_oEC#W`(KM+xUs1ncq;K@J?q z&#=Wl#ZheM<)OBRY;BuIl!bXM1HElN%U1YdjtV=s&AxzbCEbC9Dnp0tVYbGPaMak! zN-FziAAq*54H->xhI0z^!>My@ksswKvh&)IKX6;dZCnk@C`d`QpbP5=TkOX;itS9f zeFWZmVl$qWv^aFdWRxxS;~b^74&E!l+YhL%ZI$^haDWV{1Emp@Pjl4Ud5OqR=&k&$gj%_r zS5n}|920EG0~{rH=4ULlEOm%2^&m&7DS3JO1GnnnW+V$h*GR)`or4^8cGkgt0lQA+ zacFOzVyisly~^zl+p3t68qz@SDsafYP$M$_?YDMxpa~tF*U_YeLgXAaEG<#vMKr4; zq$5>FSVwc@cvg3GinHB_)MV(>yNfkYuN7@L@vj=V!y_F_#Hu^6I*+1j&S#0RJ)><8 z**dukkr%?yRl%p&`mW%pueFsbIc|>+Fk9Cv$V?*ONOg%V?@EsHT05t*yls!zT8YNf zBWemdJin<%U!1w-=}Kf-av%7+W69I>*X|}jL zS0RVEZI9T>A;&3=a?P%{1#q8bE4+$hnqeKgRTP$U?T^|D z(1Yp~-~b(A3*5<3U`K#%d&HKwV;Xd7^&DH=E-%Gxd&HKw6WTnm=gMqxS9>XL+atDi zfTJO#&Oj$uQMSHoIO=QNekd=!egJJrJlP6~V{D1ndMU9VKwDMVel-Vvd=h6XypE&7 zRu#7F#6G}m`7ik+sIV1Y&rxAVnDztc8i@nowb&W9#2Y-8xa~n(kD!JUnwEjz z7S6Io-pEm8>lQ~jQu_n8wPAv{Xv9`{6Gw#|rH-~oyrJ4&0X)xA+1hUAsI7ImuH|cX}#qn*+9_9fp2@l4eW0%S&n7 z9k6wTFr1Y%=$L$&t?q7)>N<`Pe1O^JyD8w^ZHBGx9**id3Kzp|4%qTt;iL)d7drsEgS`Q+|2L;XiH*AODW^fACWs?iv~^_`x+gtX8OX9L-VR1A1O`0g6CwXY#B8_@Z_hP1Asl*R4w1#By9 zh14Ycu%hd1k$Jv~v|d$JMD_z}%ahN_*%ov`dXX(M&&QEYPxb|DYx_@Z8#q>fwnkxm z_q*J!Op9p7*+HdQx0p~a37t!Su?A|*vb5x`I7`H7-2^qpPqmbTalNRN#?s?&8pipkjvmv|6eDWqgnuEZJURN>+tcU-&= zjtiSJsVPDPxsB>-L1Rlg$UbB+*EHYQ>|W9Fv{NfYi!dOsXV*6@vzm&qA22rQCt zJCT*bRfUhdJ3c-L$A?w5iIDEUN-7?SAvNLdp*DpKGa&bxvAM#_e|E>qhv0az_6(7z zn$psdnT(co1Uyd?daI}%=M2?=t3mJg(xg+7jEg>P6OmiZk z>$(v{E0(a9d~%VTybMQzb&MQQk}9`#1>bM-P>v9|$NEH;mf8gFm^+R>0>_bU{WUn^ zn#^9Xm?2B>CF_%er)S;q^wHMwq^9`U(+d_egr|2|p9oJcnx865(0knR^l>^Ht;E1x$+6|suc~bNI79Xx*M`rYrPs6mqOvluoQMhODUa|T*&`s3fPeqH`Z*ru6(%IsM)l2y`+S8XmmUPjrT1y zyes+Rtyeb`o&;9+tu(Z&_@lKJi;}wiw)|x&v8aNXf4n+c?OVR+az;CA^_B1$~h(p6;6Qj@u{Q?cI2f?{c;j@8I zBoqd>>37f&dl0eKR(c}k8)MPQb>UN^5n^$D`~a39F%po zK|9>rYT8CbAt$;@*7ekDVJ0_lbbEk!{x5x)ILI<=c!}zody5D;fh1MGNKYgg&Bx;l zaDlEs`Tip#dw6oN*mRhWx!t4p97>&kfj*hfyz~yH7{Qb#!78ogCSkkCF_fgL8(0-%7qQxt_D^B&8bQ zn+LZQml{)mANx-o9c>Rk?_K&=SRWb-jE+Vog9FgTxcf;&I8NlNMrLT@Xa6C zyBr6fG~hI>vG`(z$LIWw-^&bVYkYnnpUG;O2`#JURE^Sb1pl@n0smCF;yL)6#(%$D z3+Xlu9{(ZvSEls%@5onPlCWVukjrJ%Xg;S`r2BHgl0o z)1*zysSUEv8In23@HWUAX>qNoB#fWJ$FcEwpX2|4&+-3+zwvvyEbNHSkI7fnWIkC6 zicPZ5c3vJmrMR-+7?_$2jkjc@aiV^sf&VMjrM57#fZILUUf}NmX93X*YF3RVXj`pS zo%CGDsH%Fz!f)L{R(i0is+U&3&bT7ficR&y^|oHvFqKkcT3i`GGG#VXt5VzjY*dDH6O8l)^?u9sU&RF^Bc9jgBY_gW5c8*XxT&SJ*f|siYM-H=yNd zk6l_71c3LyTjnpQnOt5@5VIH{QL%B&(*~^u3``GwYDA>xia=@`xZXvs2EuU5VTqxcYpYP9;^T(9$tshVRIIZsL z3-2#%jL!$JknS8t&qdmyfiIZwG7j#$I4lj0U#uKMhlbx2Y|Yl;Y+X2PQX^{TQef7@ zyH*>ArHQE)?F`S=$=h96XF7LyAx+D1{Ba=IWzs;|2Gv}-_@6Jsp9UHm`r6aLe>HxJ zhNpqP*vjMe)K%FR_KI)uIsP7><3D|~;fJka`#mf7FcM}()332sVN9l*7y~^BZS%t8NWj^<42*omrlIqXT z%qW@R)QsjTZ*ci?-}RQ--{Il{prKePgxyf+7a17|W@AIav-jA#?KNCpu&@Fr+3Dwe?YQTV0OjluUr9 zwX9T65o0Mgl&%y}&5xw@b}7d-KlQPD--&eBRk|C!DU9kOPopY_AYoPLf`l$g=qVjt zB3&P!CNICI$?wmiD2nMf(8$uoCMphRRr?*G%FA_47**?xY6i}zHeDo>hoQA2+M&k5MF_^oLfo8BIT1& zB{M!#-b9(9$9!i+c}FS|7#*Fz!G6b{?X<7L*~*@wL_Uk`R#Lj>=jwREtm+-9l=8}h zc13E-F|{@3h1y&8d-yb9tCiY@)m%bxm$;Nof@HI&?i0^N(5%isCo!gsw#X*jr6d)b z=p;8Mgi+Lu?$sNN?rmJU(VM+)GKP~v8HH6KSw^6!T>Gs=3e!lARu7DtZf0Ef!0`7a z@wd0mM%)FCs*O}4hcFV)FE$t>Qh@@=#y}#W#mc#;s|2*!lOu6m%GGtLcfskuVTiml z67qA%>G@s3ybdS-PHV$a>V?kvK6j;}ZY~?#Y}%7{mYrC>|IZl-}<=^fbMz}fMZfZaj^+sOd?Qb)&% z4&$HZ7nvJMyrV2}xyNBEEP5*q_gV&S7jU$I1IjM?W2MAV2R!`G(H(TGdVsb4MzG$r=Zv8{WPc^ zM6#_msAr79&cL>OfQHqB0JhnNbuu^zjPw>7QV)XFP8-r;iR2-n;qWD3ytmTudJv_y z^aln;TIaC0(V%(|o3`4Zw!&c#(y)54dDv{j3h%JD(~x?wY1nB)+A4>=gNE0GJ;S={ zz&GHibSDj@2W#sF+pHd7n0L`&da$hSZ7_<%oaG0M`ED9!4;I+&=U3 zDJO)50}jlgvB2o4F+&IX@Z|nl;B(#rzuy78GH5z9VC;V?6NQGQp>bf>K2l4>SG^_T zZYmKs%fxN`0b^#1cRsM+$-qr9eHnk%Tikaza96Xj*38f{ruA62)$srJ7XDoh__jQ) zH3ZboRK!_hR*83Zf1iVZ1{qvS<}lX|Q^UXIEf2Rkc(`c>jp4ud7P`|1tZQ7$Y9DXj zvmuX(o+qv1t8+&13*?iF>+pahHJr9!5#n;DLWPP?)ll&ncT@mQlWmS2<^_?|lk04E4I^J9wv`&~WG*F0@qHSn(g>?&FScF%W`WJL=* zNuIXT$B((=39xhgVaEz<@dVUL9>?6V1lTqG9tTU7%X!^K9lysNJ%Am_@p~N0lNb`6AFiYdeJTz zPg?{MIwRJnW^~TDqjRRF%5#m!kQCa0#M>P14$~+Xzt7HKwOvnrpIlsY#~@%!*yap! zb?H(I;Yx`7<)tzB8}1kc?1t*xM%$W-@qFoIkC4QPzr8d9|G^!BfQ>+#66m1??)jK) zk*53bZRD@HSfl}aU>;N`2a_&1gbvVL*;0`-rGoM==YcikiKKKXjpkIfp88tg*@T9X1 z-v5c}Mzf}|4L(Tzz{S=Qu!oDYUU@S%b-||<8*o(^j0}NWN#Sfv+U~gWZ(z+kj-M8Coi^F$-uZFyT>@6 z2sL<&-0tmUoZUEl(O<@C^ZsZ!v$cLN1MJ@&%Q{tEL~#iz&TjRMW}p?;g|#^)6<$ay zz!*28(ZWdlk?E66+BXaD-(Vi=5wTQ+@Cx7W$vAeJ?n2L|dnK>oX7!!K!@C!xq7ts+3 z9X*VC$^WlUN5^$^LP94;I>*&BUMRaQ$jWsK*k(BvSHAN9! z5L8$_oQf-{oG>6X*D!9Z9#jNBI-(At?QJ-qS2$K-b?FANa4ec*g>o4+H7od`@UwBK zL{KOvXGD0WjHD}UDzh}E#^VXG%F}3CU#5v9jKbk44!3eVEx4g^BP9ek6mHfGXvw5V zp{XfiVQnxK)8b;Sr!tgx(_@j;Jr>cdj*yO2dVY>y`!u=2y|G*e*n+l`uZ-FO+9fsK z{7dLI9UUZPfV;`BLvCjfe#`i-LZDN}I z{w#_%ok_ijk~&K1NV`_dUoS@U(ZY^uVW)>t4rvp__&eZ|8j}_olCIz=={8H!rsW&Y z1ck+mUk4Y|m?p^(bR|bYw_1WWD>r$jCoEjN<1^4P*SIRq&~ueHdNwPMd8Q{Y+|8Ex zN^+92%k&JaF%y)bZ6`l%@gv~IYm5P90PNxiuwV;D%}R8h=?M!LOW=AMLrxibuJ%UH zW+g?>^n`_rqu_cPGh7*ZuHmTXZY$cdOQ4>q3JV%v0aw*{R>4qpEk{-NI8<#`vh_?> zSk(AE;IbNncp0*;<0$J+hpf~RvuB#ZLdG8h*VGs<%+Pc_M@=_cn$k+*o@ogS75@Ub zmd4CvhL#(=(UMle_e@JzsQ5R*wKPUSGql{uQA=A{tm%=1XM)1w#eWJes4?)GA?PNK zf^N40ZSx}%&lCj)yk63BBg(?OmZ2O&dj`~aEk#rIlf&E(CAODQ_V@+x>LEFiRU(ZK zi9J)*cml>ymFKy{=8CF*0NW*LDR4oJcWn$od7evbstD=>tX<(u9$Zi3sUAa5p63!( zJ$-<6L&bIjv^!m%gY3RZuP7O+@;sO53S<{jF<{FzUQ9AD@~qWY1Fo;I&dVya?cUASm1niSs%w8nk>`MI z_#QS^o+a$AfrOle4!noh7(U*fm3HN=_sefb)b0*^+MKDCw3;!1V>%YF0F) zQQCiamMiqIb=}TU*Uq7gmIOB4hu9EzaD-UR71|$aHSnHEXi*tD%{{`_btgw%tCihh z=w$aO8|W^MK&z?_C({~uWw)0Nb~i_`mZ~Y>uyl+KbdM)Mq3dIPY@mBN0J8XM5Gh*;w!3h_xD-E~+^MyxKg$hI%JQs8v}nsY(L+KJSxk ztao{Vbxh91pmjaX#(FnLtepcg_(Bt4L%fG0#HyFJKh(|^v^?%-t9i%^HQOKR$|2~i zXn?Kdy&ScyZeiLT=&GSSw3LHvDZ4pJSxs=;9%&~*2z}8r$QJW3M=`4_X8S{3Ye3AY z8nk;3u@$|KqoUO+pg-Vtk++uMui4MkN!nfL9G#FU#W~S4z0f%+*r9d_CAO2j9Bo`v z5Vk{XN3cV;oz{Z zr_dQvl4Pn^qaNLY9rE~>a%eBODRc!d=V`Y$1U+O;4`edhyl^eb;EL4~iF`JAS@1*Q zXU!OSJtzojvZ*j;Qwam2&BiON36Yn@NDxFNXzie2sOk8Y!nz416C=Zggb`7Vs52ng zp~vX1Kr$_ihiW{lFZ7Egj6Oc9ux3EcD8j$!{weAe*5SLR#8Hi3% zXYjIE-l@y`I?{k8A*)G25tX7&BL;~GO^MKJ$`MEqL?NitIOh@UP}u1*Pk97A6nZ+v z&Z0?qtjj#V5XM6>o;Bsu3qcTtpjD(gFUX;g(`nS^1v?aWy3ESFpod0JSWU#meP^9Q z&l>Z>s@QW;_grg(iG-TYsv>cwnNVlHoSGH!r?G?O(S(l9>u6F!A#@Cdr6s=HTST)u zLQU_4;1@nm=G8U2F6>zom9us4*lgf%-uP+4BOOZws5<~IqNI*eI?}Ec^Vf^fe6+CM ze5=<(e=64|K=Di9N)EG?z&NSMnTNNuHzfDn3blWapWZut4#b z!Id0gE6H<6Ud1Qjm4pR~zX`77C|gOMgYk?(?c?d5W=}gk^GaB#_`ic|ImXtK=M2EI zmd&1_E>p{wIyzQ#82?CUKr%8d6hvnZzfhE}6}!y$hzn}I@Nm!tG7+lFowvs&OQ?4z!B<-!YXF9^d#Ls~17-H+l za~NfLm2C1Z-7_g+k>bnXQij=5@|?O^*^o4OL+_cEuu$>4!L^)XYsqukW?9Q-@BKZ~ z5*8|c8C=T?Y%O_?72Q-?Dx3Bu@JvittoZZbVqRp6$#tq|Nz7(_6g<-s7ApRAa4nx= zYsqt>XxTBFb~NxzOjxY=Ti{||VvEUhmgwekji5DZ!h*%$23PYW?=hS8Q}IkoSg816a4nx@YsquKZ8?=~+WW;bF=4UdF>o;>Y%zHb@hv-M zvpzMRX$cDz%ivl*$JUbPoZ_;U&3fv1rX?&?oCnuZW^2iF40Cyl*}VUcXKKQN#X7i} zQMQ^qr%abUvsteq&$NVvia!djWsI#Q&pFyQ&!oS8_DoG!u=wY})r_;%x@2Np2-P|7O(g@=#ngA%XvHh$Cvb;Wu7Ss3l#4HS5jpwc?U-&%Z|zD zujZMYuxRmNa5*ts&O15ES;=Fmz2H1k5*8?a99+pcwvu;oRI*%NZ`!xcGcjSY;`88Q zCfH)$%~8y%d8Q;RP^^F}nPe+@4@V`-htW;?0eU7SEKXE+OPOX%+09YPa@y0hC!}X$!eYf=02lKz zTg<~8#VkLfrS`A%Oh{Oq__x7@%&>*LkE4*~rIOxj(=#Puf#N?0S2D|1@_vp=mY2#V zeL+2w5*8``M{p@~Y$+e$FJ+S+rk+U&ixhYLJaj!h&zAB*j#5_cQfj1e2(90$XJW!) z#rwd;yuuc`5J+mQX-P z{qz=8SL@X5#(#5`_H(T2?C2o9$c$EGMg+y49(Wumi&t)ckXpIw$+`DZMAeHn~&xe(v;5R*e5*9%?lp# zQT*~4%^!lBoBP9B(;rrN;kH1|fb&%Ft2Z?Vf7+X1&_%v2Trj{dQt^MLkB(m=!H@@j zX9q~Ua2F*0!df*OnMr6eW%i_BLLp%xrX|w}f__-R`~dbg^yR~7Il&Gj?aDkS01MMxIZ%4CC0dOBE}Wbv*<=++}a3PMUf&? z)=@7K8T@fWs*#cR)y27GRf!jo+GMD(i88HeiN@K2Cn#Snq5Kb!C`q&g*77SQlpljb zx!$l?HI-8`DOYNC7dqw4?2#gR<$BTl@@Nt7B|D<>r`}>=m3pkVc)h5U&S@Iw*S?6o zE>5UEz|#;)LmL+x&x0(OhLF&-xjbdyGsCURc2E{y7HZ%4dE}45slA!_yqb&5DGT#j zCQg|lyEMfO&lhsLaPA_U-0LGo<}ac=z!|y=L-+)oA#5r6y_Qxoa!$(#$45`;=n}a= z@-(?hF-?BA<^1}R%Azjx{s}m}H?)OxeTvOTy;O!TeF`tML*F; z_H(8U^cgl_eiYj~7gq99a8|Ob#!4aymF)OscLkgVTYjgt2zzj04?hiO4?E>-uE(^A zY){x&GQ!k5pNwsw`}?;WYvAHP{xn%BCUkUON0Sl?-N@b6MKr4;R4Q=jlmdqxaWEAh zlQVOQyKw0q@unKYHCK7@*A4h#a@BWAM;9b?QM%D=Wzlh+_qIkN_xJ?-b{lv}nIBbC zlsnCy+4p9)+ABD!eTxln)unrU0ezbd`fw_)q$rnlJd=70Tk4e@r9NQ8Yf0?~D8Vq?FZz0Y_V*p1lVYF1)Y=aWb3_#quzJeP+Jk) zKlu0B@Rw1KsquIMdg0#1mVGTp+3&Q$cF67r0(RL5DCT2mdPk3EP`R0ZUc?)kPu=s=f*Tq)b599wXxvN*yP?LL7bb+=(Cp^B!l$Tq^OEo>DmOn8 zc0=XnYr<}*-2Bs9MJ%Sp;vWdRq1w%^&k4Js+0Ajm4b^U@1UFP}HcSbhqWRRjh22o? z=Ep_uN9E?v!osI$KDFtR;D*M{lW!B;(74$nxS__I?@GdMXm;}}Vx6Me&8+Y#DmU*H z=TlT}{#^JJm79OLC}J@!78k@`lWI4IgileqnHF|K<>sp*-cY&uggEo1a+4MNa4I)n z_!+T=)7J2B32vx%^8>*Rm786k7d}PvspEnhs@+TpZfM-N8uvt6rY@xwm;K48q~%)k zO5v8eR|>Y)WB8N9B%bi?#btkzQU=`P7wq=d4?}Vyt3-fbq}&-1eaDkNgAfn!~$)=|cO;P%Fx?=IN$u0S@cfVW_}ldUq( zmRpVTE?(m3em3YNWCcVB1w5NXS{}ROAp_Wu9HM8ma69*!IRd16nGlrt;9;5btFR z&9j-7y}fNE&-Mp$`+j*)nE{U4-E5h8Hq&afUv7KQwF*Ob#XHPam}dvA#tOGNXnV`~ zU_ym<;``VVZ|2w}&EDFw606%Eb*;u(==J!1w#HjL*SOtL+v{Gzt1%@Fy;XjIt@2im zDmSWo`2n}R)!~quk`svq;JoWWw$R%+3cbI9ULWYlzX*5YWuo;CZR=L4j^@Z>Ue~$@=lH_H(HndfZKkuJPf^y zI?C2~7e|d7oh-LIX1gB`C(|1ExpFUC{kJZQ68t>t#aYH|D zbIdjRLLWi(vGv{SwZ3hR*&e4y?FZcUb4GFjIibbCGwTy< zrT24Gy3skKKakriA>{oCutT3@%Y1;N%#A7`Z4cVMDvv{#x=yhLzJ;T}jk2zG$84{3 zO~7CMd6=#6tsE6@ROxDe)b{&bld=ka;Pwbxq#Y-&p_`NA7#sY zkfY3v@@o%pzqF!bMThYZIxV4q-fT!0Fah@DE1ZEoYD7<3HNJzR#*G5E4`AC%oV2gYwN0A$)VC|3E?#Y)_B>_E>{7JURcX1TC zkth2Awq4~hITwR=<j4>jHx*!ud=E#F8^!DPM{UznA^|R z_>jjMw?AroX>$mAvpm37_+E|*H!5wmJ7)X-cqk7o@E}{@ZjJ&s+8?()XnT|p>Qi!MAAqjaI00S`7-wtDv%zE|joTiyy>>eYezAOltuW8#k~?jU6iQy)_K@va zbx297!2722Y=L?9m2_s+?T^`hx)y+b88XS%muE*wdyTr}!0nFMz6J*`=fPiih1de~ z>?G-2gM9$HX2%rBWVCtUC>>^t%(IVVgB_C(P}^0WNaVA@%fKp6u~p{TOVX*bA5hzy zlZ}zizwk0&V9U(2pQQZ;YH3OK1#G)FhjMZT+?y}5W%jD2WJzW}ptgH+h%{_R;4(kO zmYHWyNvAja0=9i$G1wZ!m)Jt{>?vt~)K@Nr_yV`R1T>*!VoE9p?$d8#OU<*fq`iG; zNot<}x7WS`@G?KmmYHXBNoVb={W06CBY|WZ+>@u-67%dV>8y_U0JJ^RzR=%-O#2zO z$UIw1I`_?fKyA;o2jq+bAFiKe%gnR8q%+g@1#G)FpUItpmpQ_gnP-DZr#JfnwO!@W z+$g-t&#_hJ*=EwIvL8^}cg>}05O@M6vvu~W)ug=&*6z6N{#>e$0H0k%**f!VH0ktb zKcKGnXTzs~b&j!h=Gke|Sp_pNw?A%sWyDyifK`sORradgWGQO5KW4kaM#c%Ou)5SR!kJ;|cWK?59R+Hc|t8AHh_L_8hvrmBAz1di)fHN@6mYHX_ zNvAirKW6)xMR|z=7I}^>vRB#M*L zC)pD7Y&Ge;N8kg{b}w#0g)haHm}jR+rx&+BX1f=gml=V*SYu1fv(=>2i+upvo^zG2 zF#@ZcW~8uJ} z>AJ!ex`(6C&f7o!z-`aH`sLIt@WMRLR{0^0Dm!zp_QzbaE^BiNbR+kxH4@{4Uv$^s zdlAhzQ!m|-df8W~k@;XM2R@_m#ag`EehCckc)AsMKU|A<%3Hkll_@eeA3=%?IM%Ju z_}h<+ysw6Yn!fHg(!suD;fuD-h10_8e}uHACE%jAgMrew9~t=%En+}Rx6}rz-+pA| zV{i=E*D=Ej)D*c3<}R>z7dqw4?2#gR<$BTl@@Nt7-O|xf{?uE^6sjJWp2uZ$Ylyv z{1;ag{1_Ys_H33IhnkDbDGT#jChjhax0y(VgS*{vP=w>4#tev?dg>#?gbvF`M%|I~ z2{>}>H?c|vqNSCLoYOMgEJSlh!cV}FV82CNA|WS76ACv5e#{*MpMqn+e%O#w<|8@R z`-4Wy$QMkfFoOqKMt;fqbgYPf+5A*lRDRVRQ=f)o%3cUES&C$pTqK)wcUaMYt?K$q zsIslUgsQ)_i0doj|EGqyZ@VMzr{IXY-PUKhhPX&VB}t3RCZ|aOrSc?m8zC9oDE`)`2|r`xqjaMimqiqpkfJYbYu+`gTvgopODXY^T;!cw&}d;K z{>b!HR>@?i!%8NpO3KxIc6w0B&gHc9bT}iYvJ(pfFM~9BPV;~ z$9qrpMjwuzI6l*JB~5x}mx<~wtjcC6!w+$Ab4SPF7mC-4-ROvfjvhw6gxx+J9oNx` zMRamxZ9a;2kE}p@bhKAT`*gHlM+ZoHeXE3S)6qflm6>e20ZarX-^-Pn`i-c$Dy>l# zO8jpt>F9NW{XH8bKS&HogUI zugI_quj-_$Z`l6r9MoTQs=tzaTS)a|w5p3g2*A%jP55qT0EbBRpllfD@Yf8dbi_aj zos@3k5V*uz^F}olCp`m67AVK&8n4?+G=?|yO0d3616fU%MZ)qHgw}_I4QbM=Diw(< z=^XMm5oVsBZBm!T&l%C=>8kZFmtj>DZsY{%uRBRY}HbV5#}+`^0sNkB*k9ZT;?S@(>kO4lyJR4bXKUBkemF`@3d`h;$o+KkW>Qx(qM$& z-jQ}fv!SH4S#xc?Qc7fTXc8?Nlz;3+vtIKwt6ctRYzV$^SQl1s2b>jjMbe5w$(wIn z|H3NuL|?Ib2GdyerPXDc7~T@ZK~fHa+nc&j{Vq7w*O{tEVtIF!z@-Lyp|qn! zLYC~2k$WJORiFnyjVMG9hvI`x!bI|d=D&w#`1#3lW<~hF0Bxi z*B>JHYrzgb04MiabFZhq+1t#|pF6ezI2pH&2A>K}M#ch9MTVuppcHoHw@Wz8lp3!_ zn>@Qajl20y7 z1n~ZV%|UqIB*6Xd&;y>So9#`?4kE{|$f@O(>X|hhagCz!0(dWF0lbkFp>Fx3U6!*O zJdX<%IA(f$ zMZR|oZuv7CFO+@XlLKqK@AvK9j&89&k=_djtxu%)!ky-)vc=$g$R`)v0Uqqyx%1+P z7Z16k0PwKW>~K;xAKu5FSak;<@Bq;4L|p^l{ppais*elq2mm}3vlHOK@fd!UFi^eh zf`7sKM1sc`tWP9({F3$QIO%_5eL7LZziNJ}1eRYXpIihMz#}3%tNag(@ZY&30Pxtv z9$8HSI3J+kHQ#V$1As>fwo(M=Lj`=FJMe%7c(Z?6DX#jd6u-{sQ)I$+m4drJa4^~w zxqqB^Lv4z7gn|Q8lf&Ulkw7>+Iov-L4u*iy-nNXUMKiI7PaPpQcw@(o#ZNpepR8+I zv?evGq-LoN3bs5}?cL#M+F`Wr;nBRsd8UNFcPEK6jnQl6RwfQQNDq^d4o{kx;EB6H>DU|{P9cS`an`&B+L#ECC;kmg zlHTtT1s_ou##HNf7SZpNZAuGc%;AWnjfpEsg|;36OOG+7E=3WbAXbT{!VSuzfG zYm=p}`AZ6IDkc6Oj2+Wf4(%?Tev0?QTK($zF)c;iHTr{t^&|i;jL%%8Hm&iAEp!?@ zP}VMgSVGtQS&i1e#wSLwW`0af<#UvK5w*+oX8arpxoDt4 zouphg-dHEH8*8q<*JysYyn1wEAQbi{Y8BQD3?Mmk`+dcRV22FL9T_oRXWA{=L$GTI z*o&T_-8wLp%Br&|B_2XrCP#yPu>^ZF9PEu}l-ww}3lq#_Xcq^TWYLYojO!yNeBK(p zLOU~9!hESk)Gsx%FY|B!Xugz-`;SlX)W7+N*^Qy)>R-N0TWOEhtY_9zj@ufX1Nqw+ zPQw|)hJl2ZRhr$MVZ?&6E!0jKZX6n1x5x3fHT1(-!)CHHOk}iJARf;sSxP;OVGxz4 zO7@usM~(hTr|x5PxL-=FXfSNb-_|h*XB}IKb&P58e4-pL0s6uV-TUCa({VQ1r6TTFbZc48-_B9QVtEvStrC!qgu=3Z4DBfHEbfeWN0Bv zMwQbqWimDz&L_PMx1CGbRd`f^cxgq)iVou+2?gGub*TwBlQ8R&T1-x~u|>Rb4Pg?_ z5Oxl!3G=RYSX*X@sMI2iUMXg{AlE-UYn$TlIz$-IJ}j#UYZY5@l~M@%0GkAK0nR@5 zoX;zng$X4yqh*ptm%#xoZ@d_EWg<(=GTgr~^>^5K3eGI{)td#`kX+6ysTk!xIG^-W z7>2t+BX5E;jIK~ZQPRta4&o$qMn|(cLcDjR({NU>#OB%){GOvBijhSk`dnMb&a6Q%YC4eJx`AE)~}b9fF;f8$uZsy~@1)KEu8y3ou5 zTwl%fw*^GuEMN<%|3!vlQb zNpK0b(eQaNe5PwCFdBlk(d{&V9tgO0SQ;9ZhQrVpcTh0Cr^|3e4}fmC7#I#mh61Gd z3iLzDozPe}nOMjB&jkm6SNM!JqLK?}1vp zt$d4L+j{}O?k(_JYJuNGT?p_U#*=36Lio;Fy8+}7reLC+6N(q+k0NT`j70svW|Rm5iNJ&klktIjEmtdjF9E&TtwBLVPD(w(&{XXVw2$1jxdwr{ywMgbq=)DdGjh^J3; z@F{o10KP)Gr`BTXA0P02lY*ad#|Pl^i+h{%!TT`=euq0o0N)+#sAXi?uMqGn1hTbV z{V8_@0A9JTE1K}QfRBI2+aKX3EvHf!0 zw=Nm=+2!B5i=qCy3S3v5^5ezeO*PxlWmFs7y!z{)+<=yrbOCx1#U-RTA2l}WpIcZ* zMql)VwK*jPjPWWOEsVq;nV!ljne22}$s|=txth;T4=UNYoR*#rXXI3NVqt*%SvEHv z$mY!7NsGkvbWD*?_4W0gI5Bhdh#Wg{wC74%Emk^;cH_S}ONtzgM$@?OJ|m$e4BODn zVH=D2>%}MvBI|7~UfD^0pb_#WW0dry_Ph-)KKey};~(%j{+GvS`n!Hte*^aKoZJLC zYzF74;8z0-cWdDMUA%|8HSH>dU!>yyOdox?o#fqcyM?pX2`rYVbQ`jng}aqfZkzp-t7>J<_1B&<%KjSNYE( zT1r{{64{wC>Yj=v+gp^Xf}uM2Ld z-0b*_@G07Kq27j>r3g0o5n(h`hmr(0RBobz8!9(f1UFP}-Xpl7a`Q344V9Z;5Zq9? z`AxwMm76~m+|amjRc;_h(~Io+2!#zsxnV?EnAb9K;9`T(cdfSA@X}|+#)z^p!e0>F z(EI~`OK?Nw<_CfsDmU}bi+DqeH~0Ls;D*M{+*5)Z8aGqIZm99*g$ZFdG`sn(@F}X@ zyd->z%FU02-B7vtny?!xH~;ij5sPWD_y@vnsCKjKbHZ+Dc5_^CL$#YJ!3~w04O7CW zXg>9BVK-E}`Eil^QMviEu<$9GPi?v+xS?_Lp^5idamG#Raj~q}t6P;Zsy@riI;5x%sMyH&kvuAbT&BYBy7Y8yYuWzD=mK%^Obx zzf3sec$x5mumG9`;Fkn9RBk>ixS?|MWx)-Vn{NtksNDQ_!3~w09|~@$+-&+;k^R%M z|2qUXRJ%DYxS?`0EV!X^^Niqz%FSiL4V9aB3vQ^~yezn(a`Sn?4V9Z;7u-;}`Ig{@ z%FVY0H&kwZB)Fk+v+Y%}*QD(=?-ATk?dD;@4V9ZQ!3~ugS#U$;CNH?5a-$1wsN8&1 za6{$h=LI)ZZoVeCp>p#lf*UF~-xb_YxmodZVn0ROPwf)iQ0?Zh;D*Z0qQye{Y()ZYB-1z z`(ng5dQ?Y`>FDv14)g>%hMv^XX)<$HNBt5SpiEx=RNa#~G@+yOI+~PFi2N7A5}MM{ z1qof0&{I0PMEHH0{Of7*`?DyDVmgXTNFgJOblb?HMKq_QgpQIrO6f?uR?J^7M)T3a z8bk0vDC|n-lD3iygr7yDg^~Cp(^FX`lbsGLnWQQySM%BFK_xqv)6&!7jGW3&EDVr8 z%jTv7*_`=%PD!SxPaci-9yxaEs1lct^c_DU_gqPat?Kx2! zKW|J6-+1_i;%DtZ3~vL3M@9; z*8!~p_@{+WQSC;w@<&u|#OM$@H=<=Jog2{xn9j}T#2QYEH>kH^kwz@wSRE6|4P_sS ze_e1xb11w@5_Utgn|Z+v)o%I(H&kw(6dO${H_r-gsN7r=+)%mMDP|l{xj8Plp>mTG z+)%j@b3^Exa52M)&W)H;MCWEs%y6Q{8!<1KZZ~2^C7qi$c!3~w0ZwhXx+;pB3@rD*}`UE#ryZNsozoBxoVnp~9&8K<= zH&nYhFSwy{lNQ`ix%n}{4V9bM1UFP}9vBtt6m6Xv6Wmbk=9=J!#*M4qi=<2QqOD6a z#Uu;s%UzlWa#w-d5?*jL?ECs#Md+aDg#SWtLvs)OPl6j7H=c)%@pKD%eZI*NI#o_rM zq1w%(f*UF~nU!H&kx^o8X4Z&7TQwsN8&C za6{#0)!W2=ingEHBep$n!3~w0pA_6s zx%r~thQ^JT*F`F`VTTg(EbvvccRB8hTzjX;|7rRE2L(4Y|G=*ZZfM+i89O!^w^Rql zrBFCBEQNui$D8Y-M`g(R$O;r9W7oqHn$pn)30;)XQ#!gthPgjY{`EBZ{aF-6F&)Jv zq>$^ldhK=GMU>D{Qb#ErY1fMR>&0k3TG(O%9U2`EKtp{C4eCn%P;Huq!jr(7zLf@a z6@Q?cElvB!$47yYUZWxH^c1NyE(L*+K2Jm1A8aNXf z4n+c?OVR+atZ%1*^(y?DU_--W6Qj@;`~nTC2jSP!^=u#%35CIp_#HH`9t0+Ht%;~9 zH5Vb~?8<<<3!QRi_DB)Ea=mDNdDQx{w^&%E9_uZZ|KwQpqk`@xX~3a|eQEHj&W?`5 zFBGp8yU`H|9X(8j79T@>Iy$bS6N~8N$nE(k+C9>N_ULG@j`rzjzm5)&|JTtbMe=j;;&ei_!NF`UgdQ-QSX zy#2$_vd5BXA$!YZe;H2pb!L!Pk}9{-0EzP_`YQDRb0=VZJXT!F2Jzok(l>}YsScdx zP#w@6`4#>l`L;K8b>Jg#W>KmR7-qqN9uaJFHd_eJ9QWSaYK(cDEimJ?wZmGg5K+2v2d8OB;8%`oi3)ee$*0AXerO@o6d zC^ZfaUxu@RQr($sFH&++ab*WLQb`b}47G<}=2GxUIJM30dShBVpKz!35>EIiwUW(f zv@jBXWO^#AWU|v?C6iPo03XW86zAe%FP&ne0Dbl(X@ zK65cj>JyR^z~dxtHtFU6)r9*<13g8XYgt|qhzzHmU87C?irgPX7Sqh$nK|n zCW_b6rk>(M8NUf#93u$P%pRJR-8|xQ{+q#_>^hQ3H$7^ZGeG}JQT~)r3 zxK^?BL1hMb6&tKKbabwvmE-nL4e@T;h#ubIwUc(CHX9KOU@v9CSKTR9p>z~5HpN~=ExIYRD!r3Qu zbY4f39^|AYXHTVC;_SxzYx@y!Hx|y0-{<=(y5IdBfBvGcEKf~WkdxtAVY zxdEVL+;t*wUq<|t!>Ppv8(*i{xNm9miCO(w<#9G85=w()AHMf&Se(l|@eB#icT{u}DeZA=1Ma z*pvUTPUCL;$R%2h&j+uveVaAoXQ;CKqA{13yFxSJ8k2J|=mV<%+u_`AqpIwi0{;7H z6tw%s*h>>PlaziZfM4_L zTV^jkrL_B2Q{awrkSqrO=buS#S8gHKjen2&QpPunf!|&H`@S~;FMZvdDn6BxGYjC} z-tF*qznl8)wADo*{*IU|XMb z*t)pVAZ$H~sdu)-+QwmRGf&wD)fn^zrl%d={;?5CZNA-WSE3f-#nF>_+cu;?+jXqY zuJOyXhi~m})?VIZF|R<3l8LYbn#-Xs?u)XxPT_9+%QT67vqItDp;6H8R_>eTM`d+^3Tq;AA~ zab+8CIPdq3sF#&BGqj)6)RYnr<)9y!eYVco{d@l7U3Cg~<2>~) z;_6M+k;aZ$#*66W$Z2z!aR=I?qrE!Xr=$HkI`B*p-72Bmbaaq>bvOBSNJ5Y5=rJ8V zKGK1nAk(&=)X`}P1$5Lep@Bum^mW`tzAYLde|ePrxbR;uaE%o2MgbLiuPm zmQmBtIsAVSZm!o<;P6MOZtj~Wb;8*_YXwuf?39x;83p=K5) zB7l1qz|FfK;d~l=sL~$@`>tI35ccieAXwABLkTqoouT}x!@i@Fem?}q89~82d{2Rw zwRAIE8;}#wP2C@Mc>6nj-^2t{yL+_zGdlb!n)vOG+)Lj!Yih>3Dmeqam>+Stx9G@* z$Ng&LSoSM&FWuX0Ogf&Hv^cbPf2Yp7{oYR0%ZrTLjN9qKt1%^=J1eK+2?hGTDybY7 zM&gf5Pi2)%b~>zNlB%R!&1a_vmF!$jOHYS0awq7fCXZ^mxL+8-O!=-BT7POswB^ib1UAX;A@Lonn^L}?AGn-E; zsT}mU8{_ux*MCS1yV{J_ziEB+j_zasZCx|^-NNOT82U%cHB z*LU4Pi*D_|eB<}gOxriDQoOYBQX7GUDnn;4M&YI=d+~3EioZuS@%Hy`FOA!Ln|D#o zp<%K~1digT>g^kEJx7b;zPZtxT>E^QJPUVs{nMU|G8wD>)lT$XV#3{4s}b|1DK#-xMwV>*SrI zl!|q`uitpLUy*yc@w6&7A<};VIBj{nF0}dgxY5hx)O-nGCZ_@DwQI0W;BG7`Y5p~G zFXNbH+!-c!BNhodKs&(s|&{Ppip zaycJt*ziA7!T;MzdRt(fQ(Iu&*%tYS43~7YMklSoC9^a7ie+_1cXkFR=iVIJqA#sg5*}Hm3EZ6Em)H~jnPr0K z-V=XiCus23e2)JGD*hjQkqEJS`sp$N%c71@lcKHIom%I2a#(U>T z!r0|S)RfCHirs}yIWv2th+er~G`~Dr#Cx}Nbd*2!ntz~_MyL2V2W>VqhLRfHK`I^J z{XZl=^BWqoh~{*ZaLn5-n9l@q+MJS7-|X%pq0I{9W@5L&g5yHU0XQkmBZibRU-D~L zM+{5VvS#z}M@E66JvR?71V0ETxY?UzLe7w$5w6r;!c;3tfFc(eUAL<^L9PHFIdUo< zjmP5g=*jw8-P6=nzsBgI#$Rhsqr)jdfv8(xpQpe0Cum;K?iVn;O#ICYlo8Uaj;tA6 zGym!)K&1V~i3cg0HklPkSyheHq5t1O(tgtpOf!g>$-lb`3k`OFh8;BB^VO{4-!^(v zwdX4CLjQk-)8D*mY3vnBp}Euu47ASG-AwsbiYEC@z$~@om|OmMWdhF6WVB{u^J&6;k%ML2g{NHz1u-OD-AP?Y%bQ}GkWPo0#b@~M+Gw~vvF zDN=PgDDCWabJdK}88zi@M``PbJ$YIvPVS%vO$MpEx(z*{s& zT-I4Ph5N$#z+_MgL_))F3c9LQxIf)&xW6FHthRQb5D6Ax2~Fwff`l$g=qa7n$;pXw zvC;jDbra*`qc;=CwO)W6oEn?BnLu`W0CKzGjy=_o%yVVOe@!Avbz#SUXT+Bq&tu6F zw+!Dcji;@%YTC-Qqm~P<%M)JPvBE~i2J*=T8Gvzmok_+rgLUIX-gP#I|M)@r+n@5i z|J!tQko0r7oBTQ?xuCdV7?qY4LK|ISbMceyhx3FjruZ#e%C=LGdbFBtHqo|fN!vjO z>&2>80^6#kZ6_V97pvO}z)TbWr4iFPyb!XlR*Ma?{O&^6aCRb>De7eRx8|{IF0Q7Y zDCSEC_=OcJT;7TQ5ehQ?9{ElLFaAFHy#jS*HVue%#R?#K8)98C2MBdrOQCj=nUpCR z5bhnIa2M;WczrUOkH;4xS`-6fKH5^uYtx#Rh$JCf{Nq3?5o7ArP>DQeTi$y`=Xqo4 zyFn~PW~{2W=(X{DG7YTmbFEajP(mEd&j5OGx|N7AwK;_+_H2H)mf7>_#8u;30-(0< zZ>6?{^`*;|z?eVYQp}yXjIx|-2sc=2z^}Fx?P@ZdHKIYLlwSeGTfbB2GVns~1;5c! zxGPn1pS{uWSWklUU$zwM#u+t}%|(op=~+mHzYmJKKE+xkFYAKEjYg~2TMBlq>Aj${ z%<-0$kh}eQdDo~jkrXW8gDnNTN}Yjp-iKNWcAauHorz>~Nq3hYT%B#;CtC`6)jV3x z)xR5!SK}=OyLv{;M3!}V`9|?ZT8lSBF7$%p)mn;ojp@IjfZx_qz^kKb3Rd9vw-#?c zCBx$Vcx&;-NWBi!o?mS#-ZfF9{0s{CE3E|_lM}#zztK{_JI0jcn4FSll}t~>d@>%1 zKyHaW08cJ_(k?D-wV@?KYcW8m--m^|#Rhc-wq*A@EK<9u86~SgZWgwz;=lWCV!zvL zq8gD3)PN7dV%=`Tno*#^J_HMPrwwc*qNH-9e+Oh7ei9aL?W&_(CC^wP(T>BSwTo-o zaRl}NGy)6Ph{qEoZ)`f^Jle&09&+5>^s@0l^-G1#1Z#nMp*_`78p&`VcHu zBXuYTCIhPm`LN(gSg5zuK%G%j@rX=*Wt60L1@Z>mI4o?-b;&l>yl)SASvLX;cCV$e zmWh+1i*X{Ib=xc7-Gu|KWstLJqh(x9iscoQDX!BVm9)U)CzEx<= z$F|UZE4K=5R!Pi6Vn_i^h%dvUJy4BOCeR4k>s(PHQ6n{m^xqd?QSS&F^ZddKX(bX& z#m7j^oHif~-CyV$2&VGM;)jZdUnpKHcB3Qs>z^j=#f~0Ey`CEv|C?y&U3gvq=9rM28!M6)_VI zvz0;0DvqRVwk$=GlaxYP>+FQYt&x#!3_dzJ@?rBFDW8neVr}af!H<-TgfxR|8f3e? zAtjU}-H9nZA6iI?R3e2mjcZEEYL2ArwmfI3#7Zb9XKubo8!b^oTFf=2W(`Mb_Bf~+ zQ{(Z(O&4A8l@d2(0%}uk)^g-#r-K`k*4=c=^Lt9fkS??TKYQ;29>;Or`GR_qz~IR@ z3F`fzB#7o)FHq7D7?2-F@opU7wV~W3n>bk;%H4QlC$XXHTh(3N)7_Xxj~YGy8e>M^ z=R>q8OZ@%oRMn}fQ>RuGW`m2ucnZP{Se!F+9AJJ;5oD{4Aob-DBw&$G!BLRkQv@NU zcUSa~1{Vd<#rj=|$;nC#YrmqXvfV}%kBh3b75a@YK9(R=FDq|){58voyLX zOP_G@JUQtO2ND_fV=1HTZ}bA!%P;+o9Pi&^C5!xrad*Akq{`A0iKPXLYZ%611uDsB z6-jQjk;Ki#a-%9qAQ7)XMZT#ha+{4JZmyIyMTS$^3RL8WiXyk$DB|Waxk2?2Z)w3A zw9lM>uRM(Gw$a1QWpcfyhsD+_$06j_S7kZwu#v;f1+q4(deh`B?vmDkP!Bo#s4U5y zHj=oxJl4h#Z~9`~;^s9+CmB(kR-TVMJ1F}|hm9g`u7x#4j*{#N zi&QR-KJvEGYwosD#LY#prbrikRIc&@R;AbMu~Ed$Rd9E{qAu%8N!0DUy(fnTzij z$vt?uuf;`4n$=Fz6OEHR!iktujnJ2T$DuH8|kgQ zsrNg>a+kT!Mvl!c%At8k?_@GjfqNs3r)5d*w~=Ivi;@&P#G<-0$3gX>_sMcRU?a!Y zvdB?+E8eY&9Gy0DY;#c#t;6^ulcVDnFMe_KkhcS}ha9nyWV?%!Xqy1!h=%0*R^U7{ zr_3`C+K95lMNzcajGS;*Tqtrz={FDA=&{p9J+x7Epz=c17nCEKhi&9&cTo;4R2?ka zPU1`J$g`95FXxX7OK&M1$7`d^E*F*2Hd%)v(F)uR_|YkOd_8KT$aO9%qD?tNLMEH4 zyr3kntn|8UB)Q&2Nwm>*I8}K&0kw>oljtXla?8&`s8m;vqg8MQ(Ia z5p94y70p=G0OA;>{joBN^wt3Zm_e zP(d=$MCEzOh$6~>jVO1zC`vs^iXTXZ{ezK`_5!l>Pl&oD{j4I#X)8J8Ka9Is-%O67 zN|fUzMUKa8-COmJN|fUbMUIe-9B$@%(~D?y z>^Pc=SXB-*uIr%w@eM_gCu{_9GufL7GE|v@{GB4mlQx35neN@7cnH0OR?_hd)It7D z(Iaf5hnuvQtHz@wmUD~+}RE--IH6k`@xS8e6rk9{F z8Lhb4_K+gSsEr(Mrg*PcoWonvnH|(OdKEFoY{YOgyPJ(1zNfOKo#{gLctX)*+(r*K z6T8)^)|*Nt&R1M-c}fvPuo1+~%x)&gU@V*VJymgnd_WOo!bT7`Q@b0L;iI2ig{VYD zKBg#g#zqlWbGsEqX!Vr}bdlE;K|~ut+|2D}EZt_1BP0reA;%0U?i&VXpD91aB95EX?+|2D} z!I^h5S%L1+`e}JtH)*4Xn~B{l7CCveA}5+#6+z-Qg1DL5%_f?zNJ^;0E_0uvNWw-D zH#57LiyX@wt3*Ni6+x0Vg1DL6%>?mh{FNw3L=ogE8$n#n?$$@E6*#VD6-iPylDL`O z&3r_O&MIz=ms12u+X&)jW;Y90>57K_ui_+mMUf<9BZ;fY-AcEi<4DEH@fk&qtc@IQ zCU>()mCiF2C&!l+InLS0;bum+I?D*@O579q?}{MjZ3J;Mp_{Glj*+@58KDxlMc!64 zxnQG-n;G4#&-k9Iz*%?Q@5-y0i#Bq&nb6H#gxvp+MWT}xsL5tUlc#MoaWkcxxrm>P zBNaES-l53xjEx+wCUh&4E*nKEPLU&uB2zYsxS7z+9E2W6RGb`-C~{n~k;BbwZni@t zA4XK19)hCBdu{Y^Gnt#YM@0th7Zo|)XCsH3socyxGAlhnu4QRC-r)NnJEn++dygSq15_|J+QzhEPWn@QYk z_>i}kD^8EM6g_^?MvuE(OloI(3`b+*CEXN)Cd>SjqQ?hp^yqL=5B2yVLDCK@aQ$-i zXXG{Ab2f_H?V=)Vbl3 zr0u2*;@4Xgrz;pH*I~v6!;U!aIWHZ5~MS8lnU&sX9dQ1I}WB zwIM2z#1By)z_O~1OF&7tO(ca>B$G%X`|V3u;EjfHDiaxv2}s&cU};+zEe((5AB%51 zlx0BvEEZJ_k!8$qTF8Xc8H;_VvfzFhi`&jx)_@z1MM*?ub@!+&*x$rrH+h4@ebM-M zxIZzTEv<0Zzoy8>1*#gt$CQf1mJfl;e;9YGA#7A7Q7dMY_=*Npm#--W%`D#nXS%pq z7NJGeMSgsy5=Hs_Q%Ll=kC~g)<(E1N~+ADg-V(n$D2LSbxSC#%_`5ZWt#LWT; z^{StgR^S{e2P<%H`4Bjh!_D#t4XPX^zL5acgT0Yp`T950!_DdljjA3cSBiux!YV~t zzWL1*akD;xHind5UKJ_{E3az#+BcKL%@PS7)k%C8k`_TH$3gWqW%9Lr?VAbWW|ag@ zkU(Uzq|-g5hlu;dzCO#RzL^?s7D*_CB8hl96N#6U<&0EBiuTK)h~-P)OcXbZC1?Zd z(P(_YVrP_Nr}>hih~*>SOc6KBB{Zv}$Vfbrx>$jlTp5tPWT({$AJfFuiV3PFUE~p~ z;=30do#ebCNV|<7ZdOdtoP^YCN|LLJ6{pETMU!1Nnz&grp-puXI{lJt=Mu|CLPyw# zl*QilHnO-`IYHYQ=%oj35mHX`T;;jTlZq}k*y!SB{e(@byQn)Rr4}oOI?N?Sm>X?` zakGko7TI?TF(FfVzOqTF0)MlOByJW_XjOg1n>|yZdnShzRc^6S#m!m@1y$nl3RNYe zsB)`~Dy~*kP<^G;ClsLL3421}HXA`)t*D?1Qu5O@P(|3&G`HI*;$}q!ZFjB2cUYi$ zuyCQ4*c+sG+DPJNNd;~H zW^N_`C+ zD$5?_b*H^Hvbb4dK^ss?e(wsZ2z&2ppN%4JR$0*c&e237R)HJTUr_cQ57=txqLqO=am!|VMvqPSUiK|9bnCd8E+43#+VJfaBmfQ>M2mSE5# zSnv5rwDJbpXB9;{Z4_~{3WKId$*=lCqc!%b?-3hC+^oZ(o#n`iROH(4KPrCmpp7bS zR%6(r1}G#Ab~2L52;(Osu?pNk`AbEbhis&Avn+$=FeehxxG)~Hx@N;MFX#G4bJ z8&%w_%%G{_&16#1(QE}CpFgaq;oUYD#7e%dMp)9R^BA^^NK1*ZB*IoV%ds9 zU`y&Dr-YIomxoS6f23&AWuwVH7d6qA$aDo%ajTynD1vm`2(sTrL9|F^IGe1%n{KxZ z$wREqMv(*MP$U?OmiCq@w9}ka6zQ>1%LgA(R5@m&${`n3*{sHH zq#Cf0%p8xz$74d}UCa39ak&Te+9-3_MP)R9@utpXC&^1m7I)t{hHmw}vMMKRRJq4R zRkWlWqDsZhJV`~5J{vvmbx{v3Jn2))xKx}bzoBU2x6$N27d6plV{a@Psk~nE4MmZD z8%6GSQ4wt?l4d*hW`xO#bCau1$U{lMMwAC!6h)hQ=+g2a8(AK5Q5J1OQkEqcjh`V`G)jA*9@>u{QKT8Rk>+6+rO^gmMH=C$tProj z^YNbW`6%8UN{6-`dtXyPlICIgkXyK+g<g>48C99=YxF-aIp)C}Q~%H&evbvVBaE9`eRZsuDwyF+~&0=eU_B zZkFv+=iW+mk@JcimQPPJIovGTw}H7x1rDk&C~8bgtYFIw9%+zqRHlM17zw#o~uPSO-KC#TyaI+wvrbgxY z#&;AoET30qYPea8PgUbs<@v_{tEgf5yfRb6%^G}~8kOf8SH4ePxmdog%+zqR_MWOn zZ%LS7w5^S$9u!kCL7|fx5>- ziW-&=D>F6Rth%SV2XT(x$`d502x9rHG84qjntSSUr4oC~8AXnq&BmCU_4d@Gmyt?5 znR`aj<9QoB+$^=H=~0PCb01Rlc)>;wS1awQ(@XqZiA6i1BkFG{isWq+akJ8%x=%<7 zR0^fl#eypGc}0<5vQfm%GJEvG#GbB!KyWzR8yGHr08@?^3B?2C*#5(!KY!o&{h<+3 zR5l$N7E+VZfN&w34s{FZvzbIPG@OdW(}NegLecnGEITfwLy>eQG)hvi_nafOclyb{ zC2(n49L$N2s zm#j#yDl2JVAm9U&e#DCO>avn{9rvQW_oG&%*SJqglYjU0_`S!%y}__IcskGpZq|=m z!Io?Im0^Ru{eynA2fu8ET881b(5}b5!EkUG?!+@zuw@vS=(O4si<}AfroHKl@v-7A zY`ow6)Gq)N3op_CSYO|7TZLlsAI9CpLOLzUngpYhC6TY0(9XL!b0kr6HOY!l5SS^$mD&`NQzW{4aY2N zZI>m;ox<`evuK!9y&?`A9uuQ6i~DM2fz4xKH!6)g8jUBC;fYjYGMun@M5-*bGhApR z*)v>dXSvXhO(wa}&S7cm6;Bo>tzIlDiv!PNA=!Bag#;hAE${=4#*ty+A{LaLDv}-w z-Vt2Faw_psm@Z_{@q=d@bYaTk2bq*KD>ztc$HH!qM_u&t6wBD;O{b%0;ylhyv7qei zlpC%ei`%S$!p{;zSWQ#&KQ=nfjk7y zArzXzQnHzo4{ILF>QN|*1Vb;?)vc?ef8FuyG${kHTijfhBc~ZGFB^C*smlvHi-lcJ zF~RY|92T)jnMgT+&SOCvDI$+xVFAmzvCyDAXcw`xat{T^3`Fj8=^w1lN(+rE5QJv*Um)fPs{BV207qOt@ej=&vQV70e`qliu{ zrLnhyS^Zd6kMBZ~$GKYwi^;ENPR>$RkFY!-BGvDmUDDEUwZ^!7;-EmQmkJ!K8~=(v3aY_*f>Ih<6J-^0b$* zwAUSj#2MPN3%UZ<_g-+M z(T*iu-h08k9a!Ftz445YijWPgb3Ag#JF&EE=H<)m$1-m+(!ztQ5Ehq>&zzxSSm+i# zE;ziJ!lJUZFGt`!7I?EBl}CUzgXLwrSG=ibvDAhh3=TQwu&70PFc^3q3#^?V4U@O3 zIMgp#z~Y+Dk2pauVxhG&28Ig{vzD;DrZWa!)Sm00>)=-PBuVB42U_h|)~&`a zSmG^)*3EEuSg;cd++L)Kd0_jo*v4KAjy*zH)?&RFOdP`!w{*oK=`^2YtSKxii=;UM z=dr-8I#hUsHG^ekJ(nl(ES9)YV+BW6b68GxCxI93JeIaiXmJFvLT8Ynz|>co<=lYD->ek^YT zBL&A!AuJ`kcg=@2hGlJGlsw|5DJ&{m$#MkFV}aG)3XURXu$0E$3TB-JvwE{<*fT@n za9lVa4g;TGpTn}Uy$PPg^H}0GJu5tPTEN1xRV-KJMJ#et0TvuUEnz{~dWRdX=LYCH zc4GmQM;O(PrDgf8e3?72%(|Wn4lp{gpv!tL7}t-*ZS}_E+~TPamQ{_XI1jwqV>@EbhiayYh&q=CHJCJf$@*59WC+ zv##fY1B?YM=(3&*#$CkXdQL?%B8TkrB`hYZ;>iitb0c(h+sH8C(L_6zQ+@MC@nAS@ z2bOk&+^XO>q7%!=>I3p1^f257Y{P@sa}#uh%6cj|cxcB$8hR=iwF8UVFr2!`VH2qnOUd%q_^|r1tR96D z9wCLWm~3B=6Ko6%yPjf#qoXM-B74`J185!#+DH+3L<%!lPPQ`TMLUb7m3t^SRG7me z>Ut;`bRG;!(v*Z$hC^7ifCW`gOnKohVsV?bc7+E=OIT92D&@!Pxf!}DZD6F}5UCwY z$yPCZSUa$+EsT;!pwx*)Wq0K`0{gMRYHtNc5g{z4vA2R*V_4RvW3j|&B*r0Pn!06+9*f(ofx;uE87wJ_nE3I|VtE@FDL7)9!&0&_m=EhbmbHaZ@`#ugu&69z;t0Hm z1y*}2IEq-pQW|?JnALL&bj8{dNW^1_F)lGvI~JAoR*t|OSm0J2Dm-rL#ImxRjy#F| zSmH*F6&yQ-u$=7th8JxNOWUS#@`#_Nu(0g@Dp%w@7P-)C!Ewb5mebs8!L+kjTF+o4 zo#wFXG>64xxh|Yw=drMj3=top{B+G%+p$FRtSUJH&Zrm&pmUJItpV`-auCzA;- z_vU7>pln})8}2L?w^;*)M-y{cQnrre$2*VZZD6F}*l7Vv$?{71ur6X*TNoveAYuuN z%2u)*fjzfFSF&nv1xFF>SW07W1+#WwS=$un?MWpjIULe;Vqw`jhbyuli@ebQ3y+>c zSX%bF0$=7BmYK!Iat{VaQBzn_Lu|~0H;?7rr1N7Q(bNnUcSkxinMv>A3_Xj5*7sg; zq%nsjUEX`ayz^Mz#{NiVjK}jR3s_FJ!^n$v5lh>oa>7HYB`hf0VdRGE*$rLU)+?ak z0ID4e$?_?P#j)>Fa3LkJ6L=&4}T7#7tNh)nXxdYZyw zwh0%Ksq`LBuz4(OBg2FTNi$f^jfO^r)6QaPH^{9D4w2@tjLo_h1(VKWNt@)>zjmm?!1Ix>LDmZxP#6lW+Dj3y|MQt95 zM^YELL`oqnDeI~Hcw<=JmI5g}TAIS5vVBC3z#^W)VgZY3>ak$hMJw2s>gv|j(Z6!yP(Tcd2gKokIFb`j2ED+KV9ncl4(o4ZHLpzpH-%G)y9az$)qlrX}%jsMv7F11m;f3qR;x=pT3Xd8> zSW-1XLTy+$Zw$-Zz*-g@Crx1~TUpwR(yCzAJeIYEwJ48RX$FhR_JBD8&tieq-U^N) z=CG8;-U?=&$Fes0Ba@@!5e}K(3s_JVF>%9P#NswiB!=)K4D2s!+;m%@l>lILNur!B-WEXI_pw44an-xeNq0$1Dl&x#{ z@h)O{Sx*HA4@+1`Lr(>xdiFrqsh;lW7?+|<5g<)rLD@=%8*UzptMpQE%rJvx)b~;_=`5DCAt>+& zj^?nGY+sNM>pYg#qfo*_qXjG`i+4G}E@ENVQ%rDRw1h=$Qc{yRfO_5oU5_?WL>^&L zJC>8JU3k%UU}@zZ3Jw)Iv52}J3I_FKL0kOMbcWtY<&cdO!lJ6@;QWANSm0J&+rmSn zDJ(0yY0Q&2k0ox@Si!;443?A4t-NSwv9xU(Cy%gc4hzdld2>ac$08ScEjX@Nz;c>< zEtqx@OWRB$e@;Qv5|)&mkn`j9?1ipiTMDG`5UL%E%Hm^=z#Uj%x_c=1T5tf>iN!4J z9`bHsujMg|Mt_&BK#8h9%Z|EI6E)!eW|wEEqPAg>9jS$((|x87wNBVL1ZN zVu4$AsPOP<4$I0$W1htGSYkOdjYmwefaTO>rtzR%#L~8D9?Ta!-q5W9s%_dxUL>0pF?kw8K zaOxPAy4BFi;H{}CEGvtdc@pQb#9IukJR+JvAnFOf`f+;7ShmD!Kg7TYUAms5F6)^T0Vv4WN{KN+B}xF zN#%scNi$eb7AJAToyFqTE1=*wX$}j?Mqe(d^H|ho1(HXcw16dLaS}h?MJzAtso>yY z2@7fHsbEyk0q6>~RrcJTRAQ1ttkjNWWxItui94{wZF*LC%+!g6Wf>J*k^NX?B_5W0 zFF1AzVL|orFb~`q7I$O8iFw3OQ&`&V%0V4p<~){J*K@%E#tas8SL_ac^iqlp+CXf0uB*<8$* z*>e!O2Hs|(kVW09{b+L?KPcVNNIy%`*hbYf|X_hvA&AIsc&A`y)XS=V#H0mcFrbXm^@<1S)xTfLb~Dmt3Y@Yu{+!m_e>iYKw>5OnR^re}r6Q|(w- z7Ef_S?!Y296=1>fR3{dcjmq3`{aDf1W($)1`aDdT{1zpy2!MGh*+~!~=l1d3Y?)r6NN!1GI z+<5(1-j+hk!Xv2=7FDf)t~D(jIEDrGsBH_5qNcEzYCUDvu3*?a7PeJwQyvl243<@0 z*|LV^K|G5k)_N>BoS4I6ntCi4b{-4sp${N&NRwK?VzM^n1iOfZmEUSdmav?x z@&#*DIIZU%=<0QY%n6Pk+Odr6J$N3Z9az#PnUP1((1`_QdlB4l{a9S3mx5!45SCHj zOTnZuENSC#HW}lQ^)!X$WHTu*+B}xFN#%rx3^Q0zHuiGEoyFqTE1=*IX$}j?D${U5 zoyVd!E08>bqy;P~+t=sEyNKmwJrx{0EMXxHJr#`Vxfi-NZ4AbuV?5%db}T20lX%f~ zU}>9FPI#Qui3L^9%b63yas61_dZk^#aZ(5i$wpr;s4*;RvjWK@PMX4!s`(FcN9Dnr z$MUkC3JxA-u#kqH3Pzp9qP7Milft;~LXt;if;lWJJ0IssJdY)A)3d^Zhy^Sx%lzhw zyog0^D!_tcrzI>Xi-)=4dhUa+UN;s%dBha$SX!3(&6l|Y%dG3U-~gi&3%ac5f^q#= z+@^tKATiEk<0*s%W$nrhH-^P+)&Edw~43>2p>%}~gXR*j_ zdRBPgF^7d!`!84Kc`S2N0Tvu|EMP%5FYCNu-bF0$#zMpLh%=V3v^$oyE)QtW1JD(* zuJ3|_jCL&O^1ch^?ZEOjkiN?yoa)3DYR5T;@W`s!&=Tz-jRCRBH zBXI|oxK)P=k0Ls;tm^8OC$b-l+^DgFC# zGyAd3t^JYAnAjCbb15%{W!*YSS@-ZHj$w)0^sMlBYYGdyZF%#;k@HyOrb7FI!>k!B z=q7X9f^lcDxEl-Y$|Jg(!_sayH!ct6c`UQ8=Yj)_1uW>Yo(slZ#NsM5?#W0j%Ojv# z!ouojTwchYhoEa;Wn@-i;qgT~mR3J9b7StnGB?X}uR;rsGCHxOn|1Rp7hXS>cayGV zd4w1tEbfkF&C3HihK1JmUT~x_g(Y3yd%?VUEbkV%_XeZ!Gch5<<(zN^3*4^jzdW&L zvDjOewKF`*n!^(BvS?^H_dJ$ciKPp!4UV=Ju(bMEnj7;XmU)}0FY^dMmaxdz746JC zz&#IhSQ!^Q8yt>Tb2UTEj@HK^n)$dgELe686**Z#XUmg+243^lij^fEZi{&=;WN;8N zhlMTLlflUISY&12x<8UklFcs;`SA-_T>ZW^Kj=j)v=UnvaN$AM5|&pVTXUrLc%f@# zCEHTv1&3ViSXOFjGAlVC3N1Lsn!}Rnb3nN8 z&SQC%m9Rp}BfeU|;_6qz{Gb=H(E8pBjx?6Aq|19RnAdZZ!|FGfiST%lxgE=@kDECW zcVLOxF0|6R@DQUD3#*TtS@Xh?{a9q>#*z#R4yr;}Q2mW19=I_qF3ZBB{gy{aHHD?s zuZQHu<-wfCGV6LSIKY^}f-dX1VBA?Ot`aGGd2Cb7VM+CoG8f)?EN_dPX(yAy!-@qg z>K0v+9UtIDEU-syTW}P$gvD$#wksIc)5T$BOWc=7G|`S_)vs(h5qDsTwH^x&Cpxj1 zrXCB1^rPE-g>s*jzx@W!ybO6(+)!egf?EUG?s;scz=0xKgiK?R2sGgwUh zNQ{S_#lkAtGz61J>@F3a>W5g_R$ZlvSUGtj~4MQ)^# zSUfukY|~e;q>Zeb67Lm-3qa1-v7EYInodTb5$72EslE#HNGE904i`&9lHzh>I!|})@a$ z4i>i22VJikS~i_Yk&E@f0csZ(RvnM!9-BxCsYoV)bmY6SxGe6MXPxNN$l>V-7<4d_ zBAZ_vDnj&QK{qEAP;R_WV0l{^FWq2LegqCqlUUY`jFo|+_n0nWXA5f8b=PyZ)2I&W;Qa9C1Svl>zztK zo=hVbeT_ZP6>hWInQ5d!R=B{%-GwD>)05J!8&3dX@5aI!nibn;k8mPQpN%HNapdUK zk0sruIxr(8$9QqFwJMya&YTAN@)KBYZRsamND5;a^m=F#ORFyG!;BWXB)WuU)t0$R z*bGH|5sRudYh-LpNM^`+7qG*=f@ReffOKPOED=v<$aW2KLG(J7cdI%u7kDRPi3pPT z4J`2vm3VygOgNTEoXsZ5YA6#v7eUUyZ(^Y}x0ay^?L;CQ9|v~hw>a?@+#0(;cpJ;R zMRn=|?`Q(M+~p1&Pe8Xc8jtZ=?54>+&R7PSMYIb`s*P0>(FSYlK2W`r~{xOxH$yGfmgl;({^CP&AS$-0wRTy3aQ za1-Rf6WhF(u)JEBq43f@95C>UT!G^WvW0_f;a9N0>d6T^DjG{nlBSNP6UgM&*RjZ2 zCsuZHC^B}7;|(mYHU+a=BV?NcP5dU7SlfkFhON;kHaYMuEUjq{CbSozxsY%3#wF7d zaA)HkEUw9y(_(Z28BaDIhpu`}v}7vEh`_epg{57#R7fE&Mcs{sH4Re}kumJ3d<2VY z^5kUVJoKhTKbBUDG1x*OlbA$rY&?M_Huc@HNDO(LFo}gVHE%jQnjT9fEbUX45EUc+%M^o5K$!}t5 zO}lesR7TIaZ()J8%_{P4ut4@A$q_F-#?L}Cn>itq+?26MMn;Y&NaZKss^}dovbH~` z#F7*6yR419&^7N)nUmakRCwv`TuKmycsdH*h24dvHVt0#p5z2{-|B8GuzD|pH8Xjf zgx*#F&&Nlw%%(NJ!VDa_`mwmC@Z(}sh#_|-pTN?Z9Qs@&MO>OJl%N6TB$nAUHxb}4 zxiSd!=u24M8;x^QIvdT7qRT^CiYAuBTSMyI5I!5$zQ=@UuVLO zP9{kSAbL#{4gNY7Tw7fzaaekiZ0X6|z_xw^i>ysplaY&~LO7EpO%0@d6H99fIcZ`C zc(!^A3vAl9rFnN~hkhGNYzjD2LMEF+rn0<)#nt++GGwJ9(KNFEHlBbklueC$CYBh5 z-r?AV#Wf9AB;7rhAjeF=@%e5nu&I4X;E_lnkC={NaZT%|i4-|Ag){eKnN2ZPBo>XN z(R(0IV3D=kl*$-AE+BjGB$n0GgCl8D%MICsFJW;_BQ)K^1Yfgz5euwcf>wMviro2l z1&eCh>4{E+Gm$8=>%NZVHHDJr$@UI1lzanAYZ{cX2M=#@WzD260z=5Ru&ky%JK=&{ zz(6Tujl5;|HWu5I_TSX#}U<<}JGmEbUW#tg{Y&xu!wnv;=CMu6^0K7r*mO~PZb zL|UMwH__OWSZwpbnebFrAdfV00KbF<*NVL<{yj;u^T^`^9JpV^a+?#k=rqNF`V}m- zX$y~CqK!Zg9$x2)JWgu~(+4MzNtkb7kxiS^lZo*x$pRQnj3XD1Z(^C%C`=i~8KNh!GD-&RN zD?fq7Uf#+{XaU|yEbf+NeR(V6}WBt^N8bjVKuO6e{4{HH%LM@64_?2c!r1DB?EizlT13R42U2zUZ3z>cG*!^gdW zZoeJzC)rv-#31LXoRF>r$fU+YBCxSE@ac8ZXta( zlSqb!Q;~Rj@M0JFy>uqzO=sj^$(C9&G;w(J(7t>39*pcAjodpiv3Jk8WOQ2WC;wjR zR{56k^F1V6)SDrX&W~ovwYuVHQgdfr9dSkKiF*U$zB|PIX} zAbNA+(c(V;k2lrT5drE%Klz8*A6gvDiI3#Op@0}9e{(n>j^xCX0r6Bod^9JXCjXVk z$=?oxj$C&qJP;?gwjZQ0R$(?q6= zJWHP;)jNixlNLF&($~L1{!s42l0S7{-)_+_T~Gi0Y70q!PQIjXQuAGE{+^hu6A3P> z6698tpk*TCCkIPj@_bY}U9BQCD3`ICuQc2Womsc0k?$WD%0Rl%&1 z(V;O;hst2|Y2kSEj74eNDv`pYN#RdeJTYD+N;Jilo-r`tkH*hd`SdA!MQ@zE5>xd( zL>Vk(EvmeWlr>s8)f+glpTy^Z?r^tv*y}AGz6Qz_u02e`wF`7vqJ?Wu(=QJTm7B#j zb^W%vI>tjOZ^^%w!)9rwI{Qyrtd zUWk2FEyRW~x;6}u`%o4#_?oOY&@Ph=wDrX|(DGOAKfHH3vdVold27kNO|+GFklMz) zF?vagl-w(mCRgk`_%kI5G6FtT-2ciJ0r%A+VB;ooEdnNI1crsrnhyMH5wNMXYZ0*Z zM89TE%A{WnRQEQ=t5wcFXUYE$HYdd`YbDT?{)_7x)B@YWS$u~xe=izB-TXS9AbJK#7*HCoF zSNxV$#zcTD`0C_-ux@$Ag!BmcH?Q#j43Ph02{{#)EpjT5Yr%Jy?IHikPMOvdPEsAT zY!79jdf6h|L+4@6R!y3RT@~GTxaMN&QOAi2cd^qr7h69hM8@eZh@(}x>R)WEVFQ@{ zYo+mv4rMD1PtuiFS&uVxOUg2*tGY+1$8qknLC!#``A_kA)aEP_{lBXmYT0ojILB!?ri?i>Pts+dS#d~lyzf}u(aadmGa7ZC;re*8qHokj z4M(Gffb$IxnQnaX@qr1)!7khFVXLFa3i~p(g%7#w;$RXvgL8+Lo>(?5QeQZlotPlE zo*d02HJ317e_Anf!+}dgaW0|86~h;k&fe%7C;4HMz z9AsI_V<7{wkTO*B7Wcj75*KeN({Lh(CN+Q2*AH`h;qpG5zijAABrnnRGPu?S-52{ zPez3zSG8Oa_xHtK!TC}BNIX{aB>RWven!u7e;wyZG|U|)4+joLGUBTDR||#q#S=Hh|EmhQ5ce>OrKCx>^`S zdK~4LOip|v=VidWuC8Cn#qcOQk$+E`N{9_^^;W&IK~~lT3n-he%tM{ zpx1zoLbiO}8BpYjr%;!CrE`GVUazyg-q-p1g|h)f^$RrusX2!Gdvc$~IR-6J)Snp7 z#ko#yv(PE)U3 zzZr}=ER3f*i&mCd$!lXyqW#^%+0lyrQp;pxv&mR=jJ)dVdLo0~efFyfnHZ zVp@Eh{Ou6=b;aD2%VI1iP8y$z%{QvBr-pimePG%q3)&L|_F?x~n^jidqrR>YIBoL^ zv^Tg<+n~~V{eEz}wyZ$f;y!6}Pp{t>4j%Uo`FQl%Rtws`b?&3K=umm|*fuNHE8J&o z)vekU_b$=T&+H{*0?A7kK z=~j8*^$rgY^&TZ*l02sl1pKGLZoJ(JxeNo-W)t%9-tKN+01Ujt3b+gdlo>d9Iymg> z2Ltc40xm-j-ezjy?%p9^*YLm)+N;~Gn9C3tZ!s}@hq{jUo%hQJ zzZbpyxy}ms{qB#|X16AtcyM6I3wP`5Etvc3$}n1QH~DqfK>y&7FBtTpw`*>&q+aiS zQ=5D9Ku?dqH-PTVH(DZ>VE{9Gw=d8&bb4?Y-p)5!LYHBiN(sMu{N7_>d5Iq$K0Y)s za_l&Ga=zJuxolgJo8(?Ca}S*K4f(x;gYbsF#R9raJCaJ5mXQMk;iDrxJ!InvG`orF?E;4$9{rk2RsLL>vDRY+G)Ir}PBfh|Juh$ zF2k&)<5o8D!UKVDmwzCLp15|ez+Hy*#*V^hcGTO|H!>Iw`ue@3)w|G+e#Z*nWmsA2 z8hmgd*!w6q?mJiDE<;dSFE{v6-?3hFkG{(Sw6D(nAk-sMc8v@Tkr50$Vs}_^mZ3G* z%bdOddPQ-!6=NBCYD;jqJKP%>92pKDClj$BJtFV1V154TAN};FKP`jvwo>4MkzsDc z@3AEQVR?wt4Gi&V;=Pu@|6Cs6?fqo!AotxN-=N>y#cjiWp9Oh2PK7sX&|L$A zr^DpHf8Z2+>9pSpxC|rL77du^3i*H)aT&tsjmiiemKPAcf#YPIh@O5wXN6ma>GwK4 z?%>eCFxjgQ_Y9G>B9EoR=dH-g;M$wJM+W`9@=;^Z+wbGEHvUgQ;N9mB?B8=f8b7dq zg51~NbM!QuslxIo-W%wlTlmAh1L&ywkU<0KV*k22aWE%7k`spl?;@_gEKZbA96x`Z zQH4{zfdl)A0)g&uw|Cg2?iYAfN8B)^kQ-v>*-TZ3d%aGkHeY)@)ho+_9D|{VRQ=(aFv-ElLdk)fD zPZ_kmH0`8A<%}KbvUoOEEV0#6SZDsE3H$AWDn!_~3SUInzbbqgh5ft2ZxCVsq42d# z*tf~=IS}?VPS`C*j~x;sq#VA(dZe1F+nVci?yCDDs%{$8T-l(it|Yp&ll(IdWP2PZ z+g77&r&3Yn1!qTlC?)B3v;^IHo$2-jPPcZWZsg(+^|rx8G@cPsZi*K#$hBWCx6iJB zNNM>u)RFI;GsVI<#Y~}uQ8C{I7d6u^<{1V1b%S8P=}fQ)PB7C{K`u>G7Yjz87F^a! z^`ZalOp-C2Bs-10PA7@$4y20mznqC8;6&MB6oqswUwnLE!tv}U4={Vx(2CVskTyT! zXev8{)4?>r^u)4hk&19MJ24@o(vCV!aV_q5rbQH|Me(s?_@cv$(8Xm4JCoroPKFzd zU4xAm-b^MH9nEHhw6oQWs>aU~{^zFE4)OtKYD`v+8qSs=sv7^NL5l<1K{HL-UvN&Wx_6_+2;fDSv2C;frYWzYH4vZ)Y0452ul7yy;3LFS;<^Yzb<+nM9%O zg)gE|yZoh&KG%~k2NTn?+!b1-4;?LNLKN~9zKBA{4GQ%+QwaDjy=kfJ>MQk9ydaI? z9Y`tdOc&sL>?`ZCN(cIgl`bzk(*^hpxk(o{A0?OmP?kkqMSsbe7QpAXSJuLrkEpTl z-x{>|duLj_fE#H|rywrAK`qq}>n0@qnOZaX4F~hjipyd*!$)z>VA6qX)2>bjZ7BWUvJmPHi_%@xHO{{}ljUPLSxo7P>|{e% zwzRy@YD(9SIGTlD#wlb<2r9#Sl2SJjfn~FiMc}c**MVv2MB(e;wA3$usqQsMz8r)w zui(VnW;{46%Oi?XwjdFa??T~=$oEX)i^%t0`Ae1WS@PvTKHyt{ra_DJPIq1olzzJ) z3)zJDltGqPoyh`xBF|cuRR%k68f5u1gDn5enJmDE;Y=$^<}GwnZ}rc_Nk1}3^KXSO z(&d&4U!=?ZRQ^&s*%c=pbu!> z1bqMNCgadfyv?1*d$ho6xF8Q1qfQy*dCZwSz-O=QTclgIMd_xO47rbyQq518}#@u&h+>+PLJgoSLJ)@NBU=399b$d zEdPuAr4GbDb|%$lDn}}3j-w63h7BO;`cv9`Mx?q){!*p7m3%pvvwj~Zm1#MGde%h> z7<78XnNI%!r_=J$xt!0LNatjE)c$wTAl8&KvA&2CYnL$);{J+<^r?cJve;;zw1ogH*n&bmwHw7c7^GnLw)anM_qjIOBSXcrIJ_0yB4POE|q=Fzj9$}bNP0B zRlIp&+J4Z1^XTcw7cj0jPMkXOHUA!lIS{Re*D*}q}Z$|yFpbw7-FeHRXrbKN;@x%iPiO(h@~@B)zc!T z&2ZTn*7`#urgLqXdF?+tV!BHqQ?KnuNKB`D)%GNbX+yl~9w;f&{MGbaiD`b*p0%i= z$4gARftmzW@|1~b?Wf`M+yOv7Y;vPLgd#c#ZhrAXWe|4 z#mSr)&xwgk)7j^yN3)~(YiRTBS>urFoZSX--v65I8*!cMjkv}k*EuWo=)4hI>>Ke4 z*Bfz-LtZg72p&&c?OX9m7hCaKWjtNulvkWW1JV?2n`!YX*PC&zQ(oakH{(Y8X1v<< zW?bWx(mlUQLSfGx&rV;O-YqtZZR95s6z>){2gEHTSlpTux8=m`IdMl$+)0AOT>-ju4hfSXRU)?NseW}O}Wj!DcxKd zH>gdy=1J=bq4JP+H@Hc++c&A3>*O|FlU4=rdfKvszM+0_yY8@WS2tJAE&6s{`?%N8 zR_z@Cx9Lv%Hg$6u-K1~RwGQi{EgBdY?im;fpvT~L`*wA6UA;-)u2q37-9gWrpo{F= zOl`V5e~lQ4k6S&T^|r1Y zXS=IjwUnm4gHz{6Ou>MYV8@izdf6hYbz5)Xq}Siu9S-`2!}5)-!GYeuun&D)a-#+E ziJy|c-bIXO!Y0|Sm&I6aSvF`rx8jpGS%CJfbDy$7q2y6%lGb4;md4a~h5MKu1(Qoz z$y=;AuX3NWnP%Egki|(fv1e^3qkD9u=#dDVm)@#Ft%ekJebb^B+2CyTWlg)rdG$@Z z#?!l(HSHSbl`na*sb{Tcwzn-CkeyOmZqhN6 z%s{XsgY)d=8fR=Fq&D!Hht_*F&He214+MSa%ujIkz5HU;@`kPo_Kn6KT?IM$@-sd~ zT6^uM=j-EY+PBww^1A$TQIVEj>)cySeYz@=+4FLR$|9{@9rXGG!ya;O2oB9|Gn|b| zr)Z8x`O-F9bPi5o(T6R@3{L5r<)zg(EzRw5)U;}9kF<^C;%Lb{($2ycc?JAB`AdBT z{6_NSAfsi#;0l+fo%n$%wZkf-Mehfz&w7%Mk84k&@0*tT3SUH;fc&LO^9cEJAPq3t zM<3S(eZD@L^yA2JobNkaXW6hhIkdh??3>Iyj%3=`^N7NjiiNCIy5Y#CZhr2LN*=h7Sd-k ziDYOv6^W+@FLsgNOJ_pfbVmL)BTObk_v{z;j~^Nv8@*>t7$2M1x940kI<4LU-JNeZ z8c7S@@$r<9P8X*Vzop({Dw6o!S0~?7b35}}8oU{KPc7f%jl~jUkxVoZr+QSc5Um9v z22+WQFqSEY)^(-807VRS;YWNJ77UKPCZD(fb{Or}E1k_Of7Ec7KDkh3%~XIXJJbJJhgKqG$Q zx#^ng*u3rGV4OLGa~*YtdL%2PF1k2FQP+^YM81zKPgW~>isN{@x(AtiaGs*hNdCmw zSr;8e4P{pJj@lGN;;IL7VrNb~Le6R)Bt>@~%83sLL~m}TNa{YEcQmpoXe3THTx$NI zRK`Dntk34aKOVsON7FGOL&B3WvK@I`h$I~iAj-LC(fx|ra>haPAHg+$J#F+ZQasSA zcwULosao4a4lVZ4m9A+WY#V9RJjH>hJcRR<2I?u~{3DY}IEzPR*VsGFHcTQb3>s1` ztZ)=ocyZpafqFw3cF#=pl4_%d?Gu#_MvX3x)PJgh*d()ss@%7=bYM5;>bJtf!=W}mKb#-dB9@VWF_~g zZId`y@X&iUpd;UU#Wx&>uBGpi)I7m~C(vs}SWj?#ELZb{@qj2Sztof~Qn}cHCj@bx z;8DheRUE;U?hCcO(@{s^!wAkD*c9P-(fTf&p%zOza)whtXCU)KEtJ$fA6MZ=^QUpH zu|al?S|ka0L(f6{@Hoy9>dCdZaMwV8e=qu8dZPtoe_f0F7tq&!Vw$P{)rxi+N?R(mw{96pTh%#;qHM`=$pqItx;RbfZ9x(RDK92 ze9AlAbsRkGZnCDmp$xQg!ww!lO)i&v{b1D1)~FAc0ab2Tzjx@EFFfcy<_m&pX&qgQ zk*ORrY9nPNZ?Aj1x_m)2>sAZaay(t7fDZY*-2(ytX>g;`nzF?jwH%LEHOVbXL3upW zMT@EyB`w4ARSKz0*)=eTZqprBr0d;}A3SoK`X2RljSQnhrJYusWmw0w>N&}R#*3~A z+-?PXgZquTWf?4w4!g^W_~CLB^Xj;?VqDQ7>izB$*UN2uY{WZ+_GDTpt{7#1T^TCH zDdSUMpv&8J96dhK5^=>r%TOau8K9Ww_8;vHplRu|rp0N?Fu}GS_jw0Na7fBJ4)u~p zT^~c!(zi{E(Uv7Zlwpqz4V>~G^`k-Q>!w9P%izP?6i{ElH{>1mg?*29`37mFFm&`! zUpg(yTn0~Wk(nR!4Go0Jx}6kC11|t>wPGzpu((5JCBc*5KR`>tg$MoKE?=0#vWM1d zF51Fn2pxCRDu3sr@dNuOg~>$f;vS`)E1@8sP6O%ZXswm<)vRtet5BwDJ<|6HhgJ?j z`p3f8fobWVfrV-0w;J@WQ=URK(sog=S-bqDs&qa1a-b5hBFl9a zuH}A(7OC4H)Um?XfoWZR7Rm2SGhitatL|9F(j-z^mP_@kbIvpZ7U8h!eU7vLEQ-*- zY|!P`oaq8AKOw&tRAf|IMJ}9$GJkAP<}1#W0Ty0ZHWIm3h(Y?F&ftM%2X>f;VR|{o zg)#(^C#ua(tmYz4LqnsX)*@Oo`gi5zDxTS)ZRD@gQRXA%J~mM#mA%XHCHYLK+Kjm&0B*Hb;I zh5Vj_*$jB4vgiQi{uN8k{z77*Ck?tpoaq9*NVhCR zEXTz<={aXQ0I!i*=-_x^S@iaZ^qMmrfS0J24YTFBR3-hHGbMochb%n8@vL0jBYx;i z2jJD2WjeTYl}6fjR-0(az`0ZYQYVz_$d`kO7Icn(E3W z=N@{AVp%vrv8&)x#j@#va#zD83yTI{^Or7`txRcyul-9H%SLy#f3NXN8AbbdbzIVr zU+dOyf6^wGv$v|@(nisSuZ~L`MH{|qE_EzBI+U|etKgDHaqzW&=_9*4zwA&{Zu4rm z22z}yS9Uq_TF9~iUVozioZ*PPCUT?s^hwXX)~}7+W(zO7KDhaj*GN`YfLF&yUMpF) zLnC*9HGj>d_;^&KxP?u<=JtHVgMv`J8B~-5t8-mH`ioIg% z3a_^3$gAxSlZv%l$bhyrCvMA$+jHWMoVfFeX>r%;Mu-QXBSf~0w?jAd26~6dMc^*< z^>&Gb5zi+{`VX6D@>dRKQkCQB$ilhlGPdvb-gq<p0 zHZQTT>^6Gka-}yXOBth!bjqK_SI%FeI-RC?3io{6gehZKyyF{|+32med0|#O7`xCS+I5;m(hn^;r5-$;W^IqodHCCcs(h@Ly1oxU`^ zTWl8F$WH(hM(?5owPb2$W?B&T$Fg@<9wW^_KK*Zw|!{s zL6FmUl!_Mp*^F?(>uB-1!hj-=FZ-v-6O#AdIsM%9O5;l@Yuk0pH=L?_aG}KvIrzz` za{0+s(S3(&j*@f#v2$7#5#%WK14$w7!f>+u-C6y6=d~eaA}5|HgQwii!&6o_pxAgy zZBQwbtK5Ne70(daE{UWCd0cTc`xL!EUVNof3tAlot#<+4K?z!Y=Y)8sj6rK*!Z}cj zVZ}0yB6ss~o7GJ@MK(_gYaN5z)MlSD`OSN9ej|spE(|s{fl6(aT%M4Y7Pv+(eq>Ks z-S}eTDYZeROoIxo@(ps8^<-mT_LN#Ut0pVCkdfiu#yu@w4swP1At7CJ1~)UL-A)yu zRoYR`Fqn;{h1$sAUb?*7&Ol4kgPfs7S?Fpx%eBSsLpkx`fatv}9u0_Hf$VeBqoPkd zrXEwDsPKFeTDzZ<>#Qyytu1&Dh{FMKBqyE>h^GSLqdD<3NqB#p_*;nl`lL82j^*CP zB`gQoY4qs>knc3nGaQ!&9h;?0ZP8nvMK65=f{VATZk)04mfFI%ObcK7QU=IfTG&~R zHoiDo0IOLitj4@4lZ|c0(phVzq?20yqqF=+`eq2oTQ;7GL^C~!RFK?Xj0ppy61iqm z28UVEOKPc)jt&IrD=8o^*<8d+d>6{#C#F-Ln%lUat3+Rp0lCc<<~IG=SSFfOhnMuK z{Kgc)=;tRn6Vh-xcx6=nthtfCc0mz9X$-~n@nygUst1?B(^f@As zU$qtz`h!EKXz>C^Ba`eDd)3#NY8Q-MzD7#lVFEeCR`1wT*=R~&-r&117R#oi=PXKD z*jxmvxkc$UlN@Z<(PyYYZn4Se7C|wR5-iHR)O>>H7A}2~3*-}9)m;{4;;0Q3F4o_2 z`#_PtPzG{~O-8q<4Ha(HWOLgm=v!?dpV(OlGrJP;aZ=7E5kDD8MI)oJT4X^E_{at5 ziporS4Cfl#f-ylzF7t}6preII@jZL(Xt}UGvf_S7?Rtiz-PjP$Yql5n8nS9}(QQ`0 zu~u^=M~?I)&XLHr{#jw!=;O$VYOCF{u6BP8=M-eO^{n8H#cF;*>atXN!rLg$FE-LJ zb|5|`_%4vjzZrr4=xC@=!xSwrArI^-FWJk3i1x0%{B>ZumSj+#45mq(>)g~e5a=c~ z(FX$Ilis0T?@_-m>>udr>mTU$g@ebvL%wcDo+REvaszJ*IM_XW)B?V5T}k!etx^#$ zi?N(InG@qVF>z^{X3u6v^P9C|wc+5fmsExi)4u@*7J$H;3cy{*eO-N|P_O?qn0La8 z_X_tLxVgaV4W15kfl<#`pp6rm>H7^JIx3T87bnR1Rg}&VcUFJg6(r$|L zKu+w;iATsD`h#RcjNQSodhkNNg8{6ze3Ma;G8WO4`kjdZtTb#Aql|TjrIa%g;u4%CZcF5>C)dilL%N+^ng(! z-9eG@)q`>r7?n1p^kR9)mxFl-SW2_-R;Ut+k;is2O2sPIu5C*DWKGn4h=T@&?s29N zu!y9!LaRF&(C^fQ3<`w}3XM8b2v|LFo3X>WR7+9%KtU9;nRU7FMK-fuFi7-E&Ljes z4YZPIbuJ`*rXUKD=no2CM550dB>I9giGbzuO#Q4p#q*^9$C(bmI&mf)%272=x++a) zDRo4?w(xaeTB?`7*lD)ZNWL7*V88-t)_Se3bLq$D{RM?c&pK52B6{6x(CYzbdI1ZA z6&Z?LC=(_z@I@s0cLs@m#hFCF zN>E#jbH4j^p``!InFhcTNG3NaM?oa%EoUkKYyX&3C`TnA>57b_SqND4#=NC1ucNfv z;_j`bZYN3FE~>UqrMI8f1FjnM}a)9xKVTI>(Y;F9<_q`rX18k?Hph zGJVdOOu(`hrXHx~*{}TCu+4QGH4{ajenN!$j$SBT`ib;c&Qt=HbGXsi=Zak0cXW7X zA=K4b{SM-K^5tOt1uSD=IH_wqGnrv`oHS;rEDq`NG%1Y3W1qml}P2 zn0z_tx4?_q*Biww9Fw?yZCm=hGckadlugHs#=EIyxQ8e$IFkf;LDzIBZ8?6T)E3@Dex=cSH;zoUB-@3pkM13RV=+;mSD|aTWK`3yQ4i{=a=iq(;~WCD(|+s$K`iX z=0D$fD(DT8!hJ%zZN{5Dp)MPXuT*#(F-9q|oCXoycry}w6 z;KeTTd+AKbo6g9;W`xOP=dmyAxU4>j%1Uo#PzjK(e& z2a^7wv#yRj$#IEXP~IC5_uV1xCwD>)=EOre@o-MOr>}(+9@s)IlWfh2+j8ReoVX(= z?j%;pHH z#|J(I_JOB`RKlVcY`tn_1s*Ps0-uK}kS*i=zH72#?&v}lO-M=mJQo|O>Q5gBcu zLX3pX(WTo!hTV!|GOTFXpK@vl(^tfDY>Tou7Jcx6LYsV7t_-Y?mR((Ns z4JDp@H-kp)RR%J+z59Bb597S#sx;ZuUhUi>4;R)hBLB_-ZPuwh2qTJazc6(a=rJi_ z>|D)bw92_Zqk%~`&|^lUWglZ|gNpluN)OIOuA!Uhf<^X4>3d)LiKwJiO)Wri6rdaj zdPZbyOh{TBv^et&tp?71`wi0Cve%J=oWMCqeOk!SMQ_4gCsBtF({hK!vYHDWtcA6r zVA{%dZ=21JbEEZXF`F4roUhG6&rZ`k*@}OSEP(Tk#xp`jBxy;b7p*gbY^EZ4+}JD6 zH!JR|-B#EvJt6IxB8kh(E?uxa(=FursAYF9ekL|sOM4NU7ljv!_d@tPx$+ZF7Fg$rll?gbFTI7iqJjSCq$Pteik zSg8|)^fl1#m zn9*aw*jEO`^$hVan6c4{ajW|e4>rjD8XO+-dHcbbO;(s?cpSA}#_T>e1gC7aqAZ8Q z%9KN1XZ3uY4?Hbaj8~SyVS5J$hX#fR!oyvIV25qB!n~%8m?Pb2%r+~`R`)SUzx0Qx z*TN@~jTV&sKmDoum}Ha<4|Sa!?(O#tfSq=e73VcA<>3qlx_NNYmrC{5z177?|J7yS z^w9S7jRbw(?(QLQgKn_^?JL7O%=NtiN*MMA&<|_Vw^oZaCn+})BrDG0fH;y9PX@$O z0rAnCc$(B2d7S+15c%~EfH)D%6>ho7q+H$mPfACm1Fc9oL7V!GP{d9)~Y&ksm+8}9BU!WU|NMF4z)}Ca4 z+VxIK5r=$TC&7sAR)}TrR*HCZVE8x~k-pViv=z&+LQ$WlqsO-U_mC?NK{;uePgN}) zwG^b4V#@c%{U%l@P2=WX5J!5gyu@40#FcQnU%HQ;tCg>rP0*EblU4dHD6~7*8Kplb zf9PVj8KwVDY2JNiHSpq|$qU@L#V0K}qXu4BQy-YphB%jQuSwTma@63!i&`5EV;vPh zSY6thbd)e_-Y@wIU*t)x z0B+pSk)~w{6DV5+@wnsOoUUh2_HBlQ~e@H^83m|$+y!-Z^fDWTUx=PL9^)lbej(*>AU zZH!-CO0t$drq@QADSVNh^y`JM19GOMJgJc<9o=horwU<8ErGT#i|oXrETw{Q<56|?j&Chx&<&* z(#XH+yh-Un1Hac9KQKdZi=qA9P8XCWoCyHTj5BQxR8N|maoM-_bLNZ_U=<|L8Fx42 z1gtfmO=k=cW#+Y>T4(fY8F_8z*%|%1I+E^+Gq3FoJab>JhIBk*J6B0=-ZJQFNYvYI z2)wH#YtPuFt0INZ+|JdK&$rXy-_@1eXKeE-$@DX>C)a-3-!k4co&&gyca0|mdh`Pr zIPsA_AX+T(F;G(W>brSBG@EabpOi@_BV*)66guF6Y7S9zn3~6_2~qPbH9t?yFH`ejYJP*7-=yX<)chVbU!vxZ zsQCsp|CO4*rsi*``5`qwqGkj66G-*c?4+ihn!BmlLyec3qtuL0bCMc?nh9#M)SRQ{ z1Jpc6%}dmLgqlwf^U}IH@*g38NuMNNS?Ocf$h^{*=|AulYCKmG(@4$3)Oe}+8*2Us zHJ>1lFiM}K<}1{Em72Gy`A2G6uO_CAnnTnarp8B24>cpyoTNseW`de5HRq`L05#81 z^Aa^5q2?3Re3F_!pyspG{4q6uLd}1r=D$(%*VOzCHUC7-52(4CkV)52vz3}{)Z9VM zoz&b%&HdE$Qgecu)6_ghO_Ummnv2vtO-+uP=ZVQmC&*iz#7U&zp?~XDYQ8|t7peIg zHD9OZ+thrAn(tBbeQJJ8%}=PQzm}K=YIabwlbSoJxr>_nsd<2!6V&uk^B6UcQzKDx zmYS!jd4`(jsd<5#k5lt9HLp_h8Z}>_=8M#Pjhe4h^KELrL(TW7`93v2rsgNq)UPL| zftnrE?4;&SYVM-uerg_|<^(l;)I3Jb*d7hdVsQEZGFH`d>HLp?g1!}%X&DW^;IyK*><~!7UkDBjO^J8j$ zLQQ==F%8u0pk^mEcT#f~HTP5V05vD5>7(W`Y96OXqUJ0$PgC;@HP2J?0yQ6}=4EPL zrRFtizCg_vsrec;U#I5V)O?4U?@{x8YJN=3PpGMHAf|zu9n|ck=1ywvqUL^T9-!s~ zHGR}PM$O~YNYtFA=4oo4q2_sNUZCdV)Vxg1tJJ(k%@?ToA~j#5=Ihjao0{)X^F3<5 zPtA|1`3W`kq>o7r)a;;UCpC9ca~C!DQ}X~ZS?T>ZD4p>!`nMjZ=ICfp; zH_`v^|DZn|qCfqB{&bxFw2o8{l3Iu45}ng}(c)Lf<}N6qh2^BHQsMa}b zmzopQ#HmS8^AT!3O3fFknWN@!srfrU!vwi)chVbzfa9yQ1dNneoW0zsJU)4G1pUbl$tJTCa5_>%{gk$Q}Y}( zAEf3Z)O?hhPg3(KYCcEJ=c)M$HD9IXFR1wzHQ%M?@2U9_HUC1*HCu?emYOZpY^CNl zYHp|IFg5p3(?iWMYEDvfikb;(&QNoXn)B2=N6iPR`3N;1rRI~=e2SXSQS*6fzCz7c zsrd_PzD3PzVy>lT3pHD*xs96JsX0u|J=FA2bBvmk)SRMbf|@hb zoTKJEHP2D=L25oi%}1&EBr#3~0Owc#X_j@d?p=mkZqn!AbPrh3xqrb;`U;$m=71M% zJNGYsNq<4z^IOz>mzuw)=10{03pLklBj#FawotQ`n%k(kotnec+(S(dHOHtqNzEy0 z{(s)?13s!M5A--82_&Hfq<0Wd0Wm!RT#AJjnt~N|oFo&HLmEkjV!^TtQbsHr8!Czg zT?^>Cf^7v|#V%rRD~bwM&|Q0h_y3(U<<6Wt6ZO5f`0<-N_x?}0y`NhSb7282gk^9M zTnSgfdbkZX!DiS7Pr>W(2JD7C@GX1?DYEZVsn7+w!VowF3ZV!l!DKiEP6Y+?;A}Vt z0&p>04{KoqY=kYa6<&fJ@B{n^89jwI&>sds0TjYim7oFIWI;BJgYhsEj)OD73w1DG@T;o^m@|h<>2(?01UJJo z@GN`y^55Uv#47>?%!Kd&U z@CADH6J6;8g$(Eky88l8U6}Qa0}cD z_roUG22a5o@Fsi$pTdvu6QmCkGN1?agu`GcjD%4z8K%G~a4IO62WP`M5P*x}dRPk^ zU?XgSt?&};fDd37{0IIE$%BOy=nP$8FbshLD1?bH2~L8OVJ=j_LRbVB!E(3?u7=y- zcGwILz*F!vya8{*9{2>lhaaHz5Frh^L3cO=4uwJ}f{8E*PJ)wRE>yrmSOgcra<~ev zhTGtFcmN)RXW&_Q8{UD>;B)v1euj)ggf`F8G! z9oz+X!$09scoDY4PIw=_g0CTIsL&ER!9j2^41zq!hht#^oCqhuT&RFWuozarN>~He z!kuszJOclO7vM#B4|c*n_zGGK6Oy1Kbb^6!FyulW90SL~32-8m!(3Phi(omdfNNk4 z+yQsO!|(_^4==#K;XT+3```ey7%pT&M;HJDAqR5dXgCID!wKMna##Qh;UZWLSHm^% zH@E{Hf`{Qbcplz`f5Vrs7xu#e=pcJHl?nY}0AxcB90fwKV7D6S=IB#~En=E@E)IJsm3dGxT* z(o&))(2C!CwUt)T{znsN^&gxV!RC(DQa!$*cUYGHvGJvuu>aBc-p3N~4|o!`!CUY) zBuV{MOBfD^!x$I~$HOc*7nTTq)hF9*iSDDad6c`4>VI~|0e<ShoMPt z7QE1;Zz=Wo1FsL!4&AF#*Z;wWX$>QNE!+in!&Z03^ zLPoyO26{nn7!HTSpI{73hZ*33GocRV!v%05Tn>MQo8cDN3=hC_@H~6~yWo5H0n!VE z4Cn)WAscdFB20qQ;S87$^{^C{!8Nc3?uHHUFL(mpg12EGdh3VwC*NVCxS>9qis!ZNr5t_1ccstnkes!M=%TP=WF30V)@;3?PxpFmoXkPe5z zP?!S6Fb}F=HCzH~;Re_U_rO+o40gcFum?VYAK@oxBjcmmLNDkI!(cd!h9jXErotRJ z4dy`=oC`|?ze*itCeZctS_|L7_j=%Qqs_oB5~R8UM`r3@Fpi(&fx{K`CHVMR4l7_K z+z*@JN!SK&!Q1d9?1dyLOSOb<&>aqgp)ekf68!2*k*6=b^eTb(V5i_$Pfjuef2G%c zIN?viiEz~z;cD0iU%{}k!f==i6>te$3Y%av{2Shb^l?H442Q#E2F!%>;R3h|?uH%k zGJFT$L*Ma2KNt^3K^gd91+0V(un}H|H{fUZ1qK`?41|d=2^7qOOW`uu1e@VK*a>@K zAMA$%(Eezl1N4P{FanN%F)$XU!wfhBJWvC*umsM7)o=-{g&SZ4Y=lQ)3%m&1;XT+1 zdto2!hXc_57@-67g?=ysj({;R7N)}tI0HOT1GTUO&V$u(39N-1U;}J~M_~)R058J3 z@Nf7WzJLzL3Ym}#c`y+s!5laZYM~C6!ZNr5u7q1*Jv;`F!yE7>d^_A zKj;rfKo*RLqhJ=yhPhAyi{UI-1p&Ao*23Me0k*(a*a0uY$FLi|h3_DBqRUdC%}o|gL3f00$2*m;0m}BZiV%5KWu_0VH>;#ufxZ%8@`3_AXT;tsugsB zt}qyeKt2?}u`mHnfD^$7<=}?}uoRZT6>ufo3hUv1*d+MX*Hg>}={0)24jGe$Hc$ui zVIABAJK$wVk(4SG@*p3U!wR?xu7>q+8{7|@;0bsVUV&F(7knuA)!=ESQc1 zE*uBPLmkYA%i*u^2D}NwrwWI|G?)(O!V*{uH^AMn0Um*W!gKIEybbTbr|=p406#)& zsi#VVuFy^Js}-|#X@_CoI&LLZm|r@_Ur z8aBc`@B!?Cjx&W$a2y;D7r=#ZBdmihuod2eozU+%p+Ag+@o*vh86Jm!!GGYtFz9$; zFq{Y{!If|oJONL_$FLi|fo~ysmXHFS;2;q=(Ps!fIHzGco*87Ahd;eOZzPr#G#3cL!t;6wNt{sS#e6_TI>WI|u)2ZzH5I1>H@#V{34g*i|O z3Kqd)xCoZRm2ef@3hUt?a6kMDo`9F(75D&l!PoE~NRoN4T0%$Y1pQ$E906H^Uwu+< z7Lw`ongI{MgYYyw18>4x@CkehKfsTWcAAh5-Ju5@3Wq^4Ooe)AfGglicmN)Rci>&v z4+mh->B3-`2$Mj;JXi$*xC`!v7vM$s3ciMe&Ja370TjY1a4MVw=fX{JGdvB?z+Tt~ zojpPq7z1NrE>yrO2*6!%H@pWsA?-{d9gcu3H~~(CMX(sIfi>_DJPhx^yYLJA3Vpmn zUl;>p!2@T)`EUW;47b2GcnbEwCy-Vmq{Cq_6sABi%!4Wjz{PMkY=9SGJM4q6pi`-E z5adGvoCqhuLRbV>!!__AJOppUJMb&)he2h+V3-V3pdK1vE!+T)!Q-$CK7?eSkOG5X zFie8UPzBX+8C(vVU^Bb}@4_$eEA%TD`olOF52a8Be}ScNE3AiY@D%KUPatiskPe5z zP?!qSpc-mmHCzH4;U0JicEEq(8|Yjibb%rm38%oRa2A{mYvBgi0$brj_y|%eg;W>} zLtqk2hDuPd5>~-K;C^@q-h~t;q{3hr0+V1eR6`A13YWnRa3kCU_rhcFIJ^w6z=!Y= zd;{M?>O7$pbcJqkC>#c3U@Xjph@E+`hy|52j zR0&DY2@ZlmFc=D;5GKK7I1NsRI+zcCfu(RYTm$#Oz3?7S@ELp#Y1KkH^oIdZ z0EI9Gis3Xk9crK!&W8)&a`-FU0=L2@*bGm@Gw?RN17EZ3MiNd=fJtJ8ZLnwVIBM(?t^Xc6ub@Zz!&f(?1ux8Su1pefp9S7K|V}^$#4dE zpb`8KfQw;0+y)Q8gYYao2k*kaVK3~1mUTihbcJp(6o$bV7z@Y4EGPpXEP}~-l zxB>2gd*N~T7rY9u!EV?CKfsTWF<)o{y`c|`fFocWjECc47L0r$g;upM^6hwu~p4DGKJI=~?14| zEQhP$YPbz!8g~MPRjE9rq6sUq~SOVw4rEnSC1UJJb*bL9YbMQ92 z1E0a?(Bf7h33@^=7z)E+6pV%`PzcB#4>!Xt@Dw}^pTifx z!TcYYJfSB!!)>>l474^67v|J|hO@S==;CL9TW0uP)C7s8+6R#*>j!#nUR z?1%ocNT>lY9*%NVHV7WMX(sIhqdr8cmlqFFQLQhLMG%uE}Q@-f)C2U z4+~%^EQ2fHO1Kr)!~L)co`h}i8oUl4!*2K%zJt^^gjUc6y24->0{Kt?$H1{L3uZ$J zl)`+dhx6eAxCAbRwQvJ$gnM8sJO(@9W%vMg!GGZ!NPSai1wEiA41?kDCl~`WU?zB> z1R9_bmclZ)3a*Ab;V#$$TVV&h3?ITr@GX1?>2C=c&;xqHVK5X%!YG&wQ{WUh6)Hi& zVmJ#{z)H9V*1+H34tNkAf@k1acnjW!PvJB85q^SnS=&^G;18r!dn;>b21&hfKzhCj z`$4_}D+|7~74%0o-sS{dHIe-H@6Y&N>km@=|6qTX_kT5l)BnK8@lAKPk(<(@MP`fN z)ZEqY`J%Eq=6^nde9k@22&Vmi7{S^9^AY4b?r}yi<^RJ7mdOYzA1s2!5P*weBisX9 zU@L5gmju5$!<(cZm8_m7y=q|ibm4H=4SV3a8N&7OGQ0w5Glg_0fI=t(A6y2P!$09s z_y|6RHpdBVAq%qM1UM1Sg0ta9SO?qSDcA>JLHFZ@9xw*RLK*nrVpt8EU^DE3525`m zp#zM9(NGR^VKrO=n_x4%3;%|evxQ_B3d7)dm<5aBEVvQY!IQ8JK8G*hpc917FbYP) zJg9=};Cgrxw!vQ52YpTy`odJ027XuoYvBfX0-l7=;B)A5lF${#!FZ^GYPbrnhUegU zcn98v&*2OB8GeB_Ckt(%7xacM!qa2O3oLNQE*IdB@xgDN;1&Vf}BfNSA8xD)Pz zhv5-;4xWd1;9d9}zJQ;&=z_@Zx{x{VKf{G#V{4-z-cfKs^Ba*8&<$dxEij3 zO|ThWh1Xy&?1MCEs!*jve;5EoFcPN1G&mEyP!A387g!2c!c}lP{0$z0hv7xo4!ht( z_y)d(R?<$QY7IT17mR=-;21a-PK7y82lHVWTm)<2TG#*^VJkcaFT*Ra8}`6Y@H4bO zUFZM<;b6#ve3$?e;Z&FdHBbx7VFla-H^U~_49~)IunRtfpWtU`e}>Qj2ExIR2l+4o zCc-%0cU^* zYM>UDz}pMw}xJ|aBhjP1P<#Uht<2y$7VdyM;US;!Fsv*WR>3u}25yJH!K1JRUWM1-BlsA;fo~y2#!;n0 zXXpZhU@+uCzTj82b!KABrq>DZ0qlYf6+$MAg3&M+D&R7>93F&+-~-qNDV0JhWI;BZ z04KuvZ~@#68{iFi6OxqB5{AKWm<6-p95@%&!A-CYo`TQe3&@-&bcB&G3eErz)IcpP zf%9NBTmoz12G{@_;ZfKEFT!?s4|c*{*a!RJ0JN_XIzV6O2P5DJ7z1NrI?RAGzymc< z3rpZUSPhrJTDSo=z(#l!w!n+99o~bTuow2hemDT_s)hD27>2-TI1*;TY^VeU=fV=W z3@(Rta1(5X2jCfa7Iwn>@ICwh?P`Sfa4-ylkuVCT!F2FK2{b?>EQMuo6#=#7j2_85TYM~C!gY)4MxD;-H8(|~d z16yD#Y=@U%C%g~);43%)Eo9YH9Uv3>L4P;`vS2KXgBdUrJaDGqSA}PrmHRw;oe#gj zuh4hC&<~D=W1s>m;bK?~e~0_v4R{j{K#O|e5I7W$hgongEP=nl9q<~w4nM)qaA<>Y z7@P>h6?heXfFGexqtF+MVJa+!v*1=(4?Eyx_!)kIgZ;uFm<}`G95@&5 zh7IsCyaM0D572vo&q^;ZyhweuiJ5-6Ekq^n?D83wbaRCc)`&1~fn;tbmnp1KbGr z!r$Q;cosf@UGP2p0PPkF?V%s^hiu4!qv05s1E)a)G{Op42{*uva6fEL5x-C-1rhH{t-0k{}8 z!vpX!?1qDu2%TXJjD@*S0hht$@HqSnK8G(L^E{y=6hI-I2B*UXa3Ndfr*o5H5quVIABA z_rl*{D?A3<;U#zvcEXpi7m_XzT0%$Y1Os3o6haY9hAH5IGhrbtf=l31xE0pJgYXb+ zhnL_}_zZr9{m|h;Arl6`K*)tWI2I+mt`hHv3JNR=gAwSq3t6$Zl)$cF+r7AC+6a3c7iT=4q?9XySm#>I6$Ps8HslG-Z$ zX#mwSMGm%;;kCns*9Cu|ePwlBZGEH1TUF_8(BBa7mjt>s)cWg7eV*#tGJln1QaRUC zURhy#wS|stl`?z$PhQ2Ub;rMdBQ21=u(BqqM`k#xw6><9wn_r?ua>~JIxxClYF%wZ<)S9t zbZH>f!*|S^RMlvS&hR!gj%ci%=c{RG(vL<2T1EXzXLyxwk*~f<-?|Q@I)9|;(apIXtlSow4zD1 zEoP|mhaTF{SluXTZ<)bi7Qd~oA={#v6 zhi`TGWkOd~dCE%l-6LKrFHX|$loz+uFO(Oj>9@&?Gxe+F#r^er0i{M#mck;=HGex`xa8%v8j?rrv9=8iGBR+uRm%bf0ptqO@Gcp{*-r-U$PbC zPm*qQTSodyevQ-3ZA%?C$uGugoBo@k+u5Eb zl61@3(^`C`+tr@dVykXdds>Sdb(`ALTAZ(2)SlMjOx>RLv=-xZYueLV^w(`^Piv8> zThgYqZIT@`idM9#&2Ii~P0}rBGm@?35`4fdzPd$X#` zl5|7F((^=qrRXMzWd<+cSDJ2oxHv<%JY3vXH#=P1Ubi_+frPZwtqn^g_W|`CIDNy+ zOls~dNmq*OJLFk!Npb>zTIz?$i<9*e^!OP zW&BCfpN5fP_wp-QJ;t9D{Y4nbpwlspP}Z@ zDD!6uf70~lLL_U&uN3{E5b3#+U*q&ALYU5X@H10?9b{TclKwV`l>at;lk`_XrnSh> z-vr@rMw%>zQhbK~B8UVGl^*hEl=(Bo{5h3Bayri+Dc1a1$)7a+hPbDVD}YijUEc>q^gs@>s2u za1nn}^i#T${5F1N>gRK1fqjZ!ZRzWN$Zxxc2=90Ac#N+2_MvE&8FzC^l`GI(OtvCT{FU6=ZCxQ3U}=YcYPP`>N`G^ z%lL3tS-5LOxNAeW>-BKg&*3iJY>KXnZZ<`C>1I=Omu@yicj;zRbQcW-$#f_!C@jd! z%g)I!@p-e#%bHAcK|eAbbaO$vtC3@t%$%b9k^-+cXQVebuP{GPVs-O|KN0)5L@3?$ zMYu~hbEo_1X6|$sSBA-{%$J{C=*un2$tuV%@-~_8Yy3=3`uiHXOMhQOcj@nI=&mm~ zV9;G1Gecea`x?5RH{5S|xa*#9*Bjw3{e2CcLVsUFcj@nI=&qWMp`7*iHFQ7yeGT2E zzptUY(mRFX4i9(D4tMGAYv{Q3;ePu28oJ*%;ePu28oHnUzJ~77-`CJx`uiHXOMhQO zchS~YATzHtcVuqC$ntVunYXOWD@QlFrLJF?hPr(&-9-a%fy{zZnaZW5g)-fy(p*`gQ>``>HqgB= z8I9O+=&19J8lc*f#lZ=)h^kvBXC9$?bWBhWId6BbN7Mk-IYB*wkuLR!9-_LD$zkpz z!%3?9tnIEx$!)m2;wc#p{Vf?rRj!9ij-hGQN3!$>I)|52IhFQSn@=@zf*EKXS?=V~ z@CIL1d6QbgNq4%h%2zEHT+Z?}`2yXuv+_y`^Rn{_O3Jef^NMmEi|e84V5*%WXTfuu z0&U8C4W;#!b*vO7Ctsk`OwQ)Z#>=W67dR-Yyzt~T1*l;X=nD+8@^wq3@~CC&xxPk^ zEHAP?n>;F}xJ|}Tlqw{Vb3#QANjQC?Lv_hqa zinixQI82SFZ0Dqp8I*8}$HXRAcpIV$?rhC2BGd%RZ10$Jk-q(`6s}=uo(5~?sw~OY zb$vSA8RxP zQYw5^b+V!BW7Q|BKy?O{?iDjmE+NCMe40;_=3)Jl`iI9WkX%`|$bIu03Y7*6q(;_M zjvn0nRF00%kXr&ZWuB^9xn3XI<^@vqb#bXpFKgT!;i``M^oSW-D`2RVM{_AUM)L5~ z)%(ija(<|4YQB`|3kRIh*B!a`Y_xNIxO-nsT@m!m)(x*h4i7w3eP8v#brUGPaVb^QmJ$*8&~6o3Jb^zu%Uw zt?cV->wO+M0P*|6HC0_F%PA6Po)uYcYim>@wTybkuB|R1&91F3Y1(T1EYO$4-x^d`-;ZR!+YmQAQmHiRSz%Ts__1^SmMs(Cqctkw9Ha z-D1~cE1=o+*h-O6C$|9`J$ie4dXqld^tx3g5~Z$itx9Y_^HqsW(Z*E8-{76g5*DnB zy?#2w)EX)iyMEdc&90wzlGgQdg1`;W(`A2D?`x=Q^17TRM1u69<_#p5R#lRub8eno z#>vSqD9Oo}t3ic%BN(7=p}xrtjd5Zapl;JK6;&MJy5z$Eb%&0rsjYL5VSu`unAAG2 z-;6|8t43y!x<}_#SyLi;sdBkR=XEKS!RkIDQ)>NJo`v2@J^8y^qZS&d zp472*{)P&Sz2lXO(ryVtG*3q(L*HGmiR=V&|^@>DSTu-sd zasj6)kXl<`Cbz78fgy5rI!`Wk`s6ZoZdP7Vo*a|%d_rZZr_t9S$4qjtA}0lM1D_n8 zWQM*jUFr?N7w8v1b*WTK?uoxevM*)MlE9m=xQcq8x6D)St0|S+-|tXJ$D|f5eoIn$ z(n9vRp``yNX}(T+sQRX*?9`~SFEBKIWxZ7ky^9;?H1ys4Th>uN!v~z*_Tw-cpFM9_2#K>S?2xJIUfJEn6zY~P6sUgG>AX25p>%;(k^v_#dSu}Fsq_Nj4cPI)2-TMO)_Ow!=EWcstvcw$WEHgx#anzrfvS^9S61b# zx0c&fFTG{SwHG5jL=vbjq)(QOp-dOOiplQMTUu1;E6E?3Ra96qQtk?jV6f_;BTFl| zNT$A)dpvHD3|75~?BOje^_3TTy#<9MbF%ZxM#^?Ic)Bg=xe(|LbUM1Wrc9qOLU^Rp~^s~~shPA4x zZ8WQHaICsn>4FhzDA{I4a*66cz)BV;FvBF1NAL6zgPD}QtkjMubp!=>j?GW!V1^C0 zk|zjm?Jd<8Iam-(>D{g5R!GN4hM{4qfNBl2(#DIlOK}{qnu<6|2@O-DnkywbGTq~m z>r=jZeRn4~em$)^x&$2*sdr?k8b|4atn~3?<%+p)k$ze(JbB&LrP!FLbtyPdO`!0^ z>rzx`t1>xFXmp&g*voQkgky0I4w42drPM@=b5vlDtkRNvxglJZU6hkw<}36?wgv28 zn6H7h)!rJv9N@^AiyVrXy?dqnmLo=~t*pSuE|7T^NvLL0g??7fu3^dK87?YSu1?7g zmE-EpR(cZ|Tqx2_Zu;Qx6w2#q#m7dZnuEgdjO}WrhzV$8atIzvdMKs0mBx-~C5K{B zb?s&)3Pz|>@@#9ei0aqJO5zgK#R@VT(1Xb}!z6I@>1Bn-hUlj{5>B65eF7Mq2jS^M zUsaWO`b1*n8d}YQY&mrDHdL?`>oc>3?2dZpm1dV0l@}I{EE!qk^Ondi%MqsP$i2HA z6TTH3b^EE~B*}ZWx1@^Y+1xBv4dgJ;${}844=d8K3ymtQlQWCZMeT)@cCeL4+|Ue9 zLshL@Ju%ZHnEyOk{p50vm5U=*olQZV9r;G`F~bI1$rA+2oeHWk&u5N?S^t%(MNcc6 zNT@oWN*olMFS(dOgRI2yW80W~V=fPxO1LZ}y1ph@Eu|V=VzYJ*9MWt>oYCgK4JCv( zQF>|wlH_4+7TeH094l9SpGGHCE3Ik69WnAWgAz}h=-A-(`{)|!imZ}STo)C6!QT{j zDK&8}DzU>7E-JCXt=S=P&pW*JZq1rj>g9He%bFUDR##99=L#A%AmIuc71_qaM6PU< zTkkvy5?p0YlHA#SxGX7d;f|T;Ty7kp>U!#%aJjLfrD}5D#jR@Y6>|xuVsZrSSe6}G zN(IxABu*OG#HnW2YRStJaXNhAj% zv6INu#%5UC>F2KQI>OLx#Z~=~re)zqu^hV3GY6(QbW^E^?sWA=x_)N{?v{^&?u z8|Py$&OM5IZQ@18)J9)V+VNXz6N$`_`!-dz3v27ExEK-WRWLHUNFGcq@yT_LYTKOP}&GmOR?yE0=qm;c25Y3Z$`r432tVE6?bZY7g0UcNF9{{4gt*W)idw=He}v ztwD74)F)D++7iR0VW%Nt}1e4f&ZO1=06_vL00uqzZ5 zEni-UsgTRygcWj$ms4@MHKNZ>%%u%`nGQy%?!1P9mP zTI-j)**dGJDbvr&BqmaIAbk&K)^V~LYGoBak?KUQ?aC|b<+fNuWl0sU+=i#Ky)}sr zR9#5z+?u!zPq;O4OVGATp3SvuV=p{WajGYkac)9f1}9u{T;ellO_gWH6YNO_SQFby zq54s=wq|eTaoI$=Z5^Yc)j)FS8k=)4FEjLzW-AgEo~jqG$gJ*aB{u=;5Q^>)DLN)y ze=A*Vs2WNRE$x->ASiRmaY!*?rJtf`a+68;Z9Q_0jD(qD@I$Ry8r*E*Qa~|81 z)g>rBlv`*{^|WSUY((b7*>dyQxeBRw*qPYVG)`d0NdM50lsU$-cSrFe9d!up8ubn~ zQ5~WJyGC-3-oNNQmc8yJ4DS>f8s4Xv-Hm-n7&o-LV@ULl!0ajPt!^_3dgPRsXBEiX zTlqOi zPq^A9?@({~VwRK_C-3N>HjVW>u@`e^thZGyXP7#b>@#&u?fwI-v~dD^T7i)pP~j14 zuMhdYbA57M>6%sX8WU4?8$=XFYh{vWusFc=Si!m6_(No+jfv*T>`b;al)_ z;2XD&cD7b^RM>!_IIo2_Q5{|ElRm&OQx8;po8J|FE zO|?&6zzWXTZq|sG#!S{BBsR0AqhoY}Vd`Q=XrPr#oJjrFFSSUL1>a=a-AXG@uthHz zOnr0JA^37yCr9?K(W*(RB@Y2wdAlT(4;4!GE~}`03%|1?xnm=E4H?+0UxHw_)h~8a z7`@JgHg(riRx@i^RBXDQn4S`Ud1Os{QJzS1+bTsu)jG;?j&JO+gyS0<%mO@9UK2~a z@o-(1qm#+EB&A;MLfPqZBI9M2sJ?DJQ zOl|K@LV@zNS*aweof)m@{;unoTi`*Y(>IZMsyp_qpGv54(%6x_J8UflZYkB<)T(z> ztzvUGF^60E{f0#8vf-C?$y4jt`oAP41|L1QmzYSr+DXkKOHAyL1WQb8Xa{rb>5-cW z=Kb>UftA@}+Xqgu3Diearh85}J3 zD$6{)_7JX#IViTbmC@nq8!FN@GUuW)GeZwaFyCClrGZ2_uZe8;?Biz>pnjz2_K~7> zGSjzTf+8JZtvzy^A*wK!4NNdZ?WZ`$1}3V1q76(`V5Gjm!xeqvlc2uNFpiAOR?8fy zoJW=HS>zTKDOc|sn&ea7k~TrP&alW>hmOb9UrC-|tfK?dszYs0gm-85ZX_I|+ANpM zBZmqx0}|{;Vj@#{`jbWk;+~3`0F_CBkxAt2n_v<-!!np7vO>%Km`HiOti{j~rMgfk z=K+yf8qB~9vUf4@V@>fTi{*u+W{Wpbs;5iw&Oyx;?~KimckaqO%@*&7QvITfw+1CB z-ipmA^H3)oy-W#eG^us0qA9s>|L$^H7ihJx zLcgUaFNImvu4?f4<~6BtRI{5kRCX8KKUcrVlu@)tN5*C{d8OH89!aqic}q znyw2c;yk9dYJs#j!J&Ih6L}-pOzS)OY9c9V>P}JyTFZ-@PfoX4#a6aS9Y;KE?Geum4#wLBl$!*zh&iAW zR7{aqnXOT0$ttUqmyu2&k|z6jtU>zdH=nI=mKYs=65+J#C%cuCrQ7Q=S@nXcqfaH8 zw*SK8IYaumEfv-Cbb`}JKofzIJ#*dbvH;ar>(Da@r42#y)=Q%~;Izg@btUtPLDE(w+sPFsfI zX<<^>^H8T~QWYei$wNsXZ{=3fW(srHFE5FJpNs{vlf>rauM@^NS zR}sA08EkJ&8NmsYC(LM47Zd&W=A&oLI9l?)gy`2zv{{IHTHBwKCQmr_((LTqB41ffZcb5&yeVpjsWqf; z?-|d1f#ap+329KD-K@M`X(f)1QP-0)-7}M>Moy^LZ5{-Y{n8OgtEiP5Y8(Ru(sif4 zxe!QWUl#1GJ9Tf}rUEaGTjhmwRyR^qrYUNc-Ui8YQ2J;fz}31sX$wGFEeNFXVyS*3 zU9RlL$j-1K4@j@jSL{fn26WbSiZ>Njh7FnunCt zIvMJf=k{c}=mPky-&hW`M{dc;f{}%} z5UZ+$y-lwhN6y=&&?6ar;`M5gn+u zQHjnm<7P53!v$vhz?ZGIji9|EN(U2f_qwZj@-fvFCm%1@rVpkFHwsD zR^m8;ZVPwpoxRAy9lBHZDrF>CxTE6IN^9#D>+f5z72td%kX$CKtQ@@;mKBxe6!@fF z?VN&<`T5=v;ZXG^MRbr2k4fv%pS;kkxjv(LO9so8PAh}h1nS+Gd}vV1v>ovq^Dzn3 zPVz~iIRKqbuZI``%VUXR!L%k>0h|@zMut{0Zq>)mJytwuvk;=GeQN zRcJ6meNKEkkNFv{aWGk5D_L})+8dQRRNrP(2kZJZspS-FfjJv>%o=;@>L~RMDcZ$2f8bsWL!dq?_EZOziD%(4|PeXzzqNqYTVEEek7(khYKHA$B2G-+hEv9?rN z7?mT|^1{5Ff}Gs4yj*EurO@Xc(V!0{(NhFC^c@E9sIu0&=n?9p>Ppm&>$jWd2A*lj=Z@e38tY zQuMWg-z}4aJbB-w(KIb6r%qPFn#S4+Y2&pk3HZF3B+!R*@l#YZ z%HgB5MItF&@(W!t3hpb@JV$d0X@WkAFsC>@tU82aR6jCJ_e}H7^NlYnGdD{dbGWCS zG#si1k~YH}KTe*xAdl^0pj9Q8Eol{$c_$YbXp6<3){azaF!{Jt(t6Gyyq2k7W%2dN zQ`dTRavXFGC9D2crQPG&2YW}YTY-M@Qb&ii2_}xLV1eH8QaWNn$s%i4{A7+8d1lD;sh`jBCtcq3|-MH3Vn)5sgN^}O6uGy#7`O(C6~DygKg+UCb4NJ$6j_Fv1&Ziqhokk2xnpj z42(CStSt1GzG`?fBe)*h`wotvBtlJ~$k4b(^^7~2qM|ZPZA0g?_V_u5t71oCN6Yy^ zjXVJ=Tda5`g+kPH(gl~Dqvebuc$GPN4K~||23d(^8xe1z3Z_=aIcpN!8?wPk(dm_A zqZPMup?&BHWEGqYvqJAuo+v$?`_g#RMJG_FII=jNJtcb{orS(?nJRICXE zvIwpvdYjG6CkttmBhGST!j#8R_)+X}!-YGhLcIFx1geBAg7b$rc=StX!7<2?Ve#ij zFk1N>IgB^^;czwDCCnihtt!YN(@c_CzQ)<64Xen=nDuW!oN3`mq2`fOaFv+ca3Z(< zBNH>;;t&c{HKguQ!1;YqPPwnho9intq6L%ibHl-PvXeZ0A)nch6gXiDR5b}d&GYKX2b$7_crCakXj-|>#yO2QtHEKIZSj*Lw4!{QhX&}&5;qK zD7l8~7OM|@|4b~c8%r#Q=hA$e6{|B{N+6$al8sw(d37W2fyREvX@qWKR<0snL@?iU zk~-_}aQeK}@;ycAtFPQgfBk7hc_`URlJNm3MpYkxr_{?QLuCTV73-Kp4Z%dAP?Njj zqfy~r+!_g%D%Ub&GpLEpArh|m;*?AgT9?#!4`R~R`T6c;6V>I5R1~NiqFklNQ0{HS z#Fv`{SCW9wWkuI8ZYnv1Hg|KwH+qzg)t}aq>hZ&EHk6lFnTPpIgyP#x63+NZc!_->fg+gu*EbLJWfTQNOcJ({hjtK80$*D9LyRTNoCVn1#*LJqx4iMLkTqeW41be#GXd>dR{N@TE&oZ&`rdR+Rrj#p#7N%90qN*zf8t!m_3WqRY|T9BR^+eo$CnJT4WUM1}exu>a< zS@jHQ_`(_+0iL*%+jz+}e%(NYHGgFq$dPc9dY(jYMkNY9vLLOaM1Q_*gh@j)p4&;q zC)_A1yo{?Cq_l+*2zJ4y$)avn!ZJUuH_D6`pE& z=z~Sfu9beOQy+opB{5Y;%T*J(X(OKwlO)}}xw-kil940Jb9}jZd4;raO7j|yrl9oh zKcn8)=&v`8AnOlTQy<;otEcGhN7q)@@wQvpO!K+oa6alIsdV5ltDI&M^so{*j^Bb$ zTefP5+kmu#856_T(dAJL*+>3D+%^-} z-HMZXc=Xc+`w81)!lbFinC#3kyd2`mwagYPB{EGu)gT2ANDvvE?5ZX4hy8~5;3P{S zp6@|O{`SaA9pp=mt%%_n5!vg}I))s6Sv4`WO_NA@MZq_>l4XepC%VdK&C0U!a`Jpd zBMaq4Q^>Q zWEU$^4_BRaZ9~rq%2~NwE#uji+Ii9@v3ztbjWFFQn;k0;lTLNh1y+2x#3e>|@ zA7Ycu$-5lX$4(i2^xvPD)(!q@c}9@CHi7O|Txg&=SeM;cQOO~x9Ovccjw~%H$S?Ee zW#!2`-y`%8HH0V*w!K9;InuJcd~B|y%o{lyWTn@a=lEos;0-1=JmwFgE+Kl&4s z#ssKb3TYdvs!nA3^@&%CGht^dNY-b)$<$NNv>THV%$-51i1K<_$*d4NXO1w!^M#z5 zcA>oW;m45)^A3lo)aUhjYo?4{kUmr$OJ1SeBYoo5JQBirRrF#N(=KjkY6ly}J%*Cv zPHkt9JRcU5bLgzaj7n%((S6k<@{PN!IAVIpvn7T3-tw}d{G$Ava&NiIdY~^;vmWS% z_SO6PMb5TI`5m!psu_{k%v^%HS|!FzqI41kM|~#Q_Ow#OM%Z}<9~}4-x5#vc&K~X= zIwMj_Ie3=syP3FMtQzRy>LjX{rfZ`Qw)Jm&lEwtswUt9N){nn%da7&d?BQP9#1W21 z3C76U5@<&iVte+r#>y?q9v#WYwDYZwA@AUl5Y?|wysVuG?Wr2QNb3n}mQ^1U+O7%p zjRdGJ^2uek5}Z9KS`v_l3t~UOJc5IcvdX#g0#>kLmUM8};{c;zlx9T}Wh#*OVR%?P3+LhpVL~HmU+HvAPD!iOrBUExa|d%N-UREo%9cNa*KQ(Y#D9B)}=m?(9b4EA#erLso1xo4)L zU4S00uF#c{@ktn~hpVe~tkfl8tRAkeB{tc&h#O0BXAgtbS{=z_1PLM;tk&uB8|LdL z597{AJzU+QbM=-aT#y*7ZqvDzM}^u`OAl9f=vaAS$C0fatB0$*iA^t;FW=SH%i7A= zan;BxjqAs*RFNQc52@Oe)>g~iQ?LG*F>5sm7t|5BRWNCN#ePvhpR2b zrdBMjt2IY^j_mE_--M~hbsE_=*6RH=N#uyvs=WzNPnz2J%;}H`wrgI>aP_p#xnAC# z(>J2x0kg9bjfV+P@8}Zb2ivQ->!=>C-qW$N5l9%ThpP{C zEu_0TJCdY4w+No}vC3|8L}nIfHzMbVz$dbs*g*MY65BVW75 zCP4k7bCyZx2)1+9!_@&DE7K)mtRAjfuA;^=RT9SP;VPBbRJPELV7ta9K&27gO0WKo z@NU-9AB<3Kbna{c9N~8ECP1~<(UlD~&I1!W+61VM!RV;T=N3(X>P&P-LuIvm+_|hQ zPj4v#N#3SFlC-2`t{e9%%r46+^6{;!{G6=Pa(Os060W*MGHCFZm<&{R>8W}^!YoVz z)jN_!wZH23WnmJievvH7Di{2|EKCA5kSyBhQDZrD=3z#nxBGMm2CKo5D%AMq+R5Wg zMiZ+Jjii=k?l-44v1(W(b+vbqGj;Pb!6Z;499dM>{LUZfR zM^188U-t?vSOeWBXjEF27s*r>P&-qVF9E^DEKY_|=~NLJn)zHI7xf(V3+57MJ_m!< zXwsWCrmQw8Un*?f1B#ZKDud@bZA)i^KQHs!1inH99glc>wE7o5&Cx`yl)z2hQ z$40VXh5TJvm;`E4Bnwu^-<5?)po$||utNT>EKCA5oh;giHcs;S<$AAq1V4In6ui;e z&wc4*VKFJyagqFFJpW*Rk(6q7BtMq%KUTj;N_A2sKbZo5FuzDjbt?IF2yX#nGh{0m zoOb=)ryZNZU@CQbq;j&6N|0B)`4CQ|&WvOwTg%^{RV0xrjbtV3Vr*7=1=i<9W{V%E zYLS$xocz+mlPq%3)HD7Rk_I&+siMyj{E>7q=P7a01y5EMkuFV7N!hf;Y{rg~f%@q%w*wKv)!8I( zr<3ze4WIlak3e#@G_Jsf3*B64U-!8ZPN9}WY9UKaWOmAfX>LUmqy9`9vqPz_tlC-jAbt98oyvU+L2EW1ETliS9*Wx2jmUv9p9V>Q35uwX=Z zsJhk>t-lT%H=1Wi);gl~_j%(+%TTp07%i<`B&bPnsJg`w9ls_-QQRe z1&>FiFv~&w6f6l(k|K@K4AseAJHkWN(~jtP%cO~>HqSYt<1LdWnwq>wwA>z$Hb``n zQH~>4dEm!&LJ_ETkS?8c^8Z}(0(z=>Jea5aq|HQi;qly%>FJt>Nu*vSmo{>ThKx!o zO(R)c2$jd_t#r;X^%f~xk*t=Dygb)pZC%VT^{yU6e@&%+LM3K@V2@!aQ0*jLMx$KZ zt(ohWvnMG<_F?kfC)tNpRL+&J8qy4eyf9#u>`0?_=`k#kPvk7{N>=8T3RJ#a$ zJ{9Ek0c%vEqSaUAkUH1vZ(#p%XrN`aU)m;-9lGrHxn&VM3rwW?FUi`~$OA&&Drd>x zQ1Z9BWP9ru9j<;LkM^?jqko)C`dJl-iB~_9ONRxuHPw|3zJ}Or0;%)l`xA^xe=Dch zG-^LtwX5^WGjooap{J(TWn&&4s9FXXorS*25`R_HG;z!gdvs#rRVumk@Rnqic+0c% zvVEobC0RMy&O7?S``I04SI|O$b4c)+7n%{(58KN~TN%ZsQW;X9dQHY$Ho)dic~>h@ z@Ew7+)U9nW2WP)NRtlG(6jiH_Yl5{jZX6Eqy7x>8hVYR2@AJN;tf+Hpr(-#yn2bcD<8YgIQoQ1znl&cShT8#dU=AwjS` z=YnqnDt(hbn9|uV?woT5$vP@mmLf}CYbAG!avKeK zP|Nw*&d>;$-fC>Z5pV{j>c*Ja=jm;P{`#cs@T_{7Fm*H;XP8RT&T^CK)60stLV8;v zuAj#>-+s*uP6k;ZvZU90&5daGCFYZ!N6=*&{k2EKN~>m4co#Ezu^F3zL*h&f_h@?|B2FLiKBG5_ zx~S-WaaMuoAoq;*LuA{dGmi92kZ~j^opR(NlsqcrHp6;aqaTS^bC`PV!=q$!F@5`4 z>0HBj2isFt>zA*`yB2RR@{R=ROv>*N&N!Hl>D@nm1)}2QEQ;s5q?rx3(YLoe;c(@n zbhE*U=^1B(6BDIN=9Tx~QL+wKD!ODx&jckqqIAh6@~Mm8QL+wKwb3OzdL}5@5tYu) zXF=m)X{j)3a?5$1HNPUEs*z&Nf)?91&Vm*j*4Zul=sGC#(c?6|JW2W{wU}b<6kt*@r$jy)0q&QBkd>;d<2&eELXlym@wBE*Mx-EEK3#lDpXfNB4`fm5UBC%?8^= z22$#4<>4W>#ZNahtW&5Fg7yOlL@I)@O6L89W8*UXq)g zU6NN=o-55IO1p_8M}$JujTF<)Gh33x^z3UTa*0y)a#bk2gm<-)_~k>{_42N*9vMb? zgtJdCD?ThUDcH)=mFczlg;D-U*rMFhR{6W z#EF=3Ac2vLaguiAi-;E}ogkBy2n14v37i@$&c;I_sqnW- zQXx>;GT3?K#($Or3did72!E-t3?ayw8;5GcBlT4q>zg;N9U0!dDz7;#LweXeUP9r* zZ=Wl*NdTQy0xH)b^bp_|wcc?8QMh8n??g~%mvE$@Qe9v{;dM>-*eLw1vI`;5871=k zWOCy_3f|)sZ}ih=OD)PUpDMv<{QQpu<e7xq|;3 z;PjHzc%1IL!uhc(!tj^Rl;BGsWtw@0@upz)lY_~L{#ZRZLZ}pOmtMRZ;*Nf-#2rDM zwR+v!;SD3}*Kb-kymoNIIw@wl`P(PP93zJHA;as_PiN{=Vf7n z5UWI=7gAoBh2N`%SpYl+&%S)b?tQw%X%5u*qL4i$VBHmi^u@AL(<(?2D&pSU7bk@( z5RDZ@q2|AK6lxA8D#H?0CzVleJZyp^+ zf{OgVdF;q&eQbEZ?y9wt_~*-*38)XLt)Ut_7YIaZW zY}Ffo_5Wi1`8sL*`Rc}cE1Jlp@i%Y}jU525H~zb{ydHlxzKER>(1TCFyhnADhK6yC zWAJ<91_3;_0^)dq_>M5Kp~QqJ`HdS_53X6YcGK$maBbDP^{Z-qTek0jdVCj7#DX)g zhF_W=eB(x;w!TMdjO%8Z47+_bQs=D}f!YS+HzZ5xe+^i|?UudiMD zs4?a)p|Y;W(JWl@@P*DJ$mn!8C^b%~n58GlES(gHlPe%j6^JR}c3GNROxwhqJwQzDAtsZ8#xsIb7q8ZoEZ09Pp(2dbhOBI!LRanC4Jv_Xdpz7Dlhwm#*|& z{~iLp#wROg^=UGz9}$StDJjWv+F0{nL4Koll<9Bunv~gE#*9Jo%2M zT$x{;dH+&yo!ec?g$a0iNwW06|61^Ur8_?FX}$YAtAx_SH2&?pu@)z13agu={{dKM znrGZpAFof24h?9=i?8tErc~_qpKAT7Wb#*RzZz-eHu-EWo;8bYeiSnccPw5a8S4c*7BZ;#q0 zAH(%8wrs@)f}^&{R{{YK;e5|#Vdpk9l!4SiZi7EUo1@Te@D z3S7ZkT$mcF5qj(h2|j!Pa%yJ{_idkCTVLN?+qAa6d3bQ`sXw^NK$hH_uYFqn+`?AJnBmQ+_nz#?*I#SFO9VxkFnPOw;W|k*Ht)?q#Z(Pw?pW) z`@aLBX>)G_@9DUlz+6 zkBgMGL&#n@go~E7!%JB^yw$RgvPU?!6ys$(Sfnk4llsW-yC;2uGf-l&I%6l zdIkTl09` z>xOIB1Y=7~-j%V*!=noGG%=sc;T*R$kNy4+LSlb_A3{v}R~CC*(SSYvBhQXF?jiE; z+OUg`NZ3UO!Y+m&i|t~6+(kUbUHrXb7b_a5OJ3CoyV#E}O0bWv(P=h}j>_r5Fgg(S zF#xH%@a1Sk58G_q>EMI;!f73}Yh0Ym`x}kFlGPlY#+Un_8&}~^KVO$Ow&ri-n?S)t z_1dFapruYsu{Kh8mB` ztjwpz6`F_v$Wh?r2!MLEaV24WGafiRDt&L&|91%@!!Wj@K}Q?s+R(;1BB70QAnalY zvOk}esvNESSrwvVd{J^^*Tvd_N3R`{o;7ke#^kJ`fkaDGrzgNr7Y%Yq&a`26R55)e zlW}jULBU(6L5sEX+haAuqxSk_bfVB}I`4`G5{D#`$C6sP=IpPd7g{t2Ld_3AoaT2^ z?%oFeTd@f67>gkH<{bEn1`vVCtTZ($8hm=5GIPy8XFB2-JO}h#u;V}|vj8MiBhI1V zZ8u34JydDdTpybWJjP}s7asMeq5;iBkzPrETyt6sM=!J(4uri8K`c_=GILWg@YT{) zZ))@HxaW9`dtQo=DjL9|2SulkZW#_LRj~&~4C4YPhwF4x2}c~R1y;koqyU1KokJ!U zN-$&!+QlK$mvO|rbI4SRc~oyC=3$%$F26(hF~h~9%1<4fCN%R4T=sgS5Azdx>E>DH zS1n%Ad-u!X$sfdnh(~4OT$N+>%f@pd)!y{xMv`Qth({$Uk)m4MTyJP@DjJ-nJi3=0 zYljUlqp@yuSO;YiS>IT9Fx3Sm_=$ege+IUEQJoDL^IdW!0+Cr5ucIcn3{ zpVTKO&L6~SsNoDbcKsHaD&vUcGs11dZsTlpgfH<$G70;&AUhRA``?SF6CPFC-%(Yq ze%V;sNNyk=b3FPnFT^yQVHFK}i{u;K(2(Wn#vid`OgHeT z9W$%%UNQs-Ub?Uedga)lxd?!|RZ|<|@@1+p;IGAljYs81N}rnD_FT7i2v0Dp;}D(* zgt{uT(7Lt5%gN;MisMy%DAlbi8kn5j%L143a#d$DTMC{Ws!zuqKHD)?N;xVTd;tyo zdXIzQ5aUsYMPRxV%p3owd;=mJ;=y=`@u;{KSiyDJI0qaypHh~*N<{;$;6}baC@Hx% zjEo!+3{Ng12SX8sFd89#?Atp>v3%v$_N??!%r1+eYCb<`RfZ@$1~_`JoZJ zYHAyfkCWJ7mweG7J{hN5?A9>5#rOq}+AYZ#qbkZ} ze_ZZU5xKhDutejKGrV`m;Y%ftac>Kx#nW9Y-{}0Z`*_e2AD_2`o>x5pqLZcvNmqK=0K2wSlk@;|3XlYfU5PTEobpFYaXl zwOGJ%0ijxKOyO>d8O5VAikM1D039RE(hxXYr<#-V>;88^&mZ^WMdr8#6%Qzt`n8U)Y33$|Daa$7_CtwOiYlIaI z!c7S$`+1C&f7v+D_#}Rj6740V#z+8rF%{ ze5+_+X5GCka49dtT{8}>ARRF?U81PwQP)n^@zvlkj=C$BH69l!Ylo1%a0nMIYloMz zc6h60UD3c~?OqnREXvw}QPz&=d}RHxOAx8yZo5#}cgMoUqYB#xtvxHYL&$D8go_ro z!%Ja1yw$?4Xkfy2FAH22h3&v7Y)5oH!an9|Y!^%jd`~QJJgUGYa9LO)=n%3i4&kB& z?(kCJ4sW%;yK45v(#E4o``86b+aY8>9KuCQ z+u^0O9o}kbS2QqbyO#wni_&&rl(r)}4{0~@!Ykw4AIFl$V{Axzi%lFhcEDj1F{f*) z6%9~?jXaeDV~-tPsnvcE8y%Vy3Ue?#s!%#_bm-aSIx5`w;Hbzl;i6&*hxhXq={mep zdQC^V6%D?mk*<4L;1Vx=F5*DAJ;MKv{Uu55x4Sj z?6DdDch!h3jEqiYwK2Jv`_`;Bjnm>gQ31y0j@tOGne6B|PZ8oa<+1u?hW)Z*V<-XN zJn{Xyw(c9o-SI;^m#@fhJbGeM8|o&JK2Im#3bK!y!?b8WH3zXaqUGwBrQ)zwO+J1x zuAU6HfvZ~RtB-`6w*N}EZ!B+gtKO7qb3Y-sELP!B^;{MX=D)h{kg#Cukf0bP8G?IT zAR(oyZtRxUMIA1xqN5}WFuk+;1)CiX30A{Gb_*o%wqD&CyiL_+Bz?M{5@wo?N0qQH z0Qwy+u3uD|04Pzp=xC5jB6}d#M?5NhUyl6ul5B;6Wkmy+zSP!-l191atV}w3;+ott zz5`)zLy&Tvrnla<;@;vh?rkYQtY`p#CB03TMO+)Yd`Bc)op&JYVhFO>Eu|B_j<{bk{b!yy3t1HnmIdnIKqxDRQ$V_vaeHI_Axe&x2#+c` zF?Q+}4;GoPXdtoO{LPI+!dkYY%38L2Ti_|LW%p_TN<;QAdrbp`NA0!W`;_;Z0bxZ0 zY*$SgfRe#+&Dmc^PkQ7GfCDM8BqCwyvRkiv8~8_K5#TWvK}l;X8i)~7O(~g?iUx2@ z^OBiszRX;bV^B(-PG$~-G7CV&YdJOI917lclVq_DUece(Vta$f*xuyAqyAJhn6Li0 z=F}fYFVr6g!rq1;#r25Z6y@=_uXv36T1uWO8px8vJXSMYYx+t@P8M1Fx4M_?WbiVo zua~xjyI7o=QqV5Wl>V2c*%JOFMaF~=k18_RRZ!e|qNZYDwGv0=vo=8-6;X;sWl9cj z7UPvohv`hIq5)}?3L*y#PIac}V$_qG(hS2XCDptv@S(jAd7 zL2)4LVhFO>Eaq{9(C0CuGR5S<@lb3 z&8H~)lEZS%S?qT7WPg^k7!HKJ4M7%{p!`|fS3JgjEhQ)w4d$7kxYqQQj+`YZ?j<`J zyzHEyxDc2LO3*G&Q2wrKf>O#bR5#)S7{8#zxRQfMm6${ey__7a-edm!rMfy`3lQ=( zn+#vq&89{N$419*!s^2K_p#Ox9vjV9C$@~>vTj{z7^=zH`|}h@pIjlcQr0v2WRC^^ z(lycy|IPH~p89ZKwgX2~ZT(|tXKi#mo2>7`KT{d5D43X$C63hk#4lqFdX@69^@-}2 zT|HfK+LWg0Ya~oZf=3;Q-XeL2gps^M!bsk|Es&5%KCyFBs`IatDH<(2DpPUr>(Els z1E8)_>CO55Di#qQy@(3FjLxs3L9nHN9{%4UVb6NIvx-_ zstCOQ&)qpiP|?7zzn7xTiU#zAy$zVdMYrg<_2q+{c!AqOgRny2a8e~5PJsC6VQHhz z-%#Y-;D<*QIl^y?pz;+WcA}zz#Mms0&qM1R5>{Ru)i0XXxwi$L@b&}Iy5GiHhsRj! zN+PIeAeKgFYANQZXdor;Zo7#~mek>*=p45q93@`Tx{3xX(7;734uo3ga00|>9c+Oc z6&k`2D6kaew@Yj$--yj59%D0E>VHLp-pr&!LNn>8(oDLyG?T&G4@6<#j1?A-vBH)_ zP|?7f$=t3oNUmtGAT#N3(ds#Fy_w93)526V2+gDep~5jpO>|!P>8uVr+ z9TLuUN0nyMy``B9-hLoj_jasxc#O5KWF{*bcr#f_Q!5%kQ+hX(4%ZhgQ+M1hcV@Dr zbrlWH56q+kq1HK^013>b8xVl#=y*i4p2tD=FFQs(d19TL_@ z991cPp!4o6&1CS_DQr)%O>fcKK?;PaARbj9vZ+t~W=S9w4Wv}84f1T8cB`U+Y`mic zZSU3$i`94;QvaooZ|Ko8x^LRSLs0U#$_PWAvpFxj0(b2aNSEBNYf<36xQlpbiy_EjyZCUmUB%d& zJNw76O!4Sts_rb$;pyEg8uYf>=8!NKa#S_K?ceI&au9;IE+2jfm> zIArIAj^;;>au<7WG%FfN=%gkyzs$!$(gFqy#}@GDt`=}!m-+k;6dupG<57htYF6A) zwb09a90>}`k?_JQ-BD4|AWX;|2(KA%I03RmJDUb*x#dRA+;HPOM>e&)J~WDN_zf@7 z1wa3sBR~zsqmIBXRp08DUF}m>Gyj()%;}FuCES~tcSvZ09TJ*(_qIS{K4w0@qUT?b zPm;i+@(CoE-|i(1Oz<)=Fpdq1H~{K)^0<6O&%ca^3y;dp!msFY2w7Hf2p4@tkHgEE z?eNNCtlFs38Sjb)CTI7uz@@zGaz90>qU=!diXO+9zoMt)3M(3j@$^^pI2aDGLn<&` z4wsj24f$8`5aUsY*q?Up==n>&!eQeaaM*leRWg4S4G@wS^UwU&XV-=yxg#PI&5Ovv zP(&fj)!4Yh+q;*`oxt7BN|o*$`5!4V-jahy6`3sS%)grBkZ?1$L!!$T{afAJ0twlb zYwNAcdp3!si+KJuyTMQbkJ=4c5M(#%;TET&i7nl|F|wKJqF`=LTUe?QpWU4kti@ zyLa5|;N%W~s$=Nf#s0fk@A0T25R=ot)x9L@;AI>__k1GR1#w@snz;+&&T|^F(7SgW z-jy-lRlu9}d=(AWYxmvD0+)DM4BZ_hL-#;Xap-#zu$nWvt8^={K%}TE<_I zS?UlTmDy`l!qqQ(w&e~QNokIKygLm-EZ5^~t8 zL!gQV9YY}3h9Qt65`{nxh9U}KxQAM=yM8F|ri0u$AIuUSq=}H~m z>O`QT0VD}+cP|TE%FA980f&l-fMcvW5vXVoB?1nHL+p?W%%Y>*zu}NG1jVBcd2dm! zL&7N6Az_s3-WEuNQEqXOtr*~xCi8zL+q52dRJP|CiMiHPAJ^IOyuQUL>?I1;NKHim}(h0v)ivEq zQVCwhL0NCPs*5SO0mQ`=e(y{vSFLCu+a3yaO$W)~D8+DZy#9#d;l+e_RPlTSq&3Pb zT})Wf00!HCE%9W;0{(NI(Zz&!kQ&n`JSsI^3hdwN-hRj;&Y*LZ7ZZN``uY$))>-j6 z#Q)>|1>Z{e^UbdIY>uk`6X6#?@uZAb-bvWgAUNFi5j=-mT%ZiW&i@cz44H-%+qsxS zwGOLg*p34~%Zo*>G&m;k&VKhQ?u)z%E-`dKrp1n&*obcN!#l-cIXW7aqitCHm1DgP z196#M>L)I-?>ZBTvlamQP1qP*BF(U;N&aN}MYo>*t71=&iF$gB^;CjCJ)YfLPl?Oi zV?S|8$vWNBBslgMMLkXOCmWHv_4JGKy~5x+oBm^?o*rvGm2p@=Pl?N{KQKGvU(wSf zxJG69hilXPNrc?3r~jaEQ+@w&QBRLE?iOTJnjha)-?bCFY$9Vp{G5!$FLgK_=YL%I zFr{NB2A8cri?S_b!WOPTLx;exTa|1}5*&diY)i5`@+zEh1fp#rISE{&OXu>BWM1yQ zRio#x>-C>t187klp0sabH;c=DI`qkl6gtk_b02VX!@?Oy(3YYdLAgRdJ)-0<2Jc(! zh!X2+_0x`tHI9kWh$g`|>WC)!!z;H1#`V{Vv5u4g6a}pIasdW{99$Ch&o9N`myBEw(#F@{zdF2=ALGO0m~2Yp9`^IK)2TZ;faE#sDpz8zJwSS0E{(dL51 z(s3i5k{d}_j_5d&FheFw^Vorb zsnI{FPmBx<#8xxeOzuvUuW{n*oA%Xt*rOz%+}pqnTn-=>i2y8C)+a@>KB*wsu1104%m|r$l`_rO>xhq>u#Hys12bd1HZ5HR|Q5 zgM4Nu6Ko4 zRMEr|&qLPaMuXn`_Gu;rTUO{l&4l2S!F-NVYm(rS(Wch+ z!`+U4p%gSUbEZcjMf)C^dlz#f*DEJhfp8q$!85xcE`l!ftp~X&ui#UrxTM`hS0Nty4wZw{YruB?9i8HNd zh*Qi=mlP!lE>SEe+&_Y2T%c+YH75@_k$Z8}VU$!O3I0`6jU<{F`dylKe%lVtL|~-~8wlD4rw&(XI0N*L$3~=5orXqv`f(n{LMelTNpuMy#af z#LcLVxMeEKh!vJolCToZEUM&5tgKp*1D|b_3S>!eELOuMCHa$As~U^51w?FXlpv#_ zuUn!_3n_-p4Z-qK4I#I#40cG3lb_TiGwC=Nt44N}%|)VF&5>PpVS8E>wh|YGI(oX4GvqLx3I#HQ682=c-qwov|GiqZBNDHj?0HO@hAm zm>X$YpCq_MVBT|}(_!w?@4s;0&$jG8Nm=}uM2lCQGhU{I%y@HzamK3wZ^w+cn6x%j zN@7p_x9$7SHaT(O?`)G3_L=mw*>P#p&(9l6O!z);Ecx`aRLDt!_m+MV1=CMbWcryz z-y!`ZJR@l0iqlVm(17G1-JE9g`0@G=28L?8YeS>cw{rGVfwM^8GZUIfVFA%9aj^zU zTvFoH0H?G9k_1N(i5b(A+b+#vB0k5AJNb~ZyYf*=Mv~y-QgjaIfmSq)KhhXN?L_JZ zY|b?-QbX{Vzls@=xYGLsHs+A#jk_j_1=HI2UdzQrG|J~hv*8>YSQ(6N)s>*AO&oUH zbU$%Wzmxa_{Vtcat68Ql5+$bq$>9^NvbYcl|0pkfHevF|CNg%eOqRq6fS{^F5RO5B zqgyQ6^2J_uU|BSomYK|@(y)NZL|k;L#N~7Q(qu}4r&GV`aiHoD7sGdw#%*B53DKKp zCD!w7RubzfVAWY!$~=y-MTwgOP26sv3-NOjRt_jFD#;*LyWFgw9LN?|9hp)voCHU$2L><6pSdkXh!j(VwDLFzHMWc|fi zn;V~)?~5Zs--yELWY=U%f%iv*;KU)f0?{p0E3$Wg(I0&=@<(5^DI{v%%^&5}exhK& zOcZj!2AY>dFY6^0)qcX$#t|2`zXX1PAe2Q8vgj4tFGbemOC}1RW8^A9uaX2uf|goy zFNvLvxwuAJ;-;O0Okx*+vIFl;@xL7P^2>!@=1~}XnFO!cSx^dg*qDJhX~|YC*UKb! z0CY~MnB*{_3eZM7!2V&^yQ=4N^+W%1lNXEB%X1%7SVC+p@ZtwYfSXuI03m|e!BRv) zeqwN`>o}PbfR2m!0Pz3g3gn8&$gD6K`V=sqSu~kR@ZM5DqM+uHB17aP`XEG(u5&3C z;fe;ev?qz!=>cJJ;L!P!3OGhJS^biie*(3A;LHkv1*hYJX&iHl1k#3fZO4FXCl7D;f-l|*h@9Jr2FvK0N1 z5d9GOs$NM+g69R)&Q;J-qD*YdO&3VKdL<m+g~X3qEh%PXLY$NeVzm>)o+i=M`h)^K7uVj(=Y6`o%akKc;2- zxM-hj5o}T@4(VqfER=_cfUz`5Vyk5^myD)cgRxX`7zr@2B7y2SEC~)- z`#6jMjKhde016Dlcd6s-IxIxU-G4;*)iOo9mbO0!SklO^$Y#kUth9k*y?bKr zLew;PMD3Sd^Hm^Pw&RVc@=-XanG>dPB#aq_!<>G68ej(k2t|slAPFxhT_7jHN-|9L@F3#)Dt}$p@K^ zG6@cyDD8^KYrJg2Y6~gI-Vay0PvQhXq#dObRTLfvDnJ`e#IMSN>Y^v&*Gx!s;a@W$ z!NT=05xZYN+S|DOp0UJy^Y@IU>U<~(9^^xMEazj}CZ;d@Jj7i6Lk|TQzw1;F!_Xk{`5A6uo;Jl;5{OA>!Y+LGkCk@{ZEJCc(MzoYq9P z;4~xwnQG3wCQ)jXbOo++{%#8z%jru09N<{2ce%)VPsA5l@2kB_61=l_VH0{6QV6|E z5~lzxwr^XazHKS=t+b^e37#0)V8UjoQ~f^r1g(EpO<@&i{6wI~)%VPL zJ}%vuz_+b&A?@(3qHW|Y$zk~K@Q!J|H zsis(;&>W)bRo7zAxaf^~GTPWrMnpcDPuwLa_7FE~^~5ciY@&{lgq2-liz@aID@)Df zpn6p@369D%W^$50c@^GEMIeqC$pNVAu-sN0miWL3Z!K8h{b5KpG zeX5o23?pv#oVZa`u=urf3tSRhmd+P7+lY0!c{?&8aia#&r4nEg9EC^Bwj_V@Dx7Tu zisdPV%WgXOMsZ|#DF89?9s()a>Bw}9aZ9Bb;^IgUSG5i%!HYVWT;&d_&X4 zC77io$V8b0{ap;DS(*etAN(z9mJ%x~?+ZR)i&>iFPxj-xkemR_M@UKliUQVEvIR^w z65yG661Wru)Z&y}TM}H>$O;T^G7Cn00O-DbB0dI{7yL+aTZHi%WCx(?Zd55JUxghO z&5z=%m+>yL*p)xI9qm=}g`VmVZVFrSwe|I*I z&A8QuROG}!er`L7S!{tDEdns1&W|a_b^d}Z8^1w8D?07`S&KkeFyrA|bQl`WSEP`? z^4X#6rYcoqIp#F7d8^onEz$L)XB+pto|MOZ#R?ba*isoW668`e3HoYP$%rMv#Y->T zh&}jae1${)hY=!rp7A6%Yk)o-b0onx>R2Zk#VfCF1mFrANeMtv(hId_Byg$O3KF=? z^`&IZlHgaD8QvV>1Hi(q8A)CfVZ64RHS1`9O4ZQMn?iHW@hr73la-?CBslaxbq1$o z>)4q2A!&(2b|xl?T>#29ySH9uQ7?JC*!QxO4<^B}z}I1^iA~ryQjpx&^(~2002bS~ zbE3YTlh+hG ziJ99e$%qezzgxT&I|(kqFyjorZ#)UO5`a$clU)LUTLD?L{`24-Ma+|Z)gn%UQ^dvK zrKFB*OevBUPUidGCb8?$eXnaYwL#;>Dp~SSpSNzMB4iSrHhgixEHTqi@SLDmvQjXc z1jo{vQ?i~mzm+^2v9B=iNoGWa3wDtkfs){h-mXZj+^$F_{C35B{>Mzj;K*MPdL{Xj z)Fuz%2@;DR@q*V*0#F0VjQ}iG1J8|o(76R4RH}<4!Sw)h;ew0Yh_ea%Mhc-1O5y}S z=j4GQ7L$hnZBzkyZAtdr@IW97AUqHVU)IA`jyTuqEe7J@Dkfe$T;+EvDqP8f zLL%W}%JSDjPYWd1eX|W@#j~Fn%OfsaeI3kd2CFbPl6+Rmc`{Hmy%gK8Fs6KKO}=5E(UTx zCj%Fr9ujp~KxvM+Soo`@MBkq=qwNITsmxYQH0T+#K) zDK_U315!i96T_9nEX7d2g`W_y_ywZdK<0N#a8;M*kcf%rkR(Z2z(5ig2a>q_K$cc@ zlHgkA?_8JcZB$7mK8xi?H7^oy8YRJHs;Cl_!oVc>I)F3RD29PWo0(6nm_F5lGWE1f`ev*ktcS@OC-mXJ3LPu9AKmJ5m$T=kSHmO93mc) zUo_Pv8cDR2?>s?_`HsO?1H3pB7sSQdhzqIcDi@`&fK12Wk~%GF78C2G5ffKBCQ7q7 z34XoK;v|1~6&wK}NUSg44qKOAEjktBDIFr_DIH%9$;X<$D+#W}vGQkdO6r+BGbDQD zia$y00d94f=kANfTw5=OYVe?dFYF@qSaC8Yann&wKxYD&2>!O5vUEY5UIg0bN*u_$oL3BI?MRXF1E_~StmY!G{%MfdI zERzJ6SjJHil@w# z?&=|PG5D&Sx!$Zbv2m%7#Me9GxgDX;NP>SoifNMk{XQ_NlC`l^(9nzgi`u&&zIpv0 z`M%uoUGg$yDh8L5*rL1)v2HgnLndJOZRAQ`CJ9~-H9zJrdKHg1UIk$!5y$F10zP~g zNeCJyaw-sI3#|urj@dplI5jjmy4!zPYk9(k9(ma1x>S$#k-f^#6E>d2N#v^C9BjnJ zb~ci5E6k#km|?n7rd{hU;mHyrlcDpaqy_0uh{2GO81on zKOJ27nS(KiR=@Jw)!CLIBuSyx3agq#i&vdXrYtzIq?RL$_ggH{Wq_L^KhJZD;^&Jc zwS`^=NCK=ol0bFcF$wPLj*uw<=&6Vg06mrCx&#G{e0otqlIIvjObZJKh>o4$0mns$ z1C^&S)4nzdZs91-XV=y$<~cj<(nODCrS5mr_jr$6EkIF)mt+`!O(Uto5aHK7YE-;hwglmBKT zZoFV4segnnIEfhs7`BwJ*b%nJtH?i<^0!iQLz7IQ(j?2gQ750T6%me(EhiT{wr7@R zt%&Cyxt*Iwm}Mj9QaLsfVA+fW{91fzMIZ?-rwLpnL;%JS#0P*6*0J$$ELDJqofq!d zh>ngeIIX>?JeOD*MG|Xuo|^<0@8!>L$Nb5w9=92nQc2RJ)yNNxSLC@#@DI$fks2o` znX7heN$>?bHe#b=Bk^j-mIRL-Tav$}aBM_O$3|8c?bwKwj*VEW9a|FIyjPOH=v6$# zcojG{wvJUaa%_Z%jlm)v+t(w<_VxKWHa4PTW22&DOJX+1##ihJ+xPC+Xp;LZB%w*h z*1Do&BOD!DPA+zAOLT4MMN!7aQ}JT4m&&n`05dicfbh(el^k0VJj~b#K$}Z^0#INW zHdwQ%V*FW(H;9neh7#dd-LSyQ6M)x-<^Uh8E8SuPL#5;C_=UStqNCV|ZqYd+vC@?i zYqcv)f{VZG?@#h4uNLb{iI{eZELP`;N$?NMm696mESalzrAhDwyHaAKD<$!2SDFNm zU1^fPrEsN0Ojk-)7wt-km9CUnt6gal-27#dzvxvw#CR3BQnrp&G;*bch>d|jl*_)o zC5jhER_5Y-VX9N2$VM#mvQe?no5Y+h^kR;ODJEOes1QBsoIbZnqV8GSd9_UzRKU!b-11N4H9Ji*~ET${9ec)owKjF21wBKgplGTC7_oV%jXSSnXDm z;2)StHegPO5)XSH3=TO)g*sQ;Z}*5Zk4Pq+N}~R-72wGyVWGP z`OYMN(W`if@hWhuY#pm;nmw@OZz!mVB&S((doE7QrXvJu@X8x`GZ67#&=DqGU1 z5Pj%Ylc>A8Rhn_S)c|eeR*%B{T)OL`ae02m@GAU?+rzjSqu^*#*Pvc$V&yiXE4^5I zIFf<;!g2;K`UY0Bds|nyDjM0VjD_l@;3T+T3V!(~AN~+5am7+F+tMYI6vhK)J&9Jv zvgf79Z$$n1h8O7qmm-Od{*dSv?GK5Ss!OcZ{xAtHPOrZ|$)CJhtUn}T8XK}$?GKaS zADBNRH5yAYSM3jz;0yML#72Ke;?@2z2_E~yB!BbphrP{oQlWDs-_<*llHk{3N-k<= z60ve;5}Eimu%?$Wli>AG^W*MBuVVGUtH75Majf3a&Ll$6my%O~Si~}BzZoYkWA>YI zl6l|Bjj|D|y=+vh_9ih~wU@8h5w`EW+Dl)>gI@GiV)+Zpn1rMM%*n;o-le%le5=Wm zx7Tbnc_PB-!G9(y4!upQZIQ#-*3E$?!6C-d{RjEkQ#N76nG~er?AAt;H~|nHh%8-P zL*a3t0<=+}^G4VDK{2CF1v=N7kQfSHYeG7$r-53&=#lznG*aIzj8y5Aa1tCbNr#bQ z6P^+#h0g~gmBc9kkx?m@_)BNYud|-ej$CIwK~#c(fUh{)^H=evh2kF9jzu=Tel{#< zaWomoaWv0HFVu_`xi2kHusLlnn@ecXm4+;fENZEoq`zo28j_YUCA|kM36AR&Am^kE z{8bG3t`5R+mgVCSo5OdOWR~rSX4#H~&9eP@I2FPARreB>6-ZyPtn^ljq?SI{lwkSTHT5^dr-(G5ju2{j20=YbrjH)SLuMpC4U zWXWcKNg0#ivXJVxx)CB4ia?Z?F?!?lhDh2sn6!OXo^#5m@<;~AYRAl*VP7}-KFtO0aBxbR`E|5v~LjZa%1AHeE;CD=bCj-;M%Hl-Fxkz-2 zE&~uN%K*e$T?R;kTNxn9-%^wTh?u^bELN8RlHf9cAIJeEQe&P+=Bmp8NpLaSWUjX< zN^C3xka%?&APF9q0h0X9qYTh>MiVhpWwLr1I=-k>o>;Fmhf1th18X{!PlEq}+Jz*4 z(W`if@hV8=**aFy8^MP+(}bXzCZ_@sMco}^;L?udKQIHs5d06!z;sLH*@zB^jf$y! z5;L+n7*M`qN7x>(;^4lh52XN{aU$b)#))tj#Z;bfj9nAtx_&O>6DB2wf1mJvOrj{h zA>j^_+_^89^$gKloqf^tZ=681soPGF>_MYe4uRJ#U>V1da`uW_Ce|Y$ZZy$c_4lvN(^NaS|Z_Ms}puO+4 z|9aaG?ZXy_-g|QHw-04IuDw3Qg$CKp)3w2|de(k-c#Bd#-<(Qi8+djQ(dWC-1uo&AszZXFy?jECrs{Jc5$ z>g`_K00-8??>sd3>Q82$c>2hbkIvq9J32J`@^goueWl$zfZ@+XDA}R6?#*0RWB`PN z)=cx{Rjbyot*x%FTfKJeI{Z~vy*qKLK0R>L*u-FMY~ZH)c&oW#_SY}9?|h+s=S%I^ zZ_Dsg*53Evq4(|q{flQt$A+&R-CZBUM_E?x!lzlXxz~OK{ZOqsVPJG>Kt4h;AYU$N zHE)1|%s%w;>?5zX_y6qBTL-f1y{~J#cevveg`zyZ6oZeGkpGq5FIC^_VH+>~VwL}0wHhU-~w4?lF z;#^-Fo2f%?HUzT|y?x|~+p@vY=^@Mx=)i&Yoo^m`_W_f)k#6t5H#s7@DjG>jObGq5P5gJ3;I8$4-D6b z#=zBx=PJ8G{pHGS-q1hy+Uz6udbY%a-qrLY12sGRVtJONsHj9v%7s5TS+9M+)x4If zrjLQ1z4`08cYg^t*?#ZmhwptAPHi}AKlyM6(JKNa5~#F%W^HtQ22=76Nyq(CO$rdh zD@VtNCc6-Hn2e@aPO&fp-yaAC0K=W&6r){K7Ayf0R+*DA)Hm)8VSvOo8UbAs% z)9_Gz!%{~zry`J;nt_U9P=@LQqvNBnk6RFN9eV#sdfsRDwBP(yd(V?_@$IIBb%pSy zgg}LHGQzECVjY=OQCw!CIQ+|BW~1=nKhJgu&CBIwHv8hchu$rlt0EFbeeCX;shx(p z)%?Boz4suVJM`9Vz-Z%p=&c_gdh4Fqhwg5_^t zo+Hn`k!*rp1 z@9?{?FfMh!m#~D542_C8K%;?TH#A`*MRSHA9-5iN2LY!Cc4^!`fb4E{tNBeb_U;3) zNQlPUPrPJNI&9YLOV46LX4|jaf(W;u7ZnJV+GzvBgEtKf?W_-de*od!zzCwMY1p7` z(6qxZ9z62s^N{1*s}IiJcmM3Oen(Zeslr!%N|i zy<~E4zw@AYi|1dT`^^hV=&Z^5O~^OvlLJG;^$~>i1DLUr=|RiCZFVfX{avVRvSq_+|Tv*WeFIovTD^!YsWWo|r)vh{(fe&i?ilWrLW^<+1rbcN{V zrdD%%`?b5WOB_B}NTlmFF)N#}eO1|N~749djP2$kBI+YzF> zmX{(TmZBmmRv4>4wpd+1QY(SM>pyfAvnH+i-rHuM*qd$Jvh}hHe&u1Cv$GHW23e1v0Od|65GjdI zip@a%sXjS6B!s5xx4x&b$IXFi1>UsRl=RXpr}tXeJ>%u6j~48K0oA1 z9Eu)JeQILt=DO#88e(R+J<g^qPeM(ieV~OXCaff- zV)IIJ%FWppqdFD_MkXhA4TS1?J!VR%tEN4Y;obL8bwbb?t5QC7K#H2OJ)9YiBf)h z4^4?WKNvfZlh134DOdXhX3$vVTX+T{1^K>dv}YOx#gX?89tAO=Ob zF^M_Ar07pp^tx)|@LyelUzblK`+h15 z2dF>80#rtdC4@?6nb#;;$W#%RP5pNYrd|mn8Oe=(q9ofLu`=*EsBrA|rrbrG(70Cf zYBLAk;e{@zJXW1>DY-KoL?{l-2;{IvD8z4iC~8tUaVpR$txxT&O-UJYLKkwqCe}<- zLP8=-)pi)#_WobU^1~~S$>e?R&Lc0ph6Upa-AoZs(#J#ncguhdP7Fhc7aB=h&A{@K z5tEJyP)UqoV?}qWc%-qhn|GO0#tIJt$Sb&1BeKaXUb8-daa1+hue@7ATt=hlPZ}K` zK`lco%wkL>-MaTBtU~(u4=8mE{6b{G#}^PN)>G_9Sjd^laaynMTF~nS!5X!}__}G6 z)OF>=`c&#l3AxfdZBQ0l#i`XyR#P^0zcKsN9a!JAP>oW0=b^*T++ICjlbDpqv4XR< zdp8Qlt>y({kEbSwu)_bYq((5k!&ph2ec~7G*WN2}owpQBQirXtUOTeBR$IGnj<=dyS*JhH^lV}R&fWd<_K#npwMTZe?`||NO-xK^uI1{45ek@{Yc_1Gt=U`~ z+PHqxNNodGkdL_>$;xHpkXWmEChgfCS);Zz0BgU8AAhCQJXSLC>*`Z8V~7w>H8>s1 zCv3Y8ejGwvF003~j0Z=ikeh6EE`-nbEd3Or-CalS+?Q?La>KyoS6zMCc3JSSMGkCG zstpehNXCQ37v=7|vu_@RO$zyvvYD(?v|GMbkDAfUI>f>!i1)caR&FuMz4 zmt1%C<=EYG_2n6AI|c@(WHZjSlM{{lkPb}W?pwjlZF6`3M(LiZ5(A5PJpskVzcZ6l zqc_8G?XXe?`$$%sv#mEE^sMh@>^uT0W3HE;o}d(+7+TGnj6g0JCzU<3tygE8w`0i$ znUW0FV_FJ${xJst)pJ_{tiBU7C2ACmPpkPUEH4b(fDR1a$~BZ$^X%E?URx%Ck+v#k zILxZNgM%ZhYO9AfjSR0{w|VWLx|XA_uT4^SPqGDe_;{zXAKNY~x2@($ei7CpuvYW9 z?YHh4oEY07IS;hH{o7{yg@-*9JV^V#H-QK`sKuM5*cf$;EE>wL8iYDuGqsluawzpY z{zlHZuFRKavu~>EaC-|BMS(+y}|nD)eJkHY{aXH7YT8a zA?6g?8mSNH=0{e;c604cx3WNEZKn}UtR=q4cO@rr0$6pSSr??Nt1om5X@wY4G$%z* zxzVzsyp^0%K3xJ6hs^~Rms^iDoX+3+P<0_Z1XPs#C&aXZe5<+EY^srjHTBw5(j7Lj zvE()lQbY!TX-Wis#|h(-2d>)rr2`Hfkgnxr%5(j5|l)eIHAfndA&( zqto?1i)IazXCf08Jn@5jW?%j(f{a54pFi~WJ+dl$-~D)-v!fe5Yz-fNL2A>Evj7do z+!jz_2;r$_Z+meLOa3q3k?)c@MY50yES;M7Q>kvD33D3}O{$)BK~qWyRK_PbjJp2> z)kO28FdBZBfuA*1rAqISVFwi{k{DQ_DYbqBy63jl{9YNcw}9wAb4Xpo#?*w%^khpq zQo^o8kArd}A7ekRnS1|nS#f#jwE&OvA=p-?J2x>4gSQ2F1?Uw2vGrS|Q)cY@t=LvD zE9l3pZg7H%hx?^UJ;+fRYOXfwsBRPe(xR*94SDsUxA)rc2Ie6TKH^GTj?G4c&)i9% zM7{+g<_Q-`Bu8pJ$*p3mSzCzVfy)siDy~cGBinU*&6lk|;*+st>zAZ-_F15)!8ii8fgKaOC$>*a zPD@&YSZfsw*6hAl3RHl?n!y;!L56!CnBDu6*?aGAAGoj8Jm$KY@oP~Ft7Bi!*X)lA zvZ@HViI@v}t}R!Cai-Ionw}XHX{}wiX-y5u*2cj#Bf}%>ENWf4sPfnyO!Q<0;$ku( z2SOe@jMdNmcX8F}$8YE{0jgqlWo>*I!pTh0X7|1b5m?(+^Yk1e_S~ztz=|@W+R~~vO z@D_Wf5+*Ma@0+mOTvXEU8RyxVCVoHk7B*tP7L@DApllKI{MlyT8|S4Ou2I%eIUJN5 zLzJPSe!!E|Z)r6r(;|UJ>LDPj+aLZ7)&fxq+Oz8XL0JD`^k3q}Lf_6WZ{jRdL{p57 zZO+hOLivL`nz1cS7E%=F!AjQ~6pti}x1NI`A2M4DUo=$?3$wFCRCp0jw0^_T=5=d_ z)~{W=cJ*L=73wF=lh@U1L&KXkZCt znZ5v5*KTlyb=mNY4xbh@?DItnRChYpJK!zChOTxX?O-u9D~E$Amp59?Pp8_sjC6D7 z)_J%NBw9oA6@^ywvmxR}TS)wzAoInLOjW_4)x2~m3KXs8=Tp>z(g5}_EV2O6 zYJM`L!IFX0m9=tfV+k|i2elySV*cN1{;dpRk7b42Qy%)D$_8S57h5_o1OB;CU}8uL zrG(FRisTVch0O~UgLBG>y`RLc5*m>&rSGlg<}!|X76)3*GeX{iq#Z%IH)x(AKON<0 zS*ZqqxHLi*B>d<1l<*f2@LZy>B%m=_QhRL22Qj?`P+VL4m#8@@V?pd$F{T zvllF8oL;w@=XA}`3tdj+;$pK4T{aE2Ip1o2CLG8@Hr#67vlJ;eBRQF1K6L3Zt?oKG zHO*evX>v*|Thb^x<8^~WBda&8uCEy!+E}ZpGhW_2{$fNOx#K;@Qb}yrIIQ`bTQ}R& ze)>TB0M6{dAMQ)8h?N-_xV}@5BNHA@R7M!p4W}{kK37htjQj^?U^vJkeFfp znoVo#L$!75RRSk*M-<JsGRv+)h;ItPAa#05M!wW19;xv8}b{|;M`bU_@hYlW`z2iR1%`BqzTL2Efa~nD% zN$~BDX|-u3wx6L2nb}-Q5)AMw#nVHI13ws@-pRv-yU-om#Ao!tO2`D(wiZb~C#H;? z;uul2X3{Q1EfB{Fy@vCJ&NHi*QX4zpsn;I0Qao#9V)6&INnDbnhf1&o0~3lTONM+6 z+02cdF3Bz@1Zu>XL=01L8hrmxDvpv=k}%=t6+K5A%;2cjgRH7r-?ifGC#}S)rE3sy zHXnyh#O&i1lO|=R?L<9(`jl*|D}o~lLy)u-D@x7aT>)wWt z3o**NaR@A$EbXoMT@AeLGLzEW>_|^pI*FB7#|Sc4!)V5hOkmdovq3v(QZNAp9D*2; z$cD`uYwJfwHjk`XJ2bLstwjJ!XUO&R#?^(%F0y$X{y6{&)tLG}_i?)bB(Vm9gRX{Aq%w*F(Y}(9_Y@z)_Y_^lr(Ry_V zoQuVc7)ZOH$yPk57JK(OM_E{)O5#?sr)oYQ5tTg)989^c#Bc6{c>-C9AZ&>S^~?L4 znH>5#e-s-i#V)#ye=)x8mlgp zImq_~#Vg?_Sz7}U5xW)h>wG-oJ8aPr0>pr9)haMoRdS3*Nc}E*h-_K*<6Tm?3m_+_ zyYfm?w1h%2+a&`dqjhX0CgOe~c7l@vsJn2$f-BoZm8KA&QUWLW6RyTS_N|#bJiiu8 z=CawYD$A-HtH_1nDBv_gHp^6Uwm)ykW~nD+JNzsGl?4Vnbno`eAPLl6fvO2UY>(Bi zK*H$SGz{o|w;;gIbS37#5F3xlPNAm-eEUDPiXf6u^!ukk9aXx0XuP*h6bIIZP6rT7-I z8&L$e!_TAi{m3G{=(xGekSdka0xIFA!kaujxHeIQ%+mEGpqrCX4nA4nU|LTd+(PyJs_Z|O-B#hF17 zF_y4PeJ(DuT*w+o^-t?ALlwhA?F9a*IB-ZK(AexXn|e3DQo`t zI~VIfl~{#V=G7;n+PRMb`ap+d21yXrY7SW+J?hzeaOcV1ydGpVrHJ7CG{}*#@pMml zSBH{a?MA!9TrHAN!pG}?%B%7E53p^os<(JMFu=vw1$GuFl;laImUp$*p{tdIyYy7r zaW*Q|)5Uh=d$Q%7&6|30-q@9Q@qTOzDqtJ2G=*DDDt9QRi6{fON`hyhX*A7H{IM8A zaVR@rCS4V8y9Tea<3q02gvZ&ISCw<=OU#$a6|e?gvK%RbHUfUo?N;1Y^Ty=3&prBB zoNvq{xGkVodZ)^W8!0y?Lej@-fu(|eC#ZHA>ln3?G*>V_;X3%8LInM?eYsY8vin05*1 zElbeI#JUO0NX7R(Xlp=t`nnvR;F3^@Y>|MH)mSZH1~qpinpE1NeC));E59 z_(7Kd%A_pK#DJ2_df-%AC&=%+CMR$Mn{GYawe`Advcm`7M_~o`y_n7MQiS;02YzZx6$ z?2=6<^h5|8U^TIdLUEqrit?Qk!_c1ZnfBO(_a|swkDWy4tFAG2rFw=4IQrd1--Fgs z5`E$&<00Oqgwa2m$_R38Ymj_xd;X3BXbrolTQwe>BH(SzgqGpa!^auOK zc}eD*+!Wv=HA!Z4|0*{`xRrA59e4{jxxb2Kk5ZRAP*Zk3hZ2`w)oFZ66d}Q)XJ{%q zQHeML5xL!PueW(37q^s0Ru-M4;PygZOFVTXsayp)rkWV+x}feW&;`kIjq(9aq&Aop+ZUSw;^8TT> zu-J|bA*Ce|-ZW@eoqFW{HvcWVck3PgIJV2xAG_@zhnMq9{ZEu3l62KT3y zk%~Rm+m8bi<^`~RBessLtF2vIuVc@t3g84i?2+$$xk5Bi7Y=Oeh~IH)3mOuW^9X}G zC4wCz@}&aqD}4WU957RHd^W>=ud!#@5F4@z(`h=KyzC(0f$015|$#8ccBO;D^q`$ci z*+Z#6MXiwJ%5Mf~HP=yy{wMv?i|ku5^?<9fmHr&@{(Y@xRv3AgtjbEOeN?6?m$&7O z^bSkz^tkg!aPl|{ip}CT~=V#l?YNP#%}dpM7B9{&HQS^KRY!3KjRlwr_O-zA}<$LO*x=i|P6h{Wykz}5M; zUWoG)dzr@I*1`9mw(;@DF0y4Nj%CKy>j%-XwgIY-3CLs$QrPDqE6o~Yo{ldTL8QQy@3eqdJjc4Ha3*u zD!^>nxnJ6SE;fc?t*Abn$@ZR10;dS|xe(;J*vd4WVfzrS0|DTdwtDbr1Vy7up;j|NP(7#U2SSKpTJt88~Sv-ztwn>a~1_p{rx-4hdI2uEbQh1|LF z@*}hNyfb_63wG10;(y#rLtrn|9%7)6Jh~6(ak++>bE6xx_W#1v05idk|9KQR8WEd2 zT}OA-4RhxgF=AA}OY0-LI1)^&a<4_$0RZ+@7KjW@jE!N8Sw=y~@O8V`h1;A^IyBpr zadzP3E3V@*wr~~OjO=@|u38dTb`wEXfP?K*vfe~5?z0RtfAZ}DoQ0ABR?Om%#E##& z$0`}dft5Ev6~zpEEMyK}o_JrbA8IwfQ0$rrO>c`E5C^DyU~$=|Hikj&f3m$AS|~Ym zKz8(DQ!Z$3$v^NRwsO^lhY!4J=6xk3YGA<7YJR0a6B{dUx`~#4U<$Kmv^F;SC%g^$ z(zzFLsmo7HZ_&9x`C!DtyLP49Kl@>J#rCTqF!>PJjrxtH?p6(+vbB%6i673}loq0{Q)jYS*(W#viGuX;OA39jaewfMWnHo;2ZsFIq z)RR)c2U>HlzF_Aq%)EQ8k&Q8WL7*)l-g`f89WD>$Fuv0RC1oK4Uj>++ff}77UDVs9 zLo%TkDf5k;MS3BzMt8gFy9O~>VgYf{H*aNp>ajy_y(e2Ve)0%L#ilD_47?TFtP8ud zdXuxgDupR>kEU>l8eVV{Hlut)WCvf2X+bJ37!5+9;H6vdD^DpGdC7ItTruqvgIKhM z#;0zvZ<_t1F^{>AoddhO}{U%+D=d3QhT%J49*NLMv4#?2lxX4Fl{|IW3(*eC!gVu-_c zykUrB{wNK_REQ&kbKRC(gnjjkuZg}cFNjPy%Ey@H59{}Z)^8hb&tlwf_lYkH;w^Bo zW@VkqN5^spW%(Q%p3D%W$LGrho_!E)cy6vuj^Yy=m`s~3j?R(EIO*yVyozj`o37m? z_vOgRIhW_cf@1ZjJY5-JMS-N;WE`L~2AXOMZ7MI3GYZ$}6Xbd@eu9PQV!&L8W!>0rH)dKRF-NRzI zOmLWI@GRN|tDapk`}lA4WSk&EdvrlY&meSsY%dY|BGza^ZVi>Ih_#j2IazVls$%(W`#_JT}y=wGrOhH3}zOAdBH z?HTAKj7&a%bMR?IuCB{@s*wjgMgcmDJ2W%9xX*2}+G9h7a51}id{-a7M~R4-2?a3J$893tfjw; z7zQ&}#frQWQ80o;O&si6*r{ypwx%pI58=Ez@2bMzeO8l|i(_%LN{^b%z4HE%hhOo1 zXg~hUoUh7T9b7NTjhvOl)p2rAG{k;RxbDkGne4KUD=26CO2X?0QQDt<@_qDJ%;o-l zSQpbNAhI#9j9+G-d_iuY55Jg%@bZfa=n8~=F!#7buuO0R2eC-dB_joL&XScUdJ;bm zV_cLZg1L}jz3Eq`==?>VI8tBe4iAF34h?yu+iKon)m6)UOl}wGhkzlg8xeziH#`69 z_F-Uo$fp|jsy~$9A7Uw#*Ac08Kk*vR!ys#X2e(oBb2+mIeu|vmt4cXP8X7}K0teh` zzGAD#=5I0Zh}mGK?Ay5@I{WzhxL4fXn&xLaFzur6lR_u*4ovS>zkv&p!bWOE9|q#= z#&dU^`(4kWYP)>u*n?}57lK1RL4!m#W?h=RX+|#NgGJwDJ<4z)i2anOsn(ke1hYH{ zk(^0P;*M6c==n`tIcVj zflRQeyu3sJqn{B8O@&N7{aA^9cSb5-q3sEq8cXhK8`m?Rnq?A{Tpk_3$vMJ;8bfvy zM~GJw6NDg#;g{}xfgd8%@8X&T0EhfQtd1xy_XlnFojN^6n(cs@^eD@ksZ)2ThOegK z;}#<0<{F!@;x%xW&dZuvPztgnpPr&;6{e_SB*Ke`N0DfqOg;}=+(%(w8U_Kevi8l7 zSN6jHYgqiH0{UI`$(!(XL7L71J0k%d?8jL*Gn-}-MZfqmlbZl>pP`1QSlQ5H73j3x zT_m@#hqtyW)uQY7Npk*?7}e3%4L3qBO;rL7alYO9tu{Q@$<=+_U2P4FX+KVD`rz>8 zHb|#``2{*_(NI@POsc-gI{coT8R%KHvW3dAzAv+-OPd3cGKqL>hB=jVvzK!#M6>~j z?2_s{7f?aTNh>C5-a`8hY(y)&^4)2he^p8W6L?{vm}4j@eCl1U8Wer9qFy2a^f|hm zaYTM77fMy#rVIt$k zT*wrkD?u#^xt4t8<@w*h!%Ct2+`e;F|B6*2*uh=6K~xtpEOC`(aZRV4agll^mO8n{ zsI?RN1Gn3+)htdXS65?){DziGt-OXRh}DzaR`({g1ZE!x$*mZ()po(G44*EsBND|j zp1N%b-HjgZSTJrgYa1<1mP46*A^;2y@W?SKuJvbEO<~9G$}4MA+v-1% zf8=I?{HuCW;#caFqwLY{WRvqgTK}+4W9?-b8W(=+6pS>xs3~5?K_3xErMsS4fj&ft zrT2}iHg8;CUsWH%ceFQ*4B97RkC!jpT;cCJy40pQf~VQvyjQ*Id>KA7CJm#Z#ZtUm zbv`r1st4KmgIx0FJ`qccqDS0$B>^T-;Wh>&E~tvQrT8W;p2cmnerqHaY2@NWyO0Hg zBHsbN?S-D161#rkHmC*bq2- z?_U2_7LAb4|Ay?qyIOO(NlF*zvP&>mf_*j6+OZR)>Sx-WN;?rgm>h=|sOw=VC0=DR`Xu zobPkH5OWoh>vw)273s-=5&SKm7rP)k^v*N*Ji+0g-7X~%dFNEi%?KBnJaR8)jm3SK zFDofRcU%iX^6DguA*rs3Z0v9kv{N1XWDVyC)}x=c*U4kIj=E_RO!$0rrPRVhA{uF{ z-1F^qH~fW6N_PVgqE%!1$OG@0Dq~kUy5cXWx3{^xDDIaZI{YB^@8s*$2rfe#B6AB9 zdl{-bxZ%N1=8NnZQwX~#P}q0F@7V}NhKMwrKn`VXdSWz3xNOtfHLF+EHm<2}!gn)P zZQ6h@hvB_Yz+uh`3Vu|Iw~vXe0?GHHe8UbJ>MBO-hVvvf*1LOi#b<#^K4qPMtHNG`KBH}|Wd%B= zU$8jz*51P}?(>*zM^%2!Cln0(0ic=}WXrI?I#pkGo>wm~eo+}Mf`UjEdNd z%)1EvIjc=&IZ&v1NO<5G>_Dnr-2r@S)~%{-uHl}gjhokRu5BLa^SFJHjsb%ei-t2% zpb%|IxUxhNixxQbJ5sIYf8z!|{VF&Gh+W7Az)kd4rh!~%pLlxqiN{T|piR2gj_Hi6 zkYK@}c1NE4seB3i-lq*D7d?Dr_U+N}wQI61*Iq>zAo%pQebg+iuxfN@az;0-0||O( zr#(o`{2+Ym>T9-Lv2y!We{k6VKGBJNHChR_a8fEEKp-A^_D6TN@A_>=jh3}Sv5yp} zegv^~!>MAx_B@ZTg=Is~RV}K}r2xGjjO_YReEY~pntPW0z117AV`*pomOt$iHHHo0 zmj#2%$b$KyQ(3H6hK*9DdKgS8t9XF{0m~j1;Ty`yoo%W-7zk zfMOgzYz%~RzkMx3f?%IVE6=*@@T2caXtqy2h!YF1Fmvm>aOJ*!!VL?#xL*fI<3kKN%#rESb$%4HBgdRO)o-HC65J~aElK3vr|`}(u9Ps_nm ztBV?T`GDMWa&2@hn6o33mZv)S=umx9R&rMj^<64|Eywc9icI!a>52(lVJ1s7P*&`B zf%ximTK%GWY_sNnG6UGN&6 zkmcjh7KcP|8U#VYP~Z0Y^zzzy*`Oh=Wfx|Hszdi+tp=A{TREbJ#1uZ@XS&o4v~iFX zqQwF;()+LB5-j|&9Lt}E*A&&Z?uszL)x=PZt3sd$y;g}S)79AR^JBn%HP)j7w!b2L ze?=I_#XI;ESqA5dxI{iWj~mM$Y5(vg*;P|ZV8>Zye4|)Dj5jcZ*a8+-G#j(n)gC%j zS3Vy}S5ejR)g?J>jq0!5_q`VB8bmnz`rX(YhzcP--O7|h3oW<=+|%(!R?61lsQC?G zE)18C3xUV!zAf9g4qSTK_DinoyWxf#w8y##gxT#UoXBnONI5l$UL=7J zW(^73{JOT96hi@L;0ygUJ2C2_R;W0{Kk-{@DAJlk;`GCIRs9l@)a3HRG58GH;om$X z#$6ZWaFt}ttS~8gf?4wB#clx(J&HDWOENX2V#yP0t*QCT%JP+=Sl>(|a5IPJ`!c(a z!}ASYGS;D8CJLIw@Kw}M$yxdDs_W$XDBw1M=`3P+ ziHoN2@f|JZ<34}+%mXw!H|ye_{y*m4EXdB|%JZA?c%pmMYEdLbwWO9bpCC~H2%-x6 zCV@>5-~u(bCLprf6uVfS(2_d91w?_oSVAPJJzcC2ip_={m;qFZ@IUMpjx(@A&PbH{k}YzCr_R{`+10RfNIDS z@1r{U2QEQ>lt}|}^YCaV|GAA2NVoFBw3xJXrC#^~1qA#+s=j^V=W5^uY^$n8055Q9 zKLnc&0|nmF_@LRqrMoNJvSkByMM7boL+Z}1^hMvA`IQq5`uW8gMkgi0dhdD3IcKEc z=6TdM2M{mZ zvk@QHh1aJeSTRuM*J1e8?UsI<$(4sDPaH;Z4(akt8()cyW(@_Xe^(nD!I%-TXm8Iw zoMP5yL1GAK85wqLHoC5qeqvQq%h3@>UOso`iF7KVcdGZqJ1z099Bb}JkTAb44^V+i zi(5#?)fwDMkQ_>9uJ4D?Arnrm^?*n9#CJ9iPm~@fti@y1;fvGT_xQM z5~DeCh<)x{by~1sx2B~Sq@AGsi$+&TH~xn{kbY@l{{15{Vll|vr$MDla~`31;aPbH zojE6KeL|^IQ#__qYIPk-AC!(=LGBKY0L3gbN6($YIT7nl`OkEC*@fi-A)XRy0Bi31 z5Z54+n11>r;cKM#=L(=<8;bH@o}x8z-ypFV_PEJewV?qE!Epgoir!nw2GFK5)S?v< za8%gIGr;ZG(dC2Tft_%Np(YLKGoyT57A7nuo?>#?)coyTr;Nm#FF(?J@r55aHlc}$kM$KPl^`8aVBva`He4-PPldlAY0<@9rB(3Gtf zq^`iJw{h#smv@>YE>db?+#!F}T_wrX()A4JD{7#QFJEF?YfH{!NEC5HAEz5@jqW|t zZ4Z)-zAss5WI-yN-kCFxG>_p*n1Y#!WYtZnBbC_&r3ocwk)m*Twj4#^9Unu~va3#@ z{e|au`wTI9azke;^o-MZbLx4K|Ndh#)PZ5YHXkD1r^-i+pd@HJ-a=CIP?jkpkra7~by!Tk1}J9}ihfyEv*lGdE! zXy*|fJRk9~5BZ~o`rBJy!w$MZ3zpZ@{lMs8qkgNb%>3nsKId5;G2tHYAPJjOEZnzd z(gLX*%I1@&*~J2sqbLv1J9wjkMto<_XInRScfqUp#<*3dXO$`V& zDZ-;~LP-We3ExUw$R??bH^q1czR0`<@64x1n`iKta8M5=>r@-mTfD1Vq(M}RqIbKD zo{}{veZF<)7Ad=+^GK}N8;R>mu5bG#y3vqG42@D9z1(3^ptbBNz$Ksu}E9{yx2-ujbuIB!WJ(= zIrt)?O*ZcrGW`9j;}_wCO8WZMyg(alQsO+}CQ$6`P;EzTtaD=I{@O4>t1`wFY3zSH zbto6)vgX;-=D;XP3N3eJe~m`=AOJHOc3RKQ*)+ZXHPR}wUnmqvU8{f9X>+}M$+~6t zguj2)5mDnI7|za_HV%B_?23pe;XYRdM#rSNPEf6n2grX8Zg?{dbV8L>ZV$8*vcF@r ziJr&ZjQa7StC)&pC;^Gt9g>rBT#(e{%ASi3$x^@$%UbMZVh_J>f9UQlYRGnxDo&*Y zhZv3Svz>75$z<2BrSMlkI4K9&ps*tLP;s>3r2@yx$t*hY3JZ(^ zWm=iWxD|qum?chcC&(@10TX*pq}4Zfzt}wSbouyyZ;th1nPWw&t9{WzD?HMObClRO1PCi^DZTe2Oyp~%*TJFqzGJz%dG#2|bE)r~u&nzExe3D}q z4&BZ6VZlPI;HtE8;m>Sj2) zdlJV0ESIPxdfxwFH;)JBio1OBAKew@POd3;QD#?W?k_XiZD9+sVPwJF(S1MO?j^a# zVd{D`cOc%CrgVNUO3!;XcE#C|@1w}Vi{;x=#~WSqrPUDVQ5h?GzS9OuMlo5^Z7Wy~ z=uYXsx_cq#G8MmZ?jZJ=&*mmZ_(>Pn0HJDL5Wa((og9EpyK_5@G0DqBS6w@^|IxQm#$vE8p0@IILpXW$OhF6u$K&E ze$@&7yP{Q+7GZ@Ma)3Ngi#G`R;F@vYq6_rd#-C!f>FT00>ifWHHyH5JB~u!#Bfh&} z2W?MJod65uFQ!Law{R0>`;pa~bLx3R&^QZVg6L#E*&@O`V;ocl=Lu@z;F@gl$|d&Z zk{vhLKO3(HNTQ#X$P~sO>rp9nu&m=xaxj8m_xR9YAMph5>BdaDd53))$}ajod-68i zBbc8OAhlUZ2@!YC!=E-UPY>uH?3=h7zHl{~qNhyUt>6(k`O6R5C^8oOQqdi^PmEc9 z#ohDx>X-gSVbm5G*Bz@VjRSjYT4tkbuk`nm`-92V(i6-q;k9*Bm^JmN(i*wPob85Z z$ZxmCO+IV3DO3VLY28KohVY*7;XdUwtb^s1>qd4gSh37KZ~Sd2<3*3-WquAk6#Vs* zW^*kbWX=rs=;E0ngi^Ur8+C;fGHOQ$A;*Wgu9e9^k0IYAcr_-Yv5I!aFGe33MkJfcfhU{C9>wPXh~OHw{PZB)+VojsaRn_~m$UfN z_PH2vM+J>OY0twES>3ZhMF_6W);LNKd^e-R?{;7De@`;p0 z5JyAA)*RwMi%1u*Mfx^iyY3m*F}orEumE}eYLZXJ7lQAZv#=PhdJ^L%dT1?y2l61h z<$XwF`dkD)NQUIq8%wfzJly&41xXoM;9ec?{KpLEo`U|2t$VQ=(FQI`^Zv1&y074? zn07j|4Y73+Ur6BRtF4oxL;5{B{?Tg}muD1X!N(_iUA_zkPx~P8q|aj=v+Hiyl6ic1 z&a@9aPQC`pzhglJTqxftlNXWE9^}2=s+i=WF!6mSf89KG#uw5eCvES!KZc9r!KGl{ znnu0Xk0=O8$ba!z^QB#$Bm;0Nut3FrDuV8bY;R_%;DI~!GzzOG5%c=IcmuUW5abE4 zYEcaHt?2F>**=PmuX|!}I|Q=TjYUv`A2*MP0XEbUPN1J+^|^P%N>nqCP2r==jJrR{ zR5%k6qAGP4NPTF;YW6wF|E2o^ybX<8iHjZqP%&*WT@t$vJe&>nZ13&IfByo8lm#H^ zYUO2(cXV_>(GWyMM8!dDVP=@5L$}dJoqiq`@B=Md+RkToU>?R7Z>6eoj|D zoHCs(=vMy9H=gy$gRC%k>@frs8`(QyRKq~zKQE2BK6uf6d%b2y%-P2BQykn!uArf! z&Bo%4gh*)z#s{~7g&Q0TMRa@RoiaK?idDyU+b0$=z2~VEPH%f%W_}4vX~O}hygtX0 zn}*B@6dc6m5JI0q30GxW3PJU0bS$k{cQIBK7t(fU29=Y*Vry+OY?JeLojAYap=Mjt zthSs4*H6vzR;cAu6Zm%7h*QQ`ej-N+=9(A?8tY2GNwGHQ%MjDWl-)M$=7s53P9b!o zB_KCagWINF-uuenVeIwAu?s_+j4=J^VM0s8(Di3z7&hc!b>yBh7!{S`fgTB!7GdkB z*?mtpaMy+cK0IM9`O?Nj=d7P|mW4ywo{>4aE6SWC1#RC0J)^*`P=bj#zMYESix%}PDb(Sei$pm>oOG86Kwk)obOX<17<}J zD?nUKgStr1b>R7dO2~E>a7b561UIv5_smC!XFmFkpF#K2_KM#+TtZ+KY2UJ8w^qCY1*UpH`PiI^R4zfe7G#EMK6MXK%(`S9p%R+dCl=4N0lEMo9J%2CIMB2o(&Uer5WRqvb_Z41Y4x*fmSS8L8E7lMLmwf8@N^H=j}6ff{s~SpD7= zlgw>!AxhbOl1Tv=;x9YA#KTE)~1xgCl&<^!#H5#&Vl>T{PVo1%s zN4>>4`Az0N&+e;H7A7VB%zUz&+?G}xfw&lY0d;9xd|DtWjol)nsw1Cmiz%tZ#D-FV zbe5#%!J$ta58ND4{VLnYONmQih`$gu8Txn)s+YO8kfp0j^7{F^jexQz4ehY@1XDiph7R6v4 ziZM3UA)Bw@R41r+0Dx$@IP@}AJ-LajPDP0NDo(rQ3N^z_sB>uDsi0D87|%nr4T+ zTx~;xRs!l(wUT)-WlX!xCkY)mydEV|A(UPBLcK?V$ceh&Le}So=-Vpa}j1p z)Ub?+!ay>~IeW-jP65Nk3oU5K!ZsY-|Bt&K zO0g4q%np+B$`y06_br8x9jO=56ix!VCX2}y*z-&I^Xg0%kB~u9C6hvPmy#Gm%t$mg z1zJM{5EUx3DqGr{Sum!ZsWz&dU5#sqC(m|A9%)_0EdBy72T*xn`hrWzxyqQ z4?GQ|*h7CwxvlX|`xB)r`~}mc$V`cxlHD=UzgLXqRQu4X8+-DEy8+BzAGm=l45GO} zaED&T7OSJ^m4F}HEz^IQ`ewV+6AtS)=@R#=HYQCM(U_P2$Zz&d;bt|OFl(k*PfJ+1 zv+F(~Fu1RVdqyeCiv4Gid?#y2ltE5d{br4UkO^j%6@uW)D z`4UtCW9gdO@};Z$`j+$!^!D{FwcZO~mOvB57CH_)!a6lFCkMs zm6GDgOwrl|B1;h6{=+C9i(no`nNb?`|0K9_BL(5ePDaZ6$vL=NA#$;6v6=oBXbJ1n z^cINaE?kEVLaXZN8G5j1r<%-wY$ZJ;-sjVd95;AY|n-qCz%}-VISy4-xj45R!7mTro`FQ+vuo zbzv5YT7B$y#IEPq3$pUk3~D9#8Og$*W+Rt`?+_9k$5bcwVH0v1^>4JDqzOfLXnJwq z(;O(7PJzW2-)$Z{1D(oy{WRvm`i19y2P+#RKQ;3XN~G(YfBP&>6I2?Xx6$i2%kV-y zKAF55^=pwVDcy`iGAIPr@4T444MfSf_$Rm1D6G@#V1%MpHvIQz9o}O}6phHygH0l= zGdUj|xJ8ID^yPD4RrWV5Wk9NkuVEN$G}9q1rz4(=paF3Ywc{IGU=Puup|%jAW+LC7`O=HbKswypZA zS>`lcL%Md6J)hcNgsBxAFz%p32z0%cSzIu5_%yI+J0jeVf~H#nXYwjd3$X`yZR4MK z09G-mu(|IQ2uDjUS9bO^P1XRiiC$KT2KT%BZHLG4du3R|L*3}?qfudSYT4*sNo*>^ z@{LjQ=#|IZs_ha^U=W6Fs5KiNvN2+Stp@oOKDap{S(fxI!IXV5fV9})>zulF9!z*1 zVK1scMrEOy-^esorKRr5;$pn*U&P=vbq^}8CEKQ{$JjJna?6qfDi)m8W4_nIscy6&tTX66ei=c&$tI^->>zm&9w9(LW*ej|Bsc)<%56D2k zH?$v8W=x<6ECKV8u|t>F)vjyxn!Z&_m-qE9Ti&;{wq%XB>$+sKm0BFng{B{PC8$cX zs@qqEv^1n8C&|i-W+d`TL#b{fslGEujx}lg4b547DTqCI`^|CdS1Wvu??d6B^fIRC zcr!ZAu?kdSV%_sfRjFd6e3n*#(ZR@YNIX~s57o^a-8XaQI5%p!22YUP368+ur&cpo zQp;BQZ>vyE16G`uFW18+9otrLX|aFLd3%LW9*D5COq1XIiNX?dal;*ixv(aC7Gh~C z)?%E?uD^9*?K<4KRAkT7<1ZF>Y5)AX5gJSks!mPo+hD2mtIScUjxj8Q&GKF#>E>mP zZtO@(Q@Hid9=Y%aw^nXnL#L>sGkTtLjCM!x3b?g&hZ0^x0rFVk&9k(Na|sfgv>mmQ z_vg`pxjDSGW*bs!okgSmf3yQ`hSYphW5KzoViz{j;yMu7aJcz?V+?%rVI>`uXh3EJ zvc~3J74~x;b)#P;ZU-1iiX@>eO+FB=%_EX2W~zocPAdhvvhS^TIRPt}UzLUFNLNm$ zv8<1NuewP|xgV>!NJxJUSINuNKGwV}Id`3dfq#H6_#M3k^KsUM4`|U57EB ztO}JN_-^8z$>2s?C&sB!zsvKeLax~Rzu|WGfG2IQ*Xp(VR`Hdg)1WLv9o3PrjMb;# z51Gma{0CLwAW;SI0^{>^(nkG83Z-VZ?Jcj49JdJ1FwZse`QzOili078enSA%vfdMUlGJF#E+{U!U;E3aO7N3|ZP%HUis zT{3!EoME??FmoDPmyl6_)0MA%P`4Od(>L_^u#>LG0k z=rt^))qn~!Fq^loQBOG?*)t(>DUw3`c1kVxHgL>YENc5wGa6|p5QGjLfnf9hUzs;5q; zb(>*%;5FjnIJv0QO^CRS8F$!Y+GJN+R+m=KhKXBP`CF;vR@FM=*bE|kJ*PYcJ7ICu zM*T}6Iex36gkY!=*(M>Nv0_H2FoWw zER^E+cB)fOs9RVF`4E@?nfa!SWomYY*%q43@0=+%Zu*J$D%0?}2^%ps(Z*@iFLj%! zMeNIsA%;F5a2{wB#tjLJUwv?Fkb7Z}fcX*U(Ov&i9E1#1tbNJC zq-rZnc(d?@zV}e1j2Eh?x4Vv_NI;uQ^AF}X>oaZOrOuvszPH;~t|B`|NXDDfS z!l%n#8F2`m{!HBGz(*#Dpp|sEE_3pAwM`XWF9zk-$D@kZ7??}q5x61#w$U{RYJ!JN zx$wf0P~umZU4%R~3u>HBat!*meD2EA0|f!P-6Dff8;^y;g?*0Fw|r19nuRH(GXu)ERHiAguk6k8*3-DfQ;EuL$QDf3&)px#BzG0{R(&Z`*Q?Q(94l)(`<kU4?(sa!iLl2L*D=cX-4$EU&7f8qH@u@+-ebG~Ir5_W82EhLa% zrtR3u6_K+Clt%7;2fG@Em!}J+;pbeki%%p$tel!~@kJ*Y_&|sF;`58|K=p*q)J28Y2;-W1Q{hX&qwV)7j)NbhQ z6EZ)!GFs*&t`7&^9}RP9aXQF0hKnNUV^)zx{(n11rp;HxgMT)M=gVW0l$D|eFX(|2 z{_%fCxI_$>A=t{#&v~-dPn>PX{-TWd&-17x8u|SXh~!cIGY9n~DB+oZ63b14{eMUy z*C}Z3j@tO-5T$J`<-%rRhWnm@WouUStzNli^+501B_8VV6`5~BG#FW)I4Y$mQa93K zlqmc$oT(v+s`pLV*tZAz>Xa)q<)+|#`HIyUwPvl7`x^D11)r%t#n6Hno2wLs>(N1T zy}OhmCBg2k#`NCj#Oav>t(?^BfETRkHoQK-v#%_N7i*CUTo|hkTCO` z-8dyAzquQ-Os{H!orW+-m#Of)rTNR_rs7~djr!kW-pvQH2xX7>p{_5|@$|kU)Wn!E1@XcPHbGQx+tE>UGz0Q){ zx8|iZ^E|P|nHTIWb|p8%b}9&i)Q4?{Di&8|({G)&l8h{6zg0HSM1Mir)z$p_EAp`( zAwq!ZxV{#yyT#e<5PvP(uo(Y4Xeb&gEh9Ws_dH3o)M4L`)Kn>(=V+McQ~KZ}2yFU; zW(Q9(3q>oVd?2%+j#)fjghTtO@eZX~amhOg5jS ztoazxAGU`AromhCG?^9Ue#NhGp(o-Cee}GrrqBUTh?~9FtCINq;>axrM|WA_fUqW; zfo@ji_!wB(?Hcv}RRMx_jkiPz#*>sE8grL=$+B={jvlAHXI{Z1ZyD-|q9LBuas)z_ z!xN`a*u8t8aaYgbRNU)&Gq;=8xetT58|~A1_EX0hbwcpE9dTi;2q-NxK8D4}*00bJ zoMYkAt%XpWBwTP5iYLsb8GQ)RV_bZoJ@g_FCeWyVm1L8lAt(bqNbtD^dqXHk><~gk z-56GcESw{ieL1EIpL)7%M~i7HWyW2FU~n%BMY6Qvsq)^=z%IR%Ze*7VgCHbcPZ~V@ z`h@>bIcmyd)_h(b7fY_~1oCWmR$`F1zyf7@v1=I0`H z2{n5vv+@$Ven`Maf!ZOIP%6b*UJ52ff^OV$GpQ)IVu!u^&Yq#k+C4VYDr)9{8IUA7 zqi1-hMe%g^d7e+BKA9t_Ah!^)c@Foc#R&S{0nV~(5yib=M}CI6_y{HFRA$?=N;s+z zP&=SDpKs#n9GN6*C*1wLf zJ7rYduQ&ZNW|TAXQax#Xb}ix%VT)gN6Pdb=dXBi~T&orOY#?j~UlSkK+RDABgO=cM zLST24cI*=2g(9}Wg>5+UQ0oNRKrq<3OiOyK=h9OrrCm6=FEA9zDs+5MSV?tPqu83p zG+38&0%P4C!*#y`UvCVaOT)47SB`ycH+<_bHoo6_+PM%{`d_rhm2#Hda_v@bO}%Yp z!0L*0(WH?L+9h_!*mqQE-iG4+6Ti!x1^|SdcK*>%xbi8*CO{U+%Db)jN~7CIHvHEL z$a2-ruyvDTi$)pEgHx)H|3$Es#xV%rvIXRwzQg_DA-VTE>YVt}ipr=9Ua`znxFAdV zYwcIq7F5e(UB9!%ZuZ3n0AG|g(m)2{8%SdzchG+b-3DMMHP@SRFd`D~9>CR1SwT7t zWDq{LbV&TNA93rqu5%V3Hiaul$U zo)XD~or^+N2uqCAaxrvL7~G(Lr#qy1I;sq65T{T!8uc9^%hO^z0RSGfA^HA=L~alw zUOvKw&U=}^r8`Tt-1w#yGjqYUseQA&PlcH`x_*r3A%y7#rr^gYVn%Zu?b&Ia!eTd$ zAaeUh-!CWid@=YV$VlF}1#jinurTFtA8k<2pB2oBs|E?t&eJ?|M9INoGo^^hC|YN;r13T9I2Ky8`AwY&eXU zN*2Igs=9-b@JIb5QqHbq7F9lwNg^KE4YX9ykMZ)OP_luv&Z!E|Hu+mQ^~cG`f2M*v zl1)vOPtXVoq1_Q9YdU00EXrrqmn zLJm~KMt)iv^}9V##no@$6ff(@Mx<(@RumKg4ZWqh4YLkypf80knKDYt@Q7+$k0AQ| zeENw`XFht#=@IfkGKMRqya^9xEmCW?Rl(%V-Jc@EgzwuKVXKgA0%+Jifmk9!o(hAX z;X1b78T71q{9$WQU3b{3IhExzmc}b)w6%5dm9Y)tHv&XMGNOrfyORcqtQ;U$Xw1Vh zs%m4|!t9V*#tcX{0_f`@3Y97|2I?-SGBGp)K;Ac1#57VjUC3y5k#toU)}Z|f^;iHD z;B<%KZEP>B2AV=`hLm)#0KSJ~T}F?;J+c@1hymLmH4Sg@{tWe!TER35aGnyPY`It; zAneQeiSr6=l84}uBXRr_#mSlUk3Y!*bMq__fEK;hZKu&5s!a*S7bFjI)Bas8u^8K% zM*Xk+Bqjcmcx&;5wJv(L0S(^exe{Yg@HLoI{q)XE$)y$fC@I`}+eZ9G9MSAc!?jxfc=z8LenrELCHO(6K+=|Tnq!iZ1x|7_MKj8b? zs9)#HlK1?xccSkq$`q|_2yL@GB zN&hOZ0df6~(XktA!&c{k*1}03sbn-J%kt;dfB05$zz*4L%n$79@^|4oZkP>1rq^JI zDd|*?D7_uJ=30dURFA=7O1P@WEvymVsno;Mu?ta*=1D*Chc_qB`jjU8vn5OBW!3RD zI~&|MBdwA-$Dy`ctG$v-7B3;q131C#S<#dkZyvIpOY=|T51`E9YH9=E<0A-Q&Tgv! z3P0rlzEJ{zT7rHW?651s4MS}pzgA@Hyd8zshfnu0oniPz_1rLmHtMY#rXh!F57Y>B z-WV)gUMly4hw()*&XV;)fPHs0qv3#4(nk2aY&~_o(`Qgm#%*cRQr^^`lQRzbiTxi_ zdFu6UHxG0XO}N3Hn)VWg63=`|W2-I$5ItjKJv#$xR<%RT20idO$SKn!)23$=>Q!xr z;s|kas?rfM!;f*Z%E@o$ZSN{bExPHwZ#O@9T2cg0!fa*wKKW?)8IM1;S3@UlJYqjA z<4B~_H%ZG<`XhuMu0!M9!}J5byRa5?GJkumZ0HYwXHHnU!eqsbw`s+ zcg`e!*gg{LObhUN3#rOjeLmRqz~lGJ3rG-X6DFI%1oQ?HyGog;%0tA%~a z-sH#BN{U-m8DN?52RwMKgHUb~tIG!u`!S;db_q=1NNubSRe_3w^2v041sjtHQ@!A6 z3(}nWBxjYO1IffrmpBwE=!CnDLVex>#0ZxSqsA`5mVH9=6qh^xPZtI39pg{yvVqZ- zmj+npY_DPY;YOr@5T1Fq7c}5A%!AS z)|lM=B{axSzpiQ=+cx`JJ= z=E2P?IeQ-tJM9S4)}P%iZ3p*N$Z>z+1F@C1q>E7Nu+28M(tffB_HF)zivIm}cOdTTQt+iSnBT_*qW=wH2;+Nd$mrtr0 zhmZ~nntuOvm;Q{lKgdi9j$x~QpV`ic!IF#lC`EChGbWwZ#R$GMQXxaqiwjp)p13sI zc&7qOp8Ao|^>@R4UG-V5GLj;ha?eL$4;40iTqxTJ}g-D^@V);r5(EuikJUG}-G;`NYoTm_XU?NE9 zaz!(&gEZfHVd;83%$6y5%In8R!2_^M){E`uhsu4iDG)BCc#HjZPY%;YVVG#H&X^l7 zJl-}so;k#sw;ts(&cpCTK}$Pmm8FG`40#RfFqfrN3w~+3{!pg7m6pNMgESEnXVg&& zYJ{p1X=m9oMp|RL8-_Ul;Yqv}gdS2|75<@Ln|oe4cYOc!E(JZL)uIa^SC$7`-huLT z`rH|lTZ~Vt4KiJS+4E0!EA8{0NBPx7ek2b$5*&5)N1BH|O4BIJkHzX(*kJRfANg?R z&4=ctIdGX@*z>qf1czg7OGVWatj56Gbgn**L1e$_O2=yUXb;5zEQl%YA^O$+_vGa$X0h=># zJw#X|Y*xrEv~2Uz17*6DD6I0jom-;7N*2{)WK}YBnJgEJ3k$VtwszWom#zwbfNTF| z)e8L)Nd7A8`}*7&s>P=zxnkvQ*E}gV%|1g|s6L02nCab$H!W~KEeL8z8*GlsGMO$8 zQnXpGy*NGJ9EEivocf};1ZR%EmTlR&eQQszZ1zc7&Nj&Vuu&c{K@H#@P}xCSGAk`Y zYuR~IizSq&gO3v-EINkC!57myD_cBw&7gCqUf1G>wfbP&Lwql@x|}g9VUE~8Bo}9_ z?tDy)HRqo28fTufk2R^>*AbZX!pNj|iAkS5h};K`7Vo$^Tg1PhF5^FczXKdm5Nnnj zLwrqRtqoVkXEaZ5q_HUL-Z`QQ3esH;zt8PH{lUW=T3`?GNul|GcQH@sM6467P(h~2~KXlY%bc*q5JT&-U1kP&I zOQtX|IMJ2n5XEPzI)Qci3);Tbxm;IL^$VvWTi`n+9b;lAtO{GxzVmO<)Z|2Vt>|%K zRX36iHN;wCMpE>zlkI;BG@(xgE3oD7FnirXuA|%LyHKHCr=4o4)VVRVMG6vO;+HdL zpFelvQ0dJVf14UcQaY817BP`sYhzw(eVQ0d=`FEfV;YneEyy9{6-oEa6Nu`;8T#UH zL%$x>Typ}^^3RJWNWI*3N?U8(wX8xeF6}V^I^!clsd|}}IUXb}1?RPGe51a_1=XiD!T$rzd?ecm?@qWyFw9u`Y%_>ux?22N`YWJuD&Yq~{=lA0$6d+{`Gwhc( zy{}`Fo?gINTbPnhlYS_hVThrUcTd%a#X^lQ&vtSI*H%uO%)pl0E;bz-k4Dq6DKjFi zB^^UIXs&bnWaTKPvzO)?ux5Sgv!VM`LcWC~#|<+)dGMFnh8taHB#~HOF|QfTk>r}{ z>FDjiK1rU^`x)hMY}P>b=o(S%!F?i-M0Fk$97x%oW{|Gb;){_)i`L>v8^O`w=8$rp zfO>HcuKhHo-`d&Gj*f|u`ziTE<@Uj$j$!Gt>odM$&|vHB*lNC+!mw$OAdT6Q0U3Ha zG|%oPf|kxKhzB`u%MR#HlI>7=wen7RwJDLS%^nwyTw z^0_K};GM@F-cL958aLKkGKXI`IDFeE(H)ZX5r0C}Uxj(tQ?Y2PRa-@?@!xYVfUd}# zltK-^<-u9Ntw*sftLca<0RwogfAE3sZipj1xXdgY-4xy7Yeif(PaJNZA~v&RaI0z> zR8bi%uVk}UveEUSf7)8A{!r9B(~OFEGiX26_y1JPRoNop9^E6Oc>mM|VB~??n9G5G z-8}Zv%+aUQCXrahO%8V97-Esh1?2Rg-LbY<yBVZ*qLcDaxL2Q$WjedsJUcxWkE{Dbm)9R<}Q4-q8(LlVcwPdLMM#X^h| z3xjJs=^o8uO8_3?%UJWse9#Ljuwb2*LLPOQ!94BeFBL+7jm{z$J&D}S4pA$e3YG7y zX9?brPCN9Sw;~aBnrSEyvv5{lQ~{hv^hVI8VFrcfr|ulcRi@})nKoY-Y$}8t$O)0c zbmK_gXfhF|&)R13oz_|O=|B*@1z%FJ3d`q)r_Y>y5{jID@70W%`ZIBObDoJF!Kl{? zL_3^q;L=Nt`o}`5mv8hMl~jo})4}vZuaVX0%gdK-_KQ%EkCH%lFTrbI9g!YC9Q~y^ zo8;E_I(i;~O_xzFtk89n*Sseb*5*62WN!$+!rbKiVzV>N|(HuSX{~aLV}*8t@>`F@vzxcQOo&2Tr(${5^9TQ zWKGyVgPNZaYa9AYP6|?nm1)F97e6YI`xLdz=d}T|Y6X|CYNikMDE32*%&m#FbA+N2 zsFS#Ag@q=(vIk?W6nI2uQvtY`%m`>!PNaYPuVoKFlcG{rbTO%$^_-H9ZKh&TRs`Ws zj8cWV+Z!V^>f3@Z!b6<>q{irg6d&4r`3a{8*Fp#&(=~sTELvF|Gy$xGvQH}h(Yh+Q z?8dz9M7KY`#THE!j~VsVMdnt0A|2J_t8y{lwON3JId7WeXb2_;Is6wS*PsS|6!z`fmcgJDvgI%psZ)ow=`Evvk$! zCAFUA%a^TQyCyLAKUiIxOAK?CaTpp8-I8zq#`GOMB{*WNnfHoKVlZGNfry`P(+6B0MMPDN4qcr=&LOH~E-8lvLg{xMilsV&St6 z?&H|#f0|ghAjpR1DIF;Z^JU5fMLuyok6f=1)?7C$hm)2DbA+fgerfW5jlV7+!P*gc zHf;hDl50bN!BnaY&I4swm4OY~zcGV{ujEz)dWR!kfGOX6@d-{=SWK`CNyjM#=BLqY z@XLbwQd&)a1qxY$zJggG-eOtB#t9{^wSa7e;oAh~HMp)Q#)3>?Ws&cscqm_YzSdG4 zSqse4*uK<6a#lLR;%(|TR+bvn7y_gAJeJsP8G)_CXn09+wIu^fmoHhdV(H4&1AS{& zdYtA~;(Br!ZnF>S>IQB@*Zz_)=UusEge#OVFGV}goP7urwk_xz#i2Vk6L=fGAn7x) z0Eg!Qf|@N{QKFRm@|PdIuGzrka8DzK z{oB$M*v;`tVt^$B#z^2BymYXSJ^hMxtjxmGV*SK&$7R?XrD{TK?xH0pm=8e?>F{5~H8?$g}=1b9V8Q_s&}p$ri& z&CiIPoboaN-ozt3aQa2v6Ne8cRmLXz^)e9YfSL&bIn7hY@lS&UwG*;IRqzFmwZm&a zTzQxKhH8=>e85%eul)9jgj;6mcc06EKCE&PXm7YT^!KzWezP=1T}8@OQB_%5QG`1C z9zqkpPeXfwd9NDeL$i8fOtNzIHH$Anaj+DDHZX1b63i>Yu`9#GsNFKpSiC&ctMo2h ze>GQY0F#SDQr=XUR&FXbOP&BUuy1T!3TZpIVQU5?RUd0^Ws%)jVPEz}UJwW%J zKJe7^t8eRk?R$j)1mYylKmEM>gP?Dhm_0(t_sq?bZY44#{jdZz-8@n1&jZE&mx@N? z8$#P!*QSVF^;QJj`ng0ef&Anf&3zAvmZv^Jmf}nkjqS-!GE-T^6DoVMYi1!pHU?2d ziCr7RL5y#u~qLAW1_c=^b^OEOr9@mU!$h(V| zmeqwa9kigu6|_eESh(j+sY_Z<1vT0o`R==K>AroldDLCs#pJiVV=26QZHQkp$+7lnrjzDL`^URpbcC!_*j(X`kkYfQ!wy-nrrC&6~P!+HmWpo3HQY!%weY zpYQ8><(NyeNEi{@^RwE`vFJDNvg^EGbZ-OiBH-yngHsuf#lii-9a0^>h`fq&3u6i^ zw@9kka|A>C{;V(za)Faem?@2)ai+4q;?SsXrGr@6mq>5_*W6nI#)2*yAUei<-kpAu zJb4@N`Tl9b6@c;FBMGpL?-tkNC#tjfRa#=&FZS7=G_YB4`ROx5HYFF1|k?(Lh1y;s4}h0 zhP5!brH`@)ct%RY>i&yU599tt$j~Z%T}aJ3b12z7!a~ft@18H?nw-W){eO(tgBHp+1XH!U5X!Zv6#=18 z+(I+=L_zvZ_Lz0q#x$h4Is*%t=e(m-7F_RWMoNUB41pOhSefTdr^_b}aOZ8CH{HJV z4%$MYxy-}3a_0yY34SSqBxaVJ0ihu4V3kHv|2t0`Rq*keqfMH0!t73wK+%PpeUNk<0V$d8a)N~p;>@LFV;{= z%la5azQ8(Ls<{hA6bZ8qEIuHw;~?@8c$a-dkF=3EBK~zEdYt!~P@=QKaOA+Pb0<@(rJ!QzGYD$cW0ZPDj95PQtCHIv*~cLm#IQ z{h7bs7KyHG=g`2L1%MWCb!7=xTj&fKr?#nvhL5|5VhS|3s7aQwRm3q!4pmC^&`*v4HWE{kz40;(ONo- z(R-cMcs$gHbUCJb%^7k^8cB2HI6_pORMDqI@epC_+JD%!JPZ%AlkiS+o|Q|NbzgV$ zZ5#ix`{wI!4YdT=o-{Bu0Ph?__GHPQ6JAvn^>~~JaRR;=95g4{5#>C@(4{ndauk46 zzaxnPmvJ4Xq*@x~kSFPdtJH^j@x7T7@8*<;(t!$-1PGTKskGuHP;@QG@6f@9Q{-Y~ zpu3xP?vidH_0pHRF?28J9~_CLO*FG~TAPRO=FF3%Q8;~(5f{Cg{=GXzf-Cb@`7Sra z2p)H60=~s=MuhY@W;5Y5q?dL5M~)>|Vj47E|9%%rOU_g3awKsLVQ>pM;PZbuANIFj z6)3XilfNbV0n~dLk$|pww+nK=SXN2Y;tVGoEzUF!s(N$p@3_jEpT0>EQ~2J@Bc}=N zY92dt;e`Wf(BgoS*>qqJd{}yc_TfiQoeATG}ZazR^ z3D)Z`n+SkYz(Hp?;bi?qlX$L1&V>rG+JwnssYqH`ZlYp89 zA!W~r=F5*XUp(VGSLPUHb;k6LQjg2!MMIV=`0SWl^PI30(_>u+3#vwWR9V)dl}rt` zh>Q%@HS-hCJ!h*YlyT`}=P_j?-IxA}Qz%%mP=*Qs^ z+Dq5jMrw{#Rk_xIZfov-PX&ZJpEX4c z2TkTvJ{aQfu0HO(%RUVB?&a@Wh-sr*GB!nY8kUl z-%x9!tJ3D5y@j;mnX!?A9+K1W?^-K4mR1{I@>Ld9*b z7uK@#d(|z~HmWQ+D!M1dk>C#K>7_y6SWQ($JZwZ9BYdB^9Lpi`o5N9NLEeHy?@nc> zRh};BYgL!P_8zSDhDH?xCR__pT|0J=HrMBWBz~NSpee;x!1A48QkFQ%%Ny_O8B3fM z6Qj!3ug4KR#{XLwL1MGjsd%KY!t5GdrzJ9*l2Qy3Knq}g7I0}7riUJgvr~1*vM45E z4o3cvQ1zS7jF}W@$?q%bn4EuWA5MI%gQD|7RsGH5TW=ZZpB%!M!aNSY5$nG0%{zEo zVwNHzNIrM%oiWnoN0(6rMu>tVMN#YDW|CPPMQ3IjKkt;MZa=oZ?5|RciF%Y$htBRM zYp+Qh%OeUoLovi0-`PCz>vJc6LvspZ6OfEyYT3Q5qu)zQV44_zL``?ro~C!NqDuw+ zUQXn_HaVWOo@RmSlz&$z6WJ>Iyw0k-y2u3t`YC1Cm05pTtu|$El&BN0m5xWfb$fNi z+u}pKoEe*wDCNaKz;&nwQa+qE{sS0L5&*Nsft7MlhvPhWzTKQXD}?e@kV{1hI)tDb z^;1b+as0S|aynFck;K6D5Pc3g7}-r!#~Y&a^Ibhi>}NRL7Eu~}7AAnm@f2K!2q@Tc zHLOJyO16FW6=ZpmH%ab?temNOPL*G8mCq^6>H^2}enioCDU*tH*SI^md$5+YOkC-)t*uvsMEH}A$Hx_{q znOWLp?v=7$lSjxaKI=}G4w6RW+~27iq=v$IQ_r}9m?9OD;K{yd6~%huT3yxj6DN_= zmR~_#PeEWlg(74>!$MW-)iby8!OsZUhH1;hi@iWc5kf(=V42cl%qp9hd6A22gsKSu z3o=pCg=9NULE+?AOBt4CW2ejqq*b3jEe`p6;mXZ9$kaUDd+XfXV#gVF#C8h@I8}^NOKy>8jYn`JP(JH=R zmb+ryqFu89{>0&E4jEl>}MD&MA-1^suPp_GIq0e!7d zcgmQtimL7@b>RG7<;n3R_@e`NI@FKa^hxNYaU%r~4U z%JHjh>+LW6weu1QwHU;$LJHy|ecr9jye=yEn`m8NWIGjmiDe#zH)6Z|E=|T z1kzWw7&neL8&M01Kf%eGj}bB%sy@#ihU7!c7KrriG6V}nN?$eV_vOJzk@5e(7LSy` zT6lbiRBSKp+HHYFYI@;SD{s5)mJI72wJn_~%0wXXl$sk$d$SAAed3*3i1+cxL&=Ul z5{C#zfmgwhm!8xEy2Jd8Rpy~nR-VVFt}AD=%|mLf*I)^_I)Cy&3<~qXGY?BkS#RkG zc$^6~%=o5>w!ouI$It++z4|eXZcv=n|GcZg{|r?jg+`pCzL!J=OmEGXo|O&8q88n3 zU~Bt9Wo_JEtWMq#DQe?JY&eSkdr~ea4=SfU@m|P4ivXp#sKBQrY#iI5s;3Yn{mVyEC~`hM?Dxy*IZ1D zF>GfQNL&Vv;s}q*hpv((5aEt7#6zh;GF-aeXJRUY;^FOgtk_im#1TdiA)t71>j8G+ zH{V|Z5Mqj3hcv5dn01IC{%$2&FQ2>x5pzpbre$MzUSSwwei$P16tVFbGYqHY{QAk| zMyQOH9OgbJ_ks9|(mb4R=jihxih;s8r9w^qxNB<7{nS@M6PX(1;tFN_#WFy8coJ#I zo+*l^v>tJt`p zui_Z-0Ca<22KAMGj<| zf_G3b-IPK1A12H*kfAw=!LB}f;rTc!1SltpHQ4coeKtJo-XPbWUFj%7BqynYC}iH+ zDDK43o&4p?L$_>nZC8!BPe1U=@$J@%qdi@v7*ltLm>08508(d;yNg@cZWhq>-1J8$ zMRth+S4M?)2Wn(q+a&Jn(G`pnEHGH(-rQqENXa{=(7ZxrVNz^l>n11@uxWgqLVGXY zdJB~XP{GaY+ykdQ)=W8?x;>91d>wG2WNA4t3a-iAK;bZwv(K#OekZe?UKUS!KFUX$9`nsLASL3VA{eC`j|q zN?4C&!9=*?c5JL)adYoL8X2oIRmI?JPRhP~=cpP^H`cSw(;qZ{4Qs7%q3UH(;1K3i zCI`xILC=-T6?KkCyguA{PCeQRnHLNijrxCwaO8)|RsQt0h}Kz{zaB1%kc5#_t{YmN z{atweAQ%b<6uZv6o3?gr4M7Ye7V*R$B=m5%VR50>O}W@kUEiM|wix7vsj)@4vht`C zx&IXBfRXcsM`K*%UUzM$;ju}~zVPneow3eF*H>kWj-beR5(CeEPi)w`ve1iW+~)H_ zae0}PyhXamz;C;FE0!w42&IEUgmvW(_4^B&NozH*WmD4&K89FRVZ#>){zA;7pj=Gnh2v%K7;3<$1wMq9}cxs9;#iHnNakLfO4qyb!8(b~B z*F+^1FF+I-H_03w_+GQ&wj`BEN$k(&T2{0{h8ktsU))R|u4n@5*PPjyzcbIE{ zJ(0x%twdsr?)H-W9xrJUjhD4Jk^ zZMjTKExsh3F7v!gG5}{km=5iucUH)m1^yVFYbTNSpE>_D2Aru1 zb!)`Oes}(zhjfF#avYc1xwH8H#UpdqOyV6W{L5CWokq_)ck*^_vQHhpf zkHVB2ROa2K(1If`BvCMJU*bW?Ar=)HPo#;!w4bgY$2RXa-E^2#*p~lg{v(haC+V2; zc&5OX!Qsi0QrF61WK6&7lrUs&(S7U#9=HV&a55IEqTGInCmle!Dl~7 zAj7V;VHH(vq;Odoo2buEgH$veQMncL^*w1-Lp7A^NMOOron!D$qa`f3uo|KQ3Y6E% z#sbf93#W-!X!h2i^za*rX}P}1#T`z`XKyCqgBd&G+1{jw@}$Z4;Ei$d>cGv7c8pu1Ba z#`Xe}Ds@wWQbc-Nx)J#+F*9Yv8rB6whaPAYs5x@U$0BBhQ(Qw;;S_5y*6!|D_S}!b zkE+MOFU+9(267T*7o1Re;k@rxC@RIC1m5T8c(Yhfbhl+84#nTZ#_}8_CFXo9XFes_ zMmjdxRzj{n-fGWCdlQ=-t!cYGtsSV_*h;E~N$pDLu$0co%Goxi4TR!;v^^WcBeTug z1#C|t{+tt0m7Y1(aon7qW@V*l4{e|nPj!`6Wu?MxgLE9(bj3==W~TP_pELLBX|9aT zeRXPO?`hBN=F>HNeEo&^QQ>oygHZsYGeJc>vOxkE*9Q$`rzZh;4*`7)R#z;f@4ElO zP*vUf$|}gfY8A3dYjCYTTI2kuR^({c!#PWh)7JRD`>FDqK?1+k-TWM)`e7S1m4=Vf zU8uVjMkj&t`4_P4xJNVEB;yV&#=082C{n-gb3p`B`i3K@xC|$#R+FHRTb^c+f{H^# zJH69O!b^@3!}W~OPAjt%2p4g~^p;lkFK7{#3XzXlUi(#*wTHR|FIXl&ZNPdxFUk>MRIg))T_x@1`Hw z-F)ohqUncn%RXV1l6Mh}pF_RP0{Ai*_nDznUwD=%o!t6CHGYEH7WjxVZphwH85Lz3 zjlEXOX7+s8Jocm{kCD-yzeVs4sW*!H&_AS?Rd5-LK=>x`rRCtv=NSBP8xo+Ukpw8 z<{Dg!@p6YDq`K|k5tZ@SRmZQ|+49K;ld*%?)OP+!vnqKF%Ag2)JNewqk=HHNwVi(D zTT}HRC>VPGr^IhpSJmoSD2rBRy%TG3erJIQ%U7;m+PA8Hnr|ODKoNqI`ewzvfjz! zHCV&y9&q9XJ22|un+_b~@;fGnZ^0WgCZ;NxU? zNpwqS=JLVJM{k(^W9weAc7S4jwSgtQ11ss+=Y{-qIfQz`_#jjkj?e*mvUmzTUuEjT zc!pfYsd5#K?Ockfj4W63zX36^KjB}{ZZY$OMGx*N_9*mgJox{$t7o27J(OYE%;G_? z6W^$RHI3F02c7SsQPgP|qp}mgd1qT~0TDI}OR&)M@|U~sqgp=bmB~+C;TrX&4r1o) z`-I;T#KmYkG#XD}fjaaN8Z?P;$Mn@4?HOCe&G9sU$^6Ch*Us;p z-@|_g=0ir4qtxf5=~Rsjf0TAvwB~Q%#~b(&I{LDOo`>NYX3|$^QUBn!ni>@C-Iop9 z6VhdfHl*N>g!yGxg>Mn_C?e9_{eH2I2v8MmHas~rgq}S${r+p|hNFcWamWfd$*1Gd zFdhCi?Kul$2X+Oq6<mryI#e6xvi8JZ z`Y}b$C$G*aN(PfZtsrO1(`8B)6>fX|$3NjJznx|jjru*)Pn;si-9w;>kI<&h>*?$z zbT;T8VLz1ZRSBkU-Ims<)~{MtkKq?e?VY3$!T;@HPGQ-}@f+c&7x!boQze+=pO9}m zbM&Di0Xg$^yJ32AE?PMx=K?uIHnmRJio@*;;X~CK$Gy%8$=hOeZkd?uy+u8|$2u!i zB*UZA%shv+$QQWCNq(O9sfq)`V}<#xBOYfV^ML0+bJ~1rz89&-pF0MPHooAFIIfUj z2S*XNJanmhlv?D2JN(eieEK1Epy9&)Tc?gWlmj{yQ=Y!=8J{3$*2(~OLu1BY_zqHv ziz4cI`pDxU#jx-wBI)S;+ge`cJ8hZwiQ)sfm_B-8$b18G%y)EGQHN=?x*PcQF{CD} z`4Np1ZPfpGBjvIrP&De}E=Dw`ULiE#yonKr=bmRCs8ddYgZ>jI$cs0@6UWqy<35t8 zl#ZI8b{|M#6ABOG`r#+a>!5v+f9AOc#?Si)R<2&YWX;N@1HEfk4lFZ%{--yOY=gKu zdW|zl@H+Er>VQF}a9fN&7hWUOXKLoxFU{=zo!l`ej%Y$59mikFF8pS{qGGMDlB2Rw z|5_MVoJ#^vNX)v`!)K*YpL%BI=#wE6!e9dD{E63^C!Rk4{AsC91{`&o@>Oc?O`GG! z^D{?}#-`t*f=2!86*v#}j15~Ahbp9*_up(j`M9qRNEc2%3Zx4spKJ@sA1*`sqk-+T zE`^hH{Y%s^mrq@8Dy%8+5CAM)vTQ}Tv;ujVXa?^kyCnCAF`$(dsAgx~8P*kmE?Afh z+jM^8B{|I0T}UE*KAQBP2L`!t39IZFA0Cynb6^3F(_@$UT%FBxscKzz<#@J0H_!Sj z#~04KIvX2>yYn#zqoIaIwsjCSJ>nzG^O9xr{Fz4mOHvnj1oCOrZ!aQ5FY;}WHP|OI zljIzyS`}*P)bpVkPV9*oc;fNA>z{4ymn5vl@xS8|eGpWu<2UO6x#o!vG$cuGzV!xK zZ{AW$*0XQW#oR{xqeLC?xw|&pack>y|2k0X(lFZfcieH?9i_*(BnWwH?)%W0Ez$@5 z;~d8LWM5xx9ChKl;q5Iy-MI1kEn7JKTxEKD92sHaxrWj?G&)Z`^Qm>0uqf zJs)vX`vKqp7SBmMasRr%MsZ`L*D%zk>#zIijiqq}6uGW%+49~c{mWJk4D|Q*t?G9^ z@Q3SNe#wT(Z5ym!cogMtEf%m%xYb4o%9oeGw+0v`Coq)`i1%QqEpN3GWSaNsp4_9)xQc$%7h)wgY=vlFB_3G6t zR;*mLX2}vMY4tx+`OKRKdmHtCNWrcoTJ_?c-Yv6%t7`G=xOxLgh$2tCr7OraI;t$~ z-6eCy`v?6}V)y-KE+^(}?_HNsu=c*m-VTbVUS~~Dy(PR4T~<327mBsl-S7{5S3>>H zDXOC55Zv08YxPwC4b&2{r0}8~m+a7TvRMVos8d_R)PaXO3f?E`}Qk zp%0yHQW5U`gKAQL^k|F#s8CfaK%2-V7CTDDQkX}hYn9?ZENZkI;%(g~st74&KIO<@ zvgP`-6(B%%YViv(zm{;X!-$b3Nt;m{-XV_^4VaRlEYF$|$AMm zSNaA0=Y$M9hWB8HrYhx;mqY7av%I-3lp3vVbe$gL^$KaXJ@IYOyb?vrTL zAN2r>5?Xx;h(w{th#9Vma6<@!TjU~oa0Mo_cnh-Un1j<^>jQL2)~=fqvOK*|FfASf zLlOHEeUTRdJl||97+|_#$i5@=#_O<@$Vf6S#@l&U<(YAzO1B4JQ4TOIJ{$!P;4!~G z6smfG(z+k)mLA$Yz~5G9;d|?|CH$N>>d?>y4|_kWbWV!qw?Yl=%K2!4VjFcy*r*)zU15t_LB|b>WPA~O z6o)lf-$-etv%M$kZ|~e=^i>Iw zW(;tJ*DJ0A`#ScZ~DeKdHC z0uJiFAuhFNzu-}0+rNtT9tE1afm(%Cc0bxYb=c{qg?qGxXH&T>lrr`k*z9GEu6~%7 z6C?)1=~rI8@J`(a4zX?V3iSiay2Upv1r8qIV!78f@tW4H)A6>y1(?jGoowXk$eZb& zLO-W(aE_hk3pa+*P>(Dj~ zjwpS67O4xHngv$50!2*`$4gqj46K%7S6M&Gmx5^Bfef>Z7u%ouqQ;}7{v)62?`g&V zR%x^#l>2uC3IsFFpkXu5ZH<#6mU8yjh4ovk=trY|V;D%6OWxY`uVoH%Y$Ogc4Jw{F z=7o?ul0X&&G!(S&&kayEGM?HvJ3ROnrTAunSG@d8)?eGdeAz%x?~*kGYX*A%;A+>G z-7^$-^2h!$;Mtczn)$_QSeF+^OX}6vf={M2HtsWg4#npi_4UE+Q2cfd&qMJsh*Q|= zU$S;(t$*d}p5C>~`+ItW+pc?jXt1x=Z)UJY{gIH}JhkWi-aUS$aIi||{HpnQX4mer z`PdJd)n~j0ml_F=d){e29;!d%!m};{Sl$>&$(_k8m&+2D9zpqtFoo5#cYrA`#Zk6rK?;`TO>zMLqdv; z;?W|kr)nOpU!psT;D9(8%s0+z%`6tY9ayi}J50pLvY0sU!hBOpc3@v}qyFzpd*KQG z7C-P}*baw5eW#9z9ayuc&Yd_RM?FcfM^C!#h6!R$k^%p*-EfzX7*^i#bV*=alTR6M zr}h}7XP+=A#e%;Z@h5XQXVC9`tFbq-reNPJ7i>=V&JFS@QX)chUnST)cqd~ke6Yqs?R3y!$g7cplzy+!e1AZPnn6Vtky+g?Gr%_ zc3?2dIP}W<;-vOKSaPJ1oFV&IykA5*^<|Bpp)L^`#_$v8Kn^PqF%p0Tk`eSph!$G^oa_*=X`U4<^} z>tZ2i3qlAnYw!b;`-6q&*kf&BI@9$|*zVMd{3l@1*RVa)zOoYnCdYK%nM?XcHX^t{D#TlKCg{k>%VPmleN*HYoyhJJN!l_ z)X3>18&1-`Fw|MA0bzrpL)6vw+DycbQF2oSHzmz%9NE5|NT}N;C&Kufhp&@6{w6Nd z(zpj-BuX?5#M>|+uTGQ=Fgt4LZiC=i6epi@Bq)4hy8GGxuNQ#aXid2TjGwiI5dfya#@zRcS9F*>bm7fs$k@~MI{!!W2|Oymz0G10WhV%*|C_e3y$gYc z4<2!p!(byUhc()iwA3nCCtQpFD-IJ(uG#!6=Z(YPJ2t9VoEZGP`4TZWMMT8RUr+U1 ze9HuCoP1y0PvtsY7j#OY>VYRBf!eE8u096o2D{leB_&aqEL_HvHgID|j%RIBtw?3&e}Jmu^-h>qh+_XH^AW z-$zHK*~KPByjfjBBzxzGfuuqYtj>x4ZX$gCIcNslz3s$_fB1bR7GG#ls&O8R+Gl56 zO{24U1xr^95Sgc7MXX6YWhWsN)eg1{3rZ2M;xNf5#^)4Tk}G2_XGD%K&*O%E6O@n; zQSa*WCDFL}_PF{@xTax5p%%8XWQ3^EuRBTHQR^Z6j$k~|gbndtEcbPk&L%!q9EGUw zmu5bGrg`WL5sJiXyC$#GZwu-frRN%_bX~>?$x=8h2g&V8{&o@*Az_6y5%gh3+Q1{t z=#L+epJa@;C?BcQpMJnNt}9?Kz3|TKfty@nl+6V}tLj?+<~uk$$S0^*ZtL_TN&JV+ z+&+yXg@zw>wlZNmoD`&1)N-Wte zW7nI9najS2NQt~&=y7a@iZ%TMJG9vi321M$PFfJcX*a<`+1_{vTs{%hjm%; zHMbHu&AZiUJaXX83HoFkM`Qlv5M z-xL9j36SU^Yk_Ttu#7KXk5vZx$@s{yIL=w3|1n>lw#)QNfYNCQ^`Wb{=HP=;u$qgq&5}{KZ*E zr&!&hY^wr|#YpsrzB6F@T}HB&2lQopqN6iujn#2F^4}oU+qQ(7{90*zM?@<}!D51x z^XXxVqxOshwgbM@ukL7Y4NeDVVNqDf6yXFJ1IS*%K2*X&C( zBnr>1?}-4k^V;gtfRPG{8^bnsTJ71N(HMrnUNi$G_?ozck3L?UB!vWhZU14%P#gncAr|Hp?bEsFmxfLuPa7iKwm}t}wyYV5N^A7)!Y!hV+rQM0|hVNlC@j=D92%e z+C_y^&$j>*qbWQUhBg$EPhf$e>5{$73*oqAeXuo6mY!y4;=XQWoe^*g99Wh$RyVl;;bmQPD@dO zSxiS1A~tRw$j*Ow5{lrjPX6t$*?)%lFKFiba$Hk!Tz&@`@f%{7h}L{CxCX>Ef@?rv zXw0yAz%rCN?N3H8d=fDG2srLJDu?Iu3ci+ECnB&mk#Ab@$x(bP18{p%S^CIW<_evx zHJ;w{%)hXI>i?m6{KMvfV<`BldV1sl*>{YL(gXz(RekQWy~-TIV7Z^N)BL0Y?-x!V z%(mXXF$O$r9_VNTNfqSMNem4$iOg0{Q+C06dX3z_9?S6|3CmP?(9lqB3zeAhS%BZ8T>lDdQ795e9X^E%jAziW0r@jrCIdb5lmZ92LMEaaN zepubetU;)-#R1&3dCP|DZoYogdO6cu*4w&|<@vW+oJcrqWc{O5-5jx6ySFYAifpqx zHgD;^YxAv}Zo6wsrUjK(zCgoxuc?;xU(|{#8`pjz`CLm2`ASX&3Y_rtl920QZCj^5 zcvuM4X~eke%{SAmT&1R|r<%g`3{T*+nOI1kg=|<0!WMR>MRlf))H4ZR3(^CT78V-I z>&&hj9KLOI!6JmMtFq3{?8@wi^ep(B?8iUOuDM1-poOYz!2&AH5KqRp*^k#}*Q`&k zQvsOw$u8_10l}TwPsQ)~Mltw{;oX0~P%9C+dPJ-;7TTN(zv+cmN&}odh;a|wgEs;M zmwIWg!;(&!@LR(DWp?@|RZ>z9i7_?m|9cVPX7T~B@hp0jsB9yqIb&2}jxmfWKj6L) zvLxFsB}S&b^eQE!6UOqptc#lk9MqFFm|E1iG%xL1`a#H&`=cIkCZ zxqew~ysw9xbSvPm+^=D@_j?gDliHZ1M=u<<`Hoyk=9vpGy+&J{tZyC(zCT;CM0tSa zJGpgyhpVYny9V?G3Ct>#O5fBTFY1I4OVeU>O#6GXcw`9GrXi3~;7*X1M7vIOv%hpp3G<~*K z_LV&q3KI+m%RJ1U5*Bw?yTxsg!Q~4tFCW$*UDo|~SP+rm`$=OaN0bhGjr#r4i+;R( znR3pYZYb-nM6^SnOz(Z0hHf&=TQ9yTH%x?|UwTqp1hX6zAv+xKke2VO2D0TJJZ~nZw%gMNgaQA04xGgCaiNKb zA9m;A5@1@?e|(I}YvE_gmN_XXn#=`X?!}lq&gC|RK}~Pmc>V2}VtQZNH3#XWxfN$% zv%3_FJz2Hg-1j;}{Hq2R9(g~~`*VFEj$kELZl}zON+&F2B8o4QRvxM^TcHg(1JUK| zB)9N}7B~j}D}5s*_FE+YXG9xycx29Np2GhBNzU&H$Ja@pP$kteQ!fu;!(N`(cGaqS zh_S-eJ?>LO44;1SDB>_nTZGO#fh4BC7u(;Ghry{foc@}qI3K;@A!X-Jy-nk-ScIsR z0Na4HxqPjUG;&0$;1!P7T33h#w1}H@zj?81^B~G!WBv8G6exY5Ag{{0+l*@vFUzNb z3ETu>{QNF)H~_|C-KtpH+3P(%T1Iaj!^Zw|nB4$TVzr@~H?t{KwCqI$@SFM0c4aNC z)fZh?gjBy+U??q+=YU{S_zDG+hOzQ9ag-hC^=IxCOPz?_4&?=OBjbp&pmIO@ddvhT zD`+e5(%1&?>p3clsje4xbW=zcq-FL zrwb%Q%>m5^t}bJ6fE<}deY-<*i$YpSwm|)%G7^9C<5i`;{Sya2xj<0W+> zfiDW9OsiBQBj`r$wxbQ~FsVEcB%jnH>42u&c(w@?ec|j)CFk(msn=!f7*=s=i#BXK zx7I1x+%C#dO{cfqYtKe;m) zZSjt)vqk(XeVzaO{f>4^$!8o!Ga!XiCXOo@_c)B^XOA?GH4+TB4)BhIki+j|2XzI! zxV||S=7Sr^Zxbyu2%U%i#xnXlvsP>mw|p`1OR8JAiJogd{98PH9tD6CKg$bJC9`vx z*5`r~W-??!qum%9Y5W!ffBLXx;XYK*SOES~XHx6S{a!H~nEnnD0+&k<#(uzxN zCKzW6xS+T-D)LhsD2AACx}H*zaNNdmm!@y`ea;>&F3W`)zkB_s7I?D`YfydB1m8ev#{{BLHU1xYz%SX}bAM6?(7m_` zO1ePdm}d)|mL%3q>_o^y0aUh_K3^+}Y^CbT;0E#QVt3vLyc?xXX+}=YlfgisPX)uz zgjjy?=9*p0w-(qeQxVI!zfd1GZW@^+a!gHl0Mmkj_CReyS;_zocY(YCgT1PD=9|)} z?{T>&?8XN#Q$jbj26XAKh<;Z?L6`S~iiJ%>C@zT_XD>W^q!n48Hw~NY6>iyZJ=xqA zZn*e`koWNuS|)3s5V`5(!rGB(zGUj!Lp(G#+{(uUYM?j8_i6=y_GEJxrxVmhGD9tBt=0eS zSk5*=@T#ej9Hfc-RWbU}kDiw0L6qRR-3)SgipoCr!TFQ#U{Jw8Y~|^=&5dy2K7?&3 ztq*GqR{c&-$j=PE@tWBGFPlKj@7bPBjNDHEv2i|oqfbb~I1 zK878qBe)D)_}(F;?cg}6u23Ako!?D{a#7Zbvnp>hr4N&gbv(wNS=_mP8?^QK=vXx% zpHDq z1T^u~m2MRdAAnjF@15<&rZ;OAJmrhKPKJ zAIpO_3K4J3a1ent1uEvvspk+?!WSd}poS z0<2v;gk|@JI@Nn#v%eB2VnCVRK7fS%3BEoO_@eL*9kh(@8o50Kz}H~5?}D!^bfi^T zL2$_AG{i~=piucB$GFVJ^@D@VaOR|Jo+C)>p+;$g%yqQZO=(qS^_m;k+=xYb^^NOR zU+Uyn?~G_>+8UB911=OaK0WpPV>A(!HsH7?nJl)BVJ$D&L~#+Q5Cia0aaAHKgAcG$ z*@^A$`;-xL=acrBbxn)a+3;NN!#x+x#(9eY9z&*@o~ji~=nVxRMo%JS-W`y0Xv4w4 zwFRmo=RmCp2Lrv-Qga`O*9H6lCB@XiaB7w2;%Tfz1Y3Gq|H; zqownJoy0U`-i$Fk2})3xnq<`AcI2zLofac@k>nQBqU0{!&8*{gAX1At%^N$Zk_q3J z2gI+xGWo2y!=`6POu_76wE(SnyUjece?%-3Bk%^q#U(rDieEgFRWuG>`1-+;rf#>{ z?kAbff~nK5!s-W=_{3A+OfVM!2iD*5MB^+hiH#jX+%59IDrRIseT%bD4h9I#>0i~m zws!Nnb+`k7nat;H9oskd;o6|yIp1uYsfruD16Gd}_8Wet_Dkbm+yio~yPsT6R_Ib;RWWNcEt9LVu`*WO?H=wL z9N#BS0D+lQ(s4^o+?$@TMvkJB&BhJ32tM&8gCr{!lxEoY>rUi@etc;8?51EF5 ztD~^Z=_6=hXOBmp=Z%<7JQI|9O?_eiu%jcZhknBMvV;D#?!F?N++h!fN2RJNsL#oN z0qjC$-G*pF#oqHtkqVB=#V3Sgc2_Uh;B(6P;wVB%CGCy%HjI*;bc#1V_UW1o4|x(s zaZPtkWj2uU0Z&Hh!y34~!c75_|2!R(O8gg~E)9&BK@!-$7Y6pdp6^Tg7_kIG6W{nQ zqNmx0t-d4?=cP z=D#A-M>T)IIM8BWcKMD z)U!j6+Xv&JPu#Sdji3B>{^)^rdX1;lJBg;)Ctce6?#;+AJ%=IoOINW=AVSHJ>3GHg z+(k+|@9y9Lo(PYKxQUvoe4l0Jd=&Pbwlzob)os9QEx`~~S0veO02TZ-K-iuQg)eG@ z0Cfbsud2Ya3nN}r=%u(TsT?U?#HDReu$o|r8x#+fip~y?8>*K@(7p$#Pj+_XoJ7`{p5y=2Tq#kXW; zSY9GjuSd!*A|$IjfgBA~IE5^X%o8PZiWK|6#K9lQeYI4}t6dGTk7`kagCktVvMWrs zE7}uBCXd^X&!j7`Wd*9uk>(@YdSu)^G|~Q*%v_~Mc9MvmIO5~ca5QJB&C0(S@L}wU zqiD1>g_|F3X`xnRQM%hvLr17I`9@G1i;EV(f6 zfZXAsF3IQRCRZ@Yw+*5u$I72b51@IWfO-2 zeMx5as$&94#JzS$1AXxAS4)})T8gNI-xW?(_(<6u+8nJiq{>CvF;pa+phJeS0={%nzwPEGR6?PPNN*9elcLg9{|e}EM=BCe0wVyRLw}04LAG#*9Lw)f4KxwpZc>1MNhwgjg}os2y91z(%69-)uD%= zOzlT@O_su? zw{*HN8K7)vXO2<-gMPXm-p04OT!>?iq$jbR&fzZ4_LdqF0|s{+zsW@&+1iR<(lLMK~)(3hAh?4rF; zmwE_<*|TM&Ci#JJD^^es`Z~hfsb&(^V_vv>pwtT$`d(a2@G3GVV*~XK4Y;Fwohgj{ z`(+GMx=oh3<#cY*rTaF-O)ZzWrt#WsqK|!#ZX#>e_TGH+%9~cNUHv|U=U(bfq}w^n zm`RCl-#fVl(*S@O0GW-~%a{{L18&vA`|wuaIYYMn^c&m8AAvURPhY_Qhgo{>VNQ}3 zS$b!J!$2vj#bNn&Hfz{N;ppPF02-=`P1M=RR0xTzDjRVI{5DQuUVOKlSw&^pahI85 zRy!NHp-wuMgQlz z)vi>yfmVKeL+OAV=n(iID+3Q{&X0#!+v6yNrU<)L-W1a{mLzlihik8Qw3S1l+Mrr` z+3MS55DUO6zQvFhHQ#;}{?@(0uVcHM6o2&Bk~aVYwgFx=xT5k6EOT}sHlGr2GRUvD zMNk!?kBEC%0tn!xqkSF0NpKA3kUCS|7%E7tPr|&PBw0mm2RR&TSfSqcu$+?2NdV`*6DKE69B)NOYcxhjZ69_3 z4XDTYrHY$?AvwarG+M{}tV)C@i_P9dPcB(}ZUVumjNNo`Ut|D6yQ-M<|4$I|g50a3MEQ5N%vc~AfK@+JAs*Aade4bl6 zJmfG{uyi;*z=CpRbe~+!2peFz3gHcYoxVe~%9 z`E=qtyyQB!Z0BGpF)hW;TqYVxZm1NH(}^8~*2 z)1j47=tGC4pOok6=0womg6*aE9Lltx31CIYPbUi+EXw@W+fDhSIx+dmnmy8Kfo!3q zFzgg$DK;TLf~vSWbgX6fhhw*-0P8bZLe9g^3s6rfB1BYmcyqx6vg<$cq71buWQs9+ z98n)drR4iq=Piz&lkv^iO+TLS=(up^GztYnbkjJ516Q7|7@P+Ik)qG6PZ$@tnVZ;* zg=2JIDV|y$JyTLT-EW(f5C9cR>?NpMkIaz0)gGA&k|suj#~7a_o`}cbuFcJsD+JxJ zCw|zF1idQ%l*BpBT+!O#mmRB)HC*&;b~`H;0Lj7u^+W}ClVB^jM0iDC$)_Dv&98pf4MtY5>xW!m*Zg$_~ zj@Q44mQbb_QdEdlDY~*8-oZN)3N@U_Nm{e9%RJTZ6K$ec0tEhW5Gr8$99E^JTL~zecQJgHvC$*ARI*39L1rhBwZI!T5I=AU$dP_z5gXf>2%GnK z{sbiB5P_>sAf)KxB;zbtMd=S4_Krd^K2b#iESinKloO7`JZRp04l{L|3~#Z8m?WuC z;p8%j9(l+oc@6;7*ez?|IvDZ0nQzY{A5l9$0jcJj>Q zWEl}Fj^mO`y9>|JbX>BQYqhpC6(TgA>95oiN=As3Fo}zyCJei`G13@;`oInS70ndF z%f{Vp_Yk^3=kjglhfK+ZRbkTMNgsMS-S5Fn8 z4_Fjy7lRCB$-WQx4{Vh=(<_pc6KLX5@Zv>C5+jT800L-r)facqw8I*45MxlxSK%@S z2^rt0oTA7-gvgU^P)6T-FGc{28fUKu2VgXKFN3HSwVP@8Q|xW9C>@taD=8AsLL?bG zU`ts)H%&?aE2h5s+~gyV8p>RNVYHC7*g#uhQ5u$d(M%EmsoBL8t96QCj0W{07zRVw zlGm@Ed|7{h(;BhVU}=-`^V7*>Swu?36`=8eq;lsNK$en_3OcMkHt~wyvf$p9__oBc z$%Tn>Ez8OiGF4rpwv)9L4NBsoEQvTGfy8EGAWt1%lz8|G3%p*FLPaMSg>Laq+$)%= z8Bz#RsaTw)g5I?tV=zyKy@8hV6w-5F8afQ75^`0L*O+gqQcPFjKvEv35*0IsMa@eBF3fChzua%+ z458_)O=+h7C$M!hKQe1hJ#uvN^WS29uv4KSClC|iQaY~o!JJ~67ETzY##Xax<2)|n zlTX&rqopNAbP_$pY!C-V^0AjWRfDs&7Qt5%#EvBCzIN3HYa=qDanMj-B}VZ+0}AY{ zp{N-2q$*AyT7kan%A*`jPPv7tEx`T{Xr`{^rM1*$mCJ**{Yb|5UZm#htwHl5R&Xdc zS;C*~7%ZVcY3v9jlB&(NxvNInv$kzbQe~!TuB5J_h_aSd2ZpE-$2(kH!y{3g!Ye)) zC7p>#jo>JbZm~kDx*MmPGN2>1njCVN$coP)D+1RJo_eSp1THeFPcK+sE7=9{)f*Yd zjfAKI#7a@n{u`~bJYpr;eE#$qT&%!OV?v1K6Vd9pc<3Oa<{K-6PiKCHm@y#+M@&vH zhE0ycE2x@{oism*CgGc3@yn$lRyQy-R~ZRdX<$!!R|s0Mc8X>vgYT23LlW$6qj32= zaj=UK6Knf{&B0fsi=0VCKDB&l1R!Ee2RWwkXJyb~c5t(IDPyoF4}ZZMn*l%ReGxXL zBUt=A&w-L=qhdp@lPBgcNT%_Dfz;{eo^Ie{1d6-cj*|Wb4vNjjI3)kL|6b=EqXj~- zq3S(&dciz;%qbq$KTQXl4n+Y{r6xWmc#61^lv8@L)7!iqvI22y5heqkpCPOW3>z{5 z??Kb*WnziYSDuM2h!MAaoqfum+yF26{DsgJ@uJ)-!&{5-`fMw0SG ztmE8q5Ri|M`5E9>B#M3se4k|7Q@t)1H)?er%VRmsN(B z>xGGu#NHQi!@O=2%rGn~-C7xjuz)Q1mEjL8FWo9se;_3zeAO74bv(S3kvB5-;`cIv zR)7*P#K(nrwRMk-td?Qznh_lyl@bxl$AE;x#E2xr(E+Ku0v!^ZcHr+bvWsNtwykPJ znl*h@cs-Y{s|>$qnxTjg6@3=5H5nE612i5%Lrcu^dWLvCV8!|lWp`Z#aMf}Rc~>Pn z3lzM1Z}c9rKGz&DAN68nJ`u?^XS0RsL-SJEH(GK+c{=mkU{X>_Wt^9)d*M-~cf9Qz zLNXZ`9qW}okxW&%X>d1`L>sCUvBl7NO3M2DrE@IAvW#2L#R==kbK(TUS2}GjoI8%i z0p`2)cigQ4^%IBFZ#4}qO7ZLuVaHTIU)(=JwAdV-*|1Z^M;%)8fL>3DL=slKb`bf( zLld<@B}C)^D9)~oXM_Q+LGkQ?iN-3M$xOzAM`~l28Ipu^^dvN;Ag#LVcEebP@k5x6tKWR(cA~Gke*yd8#u$C zl&p@=yad08+u-&oX?|Y%JWM4(mkfFfqim#~T%VZb$m0T@rZ0;w0qaBzdWTvNN~K7Y#(QHV;Z zxN>~BFUoK2$<&Vj#U#=jA;6b86x_$aLQ&d=!P%oNMmMU>_3QnEQvgu~{#@wvS0ck&jvcQzGD-v#V zmEb-UGk1(gR+hl%7thcRg;EeLqOKeV9$7V&hjEgk&OavLO%3-Ci&`?gKExpzknoip zHl^Z9TTRrOYO0^X$}n?5a!^Z~_y_tq(5|+s@Q8ph0 ziWCCfqG=KcdTo5{aH$h!2K=3^ffM#^G3<*z(li?j5qOxzA$jt!4kHUgwp=beoOtqc z34 z3_Ek08MQ5u(o?VcR83QV^@hk~yz2|$icXgydxnp4fwM(tj1$_!X5%_@6H?f`tIP1B zEjD$?qws5xRAzRp_MrvPX$~KNJ$kdKGqbnAiMXcLJxd0po=oOtr5Vq-v*RQ$1X^dU zcc8LM0Q>kE3kSJ{vKB1=8VFKMjb>?4%si>Pymv^ z$QT|PmCI*fw)U$LKEAzaHs%P3y9bf@9za$Z5KTCA{c7<7by@pf!7abI+R&EL7{XkE zV7pJVv6=(Vkud2dpX;&!$UFfeizH*4mSyh zk*)`xUSl=E4jb=!(d^$KOM+zVA|z%6grFoEeofQ|F92lPG{8C$)>c>dVJhI_?lmiK zTEmIZr3(ryDMKT`Vo8Cne36DZ<}GQEq2KAg*nuAic`IF zam9~InL`cnzy-sxyH%F7l^2^O4QXTw;1?t;Ywno!*0Q1f9+_YG*Zpgq_DpKL_1W>R zg5i?$xt%>}{i8jC&HzCa zQQHNug}^~eLttJk6B!cSOVipyvTyg-rSkkLFL#ls;k$*#w0$AwPUwAZeSwwtRE%FAN}y$a;6dR{{q(^!AZ%o)HhYMllx@ZDg5l>ur5lyNmmc`+L;FIfb5+PH8hocVk~C?9Xkqo2(~Jfc0-T(;+*{$SRuJ>U5_{!D!Y zf1cYmYu3{Zq|0>~E|LR(91!dejgCaXc#ONB+}h zrV{+T#9X#8s#LXxT~QhGt%(h}*;o`6mZ91f*RL{CiD!!+7CU^lvbM+Jw!c}^o(r{? zL9XkO6lu-IeEBJc1LHD%)i=HmxADx8SCwkDHVi`fpz$04^v%a+%>tl3zj*#_v-bQ_ z{`^Y*{969}2maLd{BYVD@&$yLxf_T2#s_Lf&jNdjNOBdFsu)M*{Q_anytfn3e2m2w zT>|7kJAGDF9X;C zitZTi>pS2e3Qa5^$WS4IseHp)jvaC&Hv*h}l@TQ96Si_Kz-PFK69=zc85kq3SneMv z508%`FS_tD8*7QH3>;V!7ZB!I%YsK;sA8N+zt1Y1SNBihF$(@thA_Td^C5)j&n zBODeXnMdridzRJqgH?6E7^k^Gwcn>sXCSBLIN>3S= z&JN1*aBcf~70&X;HSMcm2f;bBeVyn!BIFTiUsu<|Y2l%kUI&D3OapIN828=naq4yi zvA2D#av3Ofxt+G+AQTT6;#y<2g2dP1r&;J9!)I6!%G{984@Ek>i^FqfD5H8hY?*q| z5JmNLI64D7>v~rx3Ej*Tx-RYcwp*~7q}?sp_7pGJR+KE*zc2`YjI3$9W)?Eup(A=&iKcjY+$#c^1&#d7bW@#hFPCi79?RC<;Va?}KzH|MxrwD+nkU$V| zLnxmu8b)ics@|A(zSOquw%mUg)ft~|7&gM+*hfOx)0UK zhp4r^PMZJe4qLajjT|t{^W|sM^fGx)8t%1*b1{qvcX8jso}%WiLIUBKgYaQZ|Lh>x zQw+h15(sAv!u(C9Dliyb{yBmYDkX4!WpHM1sf>;qj1K)Bwdc#E?Qg8@oI51#v^DPJ zL)6+{C(ZxQbzuXNA=L-R-52cg&k>OMzA%9^|9+bqxZMT!e7M21rwGPeD@q{r7=%t% z5FNWgSrnB-km8C7v{8dLhZ!|(TjN6n!(Qi`?_Q-l(k2|f-RIEXQOns{kZ-uBzLDb~ zLk016(2azQC!Zr2p;7|p?+nfywGH{tS|8jz9M27Voiu;@CXzAF(xn-Ih3+vT!dFRv ztad;)@D5!E#68A9Tv-BSzX6#oCQ3J$`a5dQmr2{dwYGEb&@98&dVxJf?OlZg!fzae zd-YCg2f?0V2v(FpxN0*;a?aiT*d7f)Cm*8r_Bv_4)0)q|vtD()(4oJh#(bHyeZtya zwzcM(&X=E2OMR6z{GK(Oe=m+h@@0(dF8>^X2$d2z|7mdM0c!+ip?i#=_$mpIgm7MdY$Xe4}(C7H4aUbb=q^HGC2XZ`+4-HmZ4A0jCBI%$5& zHNU@J8|ZVq!H2jxOOod2ta*pNj~2Y{P!NHMswJR)ZJ@d#<0C+9tk$<(l7<;cm*+|& zp!o&~OmKmKkQf>d@a&bG}U4UVERdFx$q5 zy^61s4^itmEJ>Pgcg?pB)T{1`ck&@_&XT10m#uk+>}P#)0&pKC6hvU6Y6+-+G*ELl z4{sXkbEGV=rwE9vkU;n;w9c~gcHQ-`XjJLw;|N-sEsWshswZIQ+-*DzYx1~cS9C&F zcPNO!b%fFc)UbiN40UXv=F88hxxPvop0Hzo;S{+vTNpvi zRZqaa?H>C~DyD6K;l#0GD2Tvygwh1mDg)K2b>g*fQB)EEiz_D3K4#Fmwe42D>vPN> zn=j9mMo{w&63D{_xr;DrpBk?X`boSrTNuI3RZqZv!N4w52pgf70L?a-OEP5<&}`)d z=Fc)iswZcI$RTA(1dl_?;so0Ad*g2{Yi;IRYe58y-&#u(P#X=@Jnh(eH!av5JVs!A zl?2FVGe9;wY6t|62@sSeKz{Ns(y2Y0sG7e1S$+B>|9g%99ehp;U*muO&Hr{E)516S z-!JvQ1~s1u4aumlFCP#McT^e_QA?9oP9L=>d82BntCHf3{xoehD%$L#R(RobT4^g) iSuII$nda(> BOOL | t.State: pass - -def CreateProcessW(lpApplicationName: LPCWSTR, lpCommandLine: WCHARPTR, lpProcessAttributes: SECURITY_ATTRIBUTES | t.CPtr, lpThreadAttributes: SECURITY_ATTRIBUTES | t.CPtr, bInheritHandles: BOOL, dwCreationFlags: ULONG, lpEnvironment: VOIDPTR, lpCurrentDirectory: LPCWSTR, lpStartupInfo: STARTUPINFOW | t.CPtr, lpProcessInformation: PROCESS_INFORMATION | t.CPtr) -> BOOL | t.State: pass - -def TerminateProcess(hProcess: HANDLE, uExitCode: UINT) -> BOOL | t.State: pass - -def GetExitCodeProcess(hProcess: HANDLE, lpExitCode: ULONG | t.CPtr) -> BOOL | t.State: pass - -def GetExitCodeThread(hThread: HANDLE, lpExitCode: ULONG | t.CPtr) -> BOOL | t.State: pass - -def OpenProcess(dwDesiredAccess: ULONG, bInheritHandle: BOOL, dwProcessId: ULONG) -> HANDLE | t.State: pass - -def GetCurrentProcess() -> HANDLE | t.State: pass - -def GetCurrentProcessId() -> ULONG | t.State: pass - -def CreateThread(lpThreadAttributes: SECURITY_ATTRIBUTES | t.CPtr, dwStackSize: t.CSizeT, lpStartAddress: VOIDPTR, lpParameter: VOIDPTR, dwCreationFlags: ULONG, lpThreadId: ULONG | t.CPtr) -> HANDLE | t.State: pass - -def OpenThread(dwDesiredAccess: ULONG, bInheritHandle: BOOL, dwThreadId: ULONG) -> HANDLE | t.State: pass - -def SuspendThread(hThread: HANDLE) -> ULONG | t.State: pass - -def ResumeThread(hThread: HANDLE) -> ULONG | t.State: pass - -def TerminateThread(hThread: HANDLE, dwExitCode: ULONG) -> BOOL | t.State: pass - -def GetCurrentThread() -> HANDLE | t.State: pass - -def GetCurrentThreadId() -> ULONG | t.State: pass - -def GetThreadId(hThread: HANDLE) -> ULONG | t.State: pass - -def GetProcessId(hProcess: HANDLE) -> ULONG | t.State: pass - -def SetThreadPriority(hThread: HANDLE, nPriority: INT) -> BOOL | t.State: pass - -def GetThreadPriority(hThread: HANDLE) -> INT | t.State: pass - -def ExitProcess(uExitCode: UINT) -> VOID | t.State: pass - -def ExitThread(dwExitCode: ULONG) -> VOID | t.State: pass - -def TlsAlloc() -> ULONG | t.State: pass - -def TlsFree(dwTlsIndex: ULONG) -> BOOL | t.State: pass - -def TlsGetValue(dwTlsIndex: ULONG) -> VOIDPTR | t.State: pass - -def TlsSetValue(dwTlsIndex: ULONG, lpTlsValue: VOIDPTR) -> BOOL | t.State: pass diff --git a/Test/AstTest/temp/06f53cc594b4ac6c.vpi b/Test/AstTest/temp/06f53cc594b4ac6c.vpi deleted file mode 100644 index ac278f4..0000000 --- a/Test/AstTest/temp/06f53cc594b4ac6c.vpi +++ /dev/null @@ -1,109 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32sync.vp -Module: w32.win32sync -""" - -import c - - -import t -from stdint import * -from w32.win32base import * - -class CRITICAL_SECTION: - DebugInfo: VOIDPTR - LockCount: LONG - RecursionCount: LONG - OwningThread: HANDLE - LockSemaphore: HANDLE - SpinCount: QWORD - -def InitializeCriticalSection(lpCriticalSection: CRITICAL_SECTION | t.CPtr) -> VOID | t.State: pass - -def EnterCriticalSection(lpCriticalSection: CRITICAL_SECTION | t.CPtr) -> VOID | t.State: pass - -def LeaveCriticalSection(lpCriticalSection: CRITICAL_SECTION | t.CPtr) -> VOID | t.State: pass - -def DeleteCriticalSection(lpCriticalSection: CRITICAL_SECTION | t.CPtr) -> VOID | t.State: pass - -def TryEnterCriticalSection(lpCriticalSection: CRITICAL_SECTION | t.CPtr) -> BOOL | t.State: pass - -def SetCriticalSectionSpinCount(lpCriticalSection: CRITICAL_SECTION | t.CPtr, dwSpinCount: ULONG) -> ULONG | t.State: pass - -def InitializeCriticalSectionAndSpinCount(lpCriticalSection: CRITICAL_SECTION | t.CPtr, dwSpinCount: ULONG) -> BOOL | t.State: pass - -def CreateMutexA(lpMutexAttributes: SECURITY_ATTRIBUTES | t.CPtr, bInitialOwner: BOOL, lpName: LPCSTR) -> HANDLE | t.State: pass - -def CreateMutexW(lpMutexAttributes: SECURITY_ATTRIBUTES | t.CPtr, bInitialOwner: BOOL, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def OpenMutexA(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE | t.State: pass - -def OpenMutexW(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def ReleaseMutex(hMutex: HANDLE) -> BOOL | t.State: pass - -def CreateEventA(lpEventAttributes: SECURITY_ATTRIBUTES | t.CPtr, bManualReset: BOOL, bInitialState: BOOL, lpName: LPCSTR) -> HANDLE | t.State: pass - -def CreateEventW(lpEventAttributes: SECURITY_ATTRIBUTES | t.CPtr, bManualReset: BOOL, bInitialState: BOOL, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def OpenEventA(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE | t.State: pass - -def OpenEventW(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def SetEvent(hEvent: HANDLE) -> BOOL | t.State: pass - -def ResetEvent(hEvent: HANDLE) -> BOOL | t.State: pass - -def PulseEvent(hEvent: HANDLE) -> BOOL | t.State: pass - -def CreateSemaphoreA(lpSemaphoreAttributes: SECURITY_ATTRIBUTES | t.CPtr, lInitialCount: LONG, lMaximumCount: LONG, lpName: LPCSTR) -> HANDLE | t.State: pass - -def CreateSemaphoreW(lpSemaphoreAttributes: SECURITY_ATTRIBUTES | t.CPtr, lInitialCount: LONG, lMaximumCount: LONG, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def OpenSemaphoreA(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCSTR) -> HANDLE | t.State: pass - -def OpenSemaphoreW(dwDesiredAccess: ULONG, bInheritHandle: BOOL, lpName: LPCWSTR) -> HANDLE | t.State: pass - -def ReleaseSemaphore(hSemaphore: HANDLE, lReleaseCount: LONG, lpPreviousCount: LONG | t.CPtr) -> BOOL | t.State: pass - -def WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: ULONG) -> ULONG | t.State: pass - -def WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG | t.State: pass - -def WaitForMultipleObjects(nCount: ULONG, lpHandles: VOIDPTR, bWaitAll: BOOL, dwMilliseconds: ULONG) -> ULONG | t.State: pass - -def WaitForMultipleObjectsEx(nCount: ULONG, lpHandles: VOIDPTR, bWaitAll: BOOL, dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG | t.State: pass - -def InitializeSRWLock(SRWLock: VOIDPTR) -> VOID | t.State: pass - -def AcquireSRWLockExclusive(SRWLock: VOIDPTR) -> VOID | t.State: pass - -def AcquireSRWLockShared(SRWLock: VOIDPTR) -> VOID | t.State: pass - -def ReleaseSRWLockExclusive(SRWLock: VOIDPTR) -> VOID | t.State: pass - -def ReleaseSRWLockShared(SRWLock: VOIDPTR) -> VOID | t.State: pass - - -CONDITION_VARIABLE_LOCKMODE_SHARED: t.CDefine = 0x1 - -def InitializeConditionVariable(ConditionVariable: VOIDPTR) -> VOID | t.State: pass - -def SleepConditionVariableCS(ConditionVariable: VOIDPTR, CriticalSection: CRITICAL_SECTION | t.CPtr, dwMilliseconds: ULONG) -> BOOL | t.State: pass - -def SleepConditionVariableSRW(ConditionVariable: VOIDPTR, SRWLock: VOIDPTR, dwMilliseconds: ULONG, Flags: ULONG) -> BOOL | t.State: pass - -def WakeConditionVariable(ConditionVariable: VOIDPTR) -> VOID | t.State: pass - -def WakeAllConditionVariable(ConditionVariable: VOIDPTR) -> VOID | t.State: pass - - -INIT_ONCE_STATIC_INIT: t.CDefine = 0x00000001 -INIT_ONCE_CHECK_ONLY: t.CDefine = 0x00000002 -INIT_ONCE_ASYNC: t.CDefine = 0x00000004 -INIT_ONCE_INIT_FAILED: t.CDefine = 0x00000008 - -class INIT_ONCE: - Ptr: t.CPtr - -def InitOnceExecuteOnce(InitOnce: INIT_ONCE | t.CPtr, InitFn: VOIDPTR, Parameter: VOIDPTR, Context: VOIDPTR | t.CPtr) -> BOOL | t.State: pass diff --git a/Test/AstTest/temp/0c67644125bea0fd.stub.ll.dep b/Test/AstTest/temp/0c67644125bea0fd.stub.ll.dep deleted file mode 100644 index d73af0b..0000000 --- a/Test/AstTest/temp/0c67644125bea0fd.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -067c78e9f121dce3|2408ce147bac090b|285b6aa29a34754d|28de517e3820658a|2c175afd85852faf|4c39369ffedaddac|6c658cc728d0bbf4|aa246c6e6aa30484|b57252077e6b596b|f5522571bcce7bcb|fc980acec33d69a7 \ No newline at end of file diff --git a/Test/AstTest/temp/0c67644125bea0fd.vpi b/Test/AstTest/temp/0c67644125bea0fd.vpi deleted file mode 100644 index 1e4e515..0000000 --- a/Test/AstTest/temp/0c67644125bea0fd.vpi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from sys.vp -Module: sys -""" - - -import t, c -from stdint import * -import platmacro -import memhub -import string -import stdio -import w32.win32base -import w32.win32process -import posix - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def fgets(buf: bytes, size: int, stream: t.CVoid | t.CPtr) -> str | t.State: pass - -def fflush(stream: t.CVoid | t.CPtr) -> int | t.State: pass - -def exit(status: int) -> t.State: pass - - -maxsize: t.CDefine = 9223372036854775807 # 2^63 - 1 - -def platform() -> str: pass - -def get_pid() -> int: pass - - -_argc: t.CExtern | int -_argv: t.CExtern | str | t.CPtr - -def _init_argv() -> t.CInt: pass - -def _init_argv_win32() -> t.CInt: pass - -def _init_argv_posix() -> t.CInt: pass - -def argc() -> int: pass - -def argv(index: int) -> str: pass diff --git a/Test/AstTest/temp/285b6aa29a34754d.stub.ll.dep b/Test/AstTest/temp/285b6aa29a34754d.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/AstTest/temp/285b6aa29a34754d.vpi b/Test/AstTest/temp/285b6aa29a34754d.vpi deleted file mode 100644 index acc57c7..0000000 --- a/Test/AstTest/temp/285b6aa29a34754d.vpi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from stdio.vp -Module: stdio -""" - - -import t, c - -def printf(fmt: t.CConst | str, *args) -> int | t.State: pass - -def fprintf(stream: bytes, fmt: t.CConst | str, *args) -> int | t.State: pass - -def sprintf(buf: bytes, fmt: t.CConst | str, *args) -> int | t.State: pass - -def snprintf(buf: bytes, size: t.CSizeT, fmt: t.CConst | str, *args) -> int | t.State: pass - -def puts(s: t.CConst | str) -> int | t.State: pass - -def fputs(s: t.CConst | str, stream: bytes) -> int | t.State: pass - -def fgets(buf: bytes, size: int, stream: bytes) -> bytes | t.State: pass - -def fflush(stream: bytes) -> int | t.State: pass diff --git a/Test/AstTest/temp/28de517e3820658a.stub.ll.dep b/Test/AstTest/temp/28de517e3820658a.stub.ll.dep deleted file mode 100644 index 793e7ed..0000000 --- a/Test/AstTest/temp/28de517e3820658a.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb \ No newline at end of file diff --git a/Test/AstTest/temp/28de517e3820658a.vpi b/Test/AstTest/temp/28de517e3820658a.vpi deleted file mode 100644 index d10e843..0000000 --- a/Test/AstTest/temp/28de517e3820658a.vpi +++ /dev/null @@ -1,189 +0,0 @@ -""" -Auto-generated Python stub file from posix.vp -Module: posix -""" - - -import t, c -from stdint import * - -DIR: t.CTypedef = t.CVoid | t.CPtr -mode_t: t.CTypedef = t.CUInt32T -pid_t: t.CTypedef = t.CInt32T -off_t: t.CTypedef = t.CInt64T -dev_t: t.CTypedef = t.CUInt64T -ino_t: t.CTypedef = t.CUInt64T -nlink_t: t.CTypedef = t.CUInt64T -uid_t: t.CTypedef = t.CUInt32T -gid_t: t.CTypedef = t.CUInt32T -blksize_t: t.CTypedef = t.CInt64T -blkcnt_t: t.CTypedef = t.CInt64T -time_t: t.CTypedef = t.CInt64T -O_RDONLY: t.CDefine = 0 -O_WRONLY: t.CDefine = 1 -O_RDWR: t.CDefine = 2 -O_CREAT: t.CDefine = 0o100 -O_EXCL: t.CDefine = 0o200 -O_TRUNC: t.CDefine = 0o1000 -O_APPEND: t.CDefine = 0o2000 -O_NONBLOCK: t.CDefine = 0o4000 -O_CLOEXEC: t.CDefine = 0o2000000 -F_OK: t.CDefine = 0 # File exists -R_OK: t.CDefine = 4 # Read permission -W_OK: t.CDefine = 2 # Write permission -X_OK: t.CDefine = 1 # Execute permission -S_IFMT: t.CDefine = 0o170000 # Type mask bits -S_IFSOCK: t.CDefine = 0o140000 # Socket -S_IFLNK: t.CDefine = 0o120000 # Symbolic link -S_IFREG: t.CDefine = 0o100000 # Regular file -S_IFBLK: t.CDefine = 0o060000 # Block device -S_IFDIR: t.CDefine = 0o040000 # Directory -S_IFCHR: t.CDefine = 0o020000 # Character device -S_IFIFO: t.CDefine = 0o010000 # FIFO/pipe -S_ISUID: t.CDefine = 0o4000 # Set-user-ID -S_ISGID: t.CDefine = 0o2000 # Set-group-ID -S_ISVTX: t.CDefine = 0o1000 # Sticky bit -S_IRWXU: t.CDefine = 0o700 # Read/write/execute permission -S_IRUSR: t.CDefine = 0o400 # User read permission -S_IWUSR: t.CDefine = 0o200 # User write permission -S_IXUSR: t.CDefine = 0o100 # User execute permission -S_IRWXG: t.CDefine = 0o070 # Read/write/execute permission -S_IRGRP: t.CDefine = 0o040 # Read permission -S_IWGRP: t.CDefine = 0o020 # Write -S_IXGRP: t.CDefine = 0o010 # Execute -S_IRWXO: t.CDefine = 0o007 # Read/write/execute permission -S_IROTH: t.CDefine = 0o004 # Other read permission -S_IWOTH: t.CDefine = 0o002 # Other write permission -S_IXOTH: t.CDefine = 0o001 # Other execute permission -SEEK_SET: t.CDefine = 0 -SEEK_CUR: t.CDefine = 1 -SEEK_END: t.CDefine = 2 -PATH_MAX: t.CDefine = 4096 -NAME_MAX: t.CDefine = 255 -_SC_NPROCESSORS_ONLN: t.CDefine = 84 -_SC_PAGESIZE: t.CDefine = 30 -_SC_CLK_TCK: t.CDefine = 2 -DT_UNKNOWN: t.CDefine = 0 -DT_FIFO: t.CDefine = 1 -DT_CHR: t.CDefine = 2 -DT_DIR: t.CDefine = 4 -DT_BLK: t.CDefine = 6 -DT_REG: t.CDefine = 8 -DT_LNK: t.CDefine = 10 -DT_SOCK: t.CDefine = 12 -DT_WHT: t.CDefine = 14 -WNOHANG: t.CDefine = 1 -WUNTRACED: t.CDefine = 2 -WCONTINUED: t.CDefine = 8 - -class Stat: - st_dev: dev_t - st_ino: ino_t - st_nlink: nlink_t - st_mode: mode_t - st_uid: uid_t - st_gid: gid_t - __pad0: INT - st_rdev: dev_t - st_size: off_t - st_blksize: blksize_t - st_blocks: blkcnt_t - st_atim_sec: time_t - st_atim_nsec: LONGLONG - st_mtim_sec: time_t - st_mtim_nsec: LONGLONG - st_ctim_sec: time_t - st_ctim_nsec: LONGLONG - __unused0: LONGLONG - __unused1: LONGLONG - __unused2: LONGLONG -class Dirent: - d_ino: ino_t - d_off: off_t - d_reclen: USHORT - d_type: BYTE - d_name: CHARPTR - -def open(path: t.CConst | str, oflag: INT, *args) -> INT | t.State: pass - -def close(fd: INT) -> INT | t.State: pass - -def read(fd: INT, buf: bytes, count: t.CSizeT) -> ssize_t | t.State: pass - -def write(fd: INT, buf: t.CConst | bytes, count: t.CSizeT) -> ssize_t | t.State: pass - -def lseek(fd: INT, offset: off_t, whence: INT) -> off_t | t.State: pass - -def unlink(path: t.CConst | str) -> INT | t.State: pass - -def access(path: t.CConst | str, amode: INT) -> INT | t.State: pass - -def realpath(path: t.CConst | str, resolved: CHARPTR) -> CHARPTR | t.State: pass - -def rename(oldpath: t.CConst | str, newpath: t.CConst | str) -> INT | t.State: pass - -def chmod(path: t.CConst | str, mode: mode_t) -> INT | t.State: pass - -def stat(path: t.CConst | str, buf: Stat | t.CPtr) -> INT | t.State: pass - -def fstat(fd: INT, buf: Stat | t.CPtr) -> INT | t.State: pass - -def opendir(name: t.CConst | str) -> DIR | t.CPtr | t.State: pass - -def readdir(dirp: DIR | t.CPtr) -> Dirent | t.CPtr | t.State: pass - -def closedir(dirp: DIR | t.CPtr) -> INT | t.State: pass - -def mkdir(path: t.CConst | str, mode: mode_t) -> INT | t.State: pass - -def rmdir(path: t.CConst | str) -> INT | t.State: pass - -def getcwd(buf: CHARPTR, size: t.CSizeT) -> CHARPTR | t.State: pass - -def chdir(path: t.CConst | str) -> INT | t.State: pass - -def fork() -> pid_t | t.State: pass - -def execvp(file: t.CConst | str, argv: CHARPTR | t.CPtr) -> INT | t.State: pass - -def execv(path: t.CConst | str, argv: CHARPTR | t.CPtr) -> INT | t.State: pass - -def waitpid(pid: pid_t, status: INT | t.CPtr, options: INT) -> pid_t | t.State: pass - -def pipe(fds: INT | t.CPtr) -> INT | t.State: pass - -def dup2(oldfd: INT, newfd: INT) -> INT | t.State: pass - -def _exit(status: INT) -> t.CVoid | t.State: pass - -def getpid() -> pid_t | t.State: pass - -def getenv(name: t.CConst | str) -> CHARPTR | t.State: pass - -def setenv(name: t.CConst | str, value: t.CConst | str, overwrite: INT) -> INT | t.State: pass - -def sysconf(name: INT) -> LONG | t.State: pass - -def isatty(fd: INT) -> INT | t.State: pass - -def S_ISREG(mode: mode_t) -> bool: pass - -def S_ISDIR(mode: mode_t) -> bool: pass - -def S_ISLNK(mode: mode_t) -> bool: pass - -def S_ISCHR(mode: mode_t) -> bool: pass - -def S_ISBLK(mode: mode_t) -> bool: pass - -def S_ISFIFO(mode: mode_t) -> bool: pass - -def S_ISSOCK(mode: mode_t) -> bool: pass - -def WIFEXITED(status: INT) -> bool: pass - -def WEXITSTATUS(status: INT) -> INT: pass - -def WIFSIGNALED(status: INT) -> bool: pass - -def WTERMSIG(status: INT) -> INT: pass diff --git a/Test/AstTest/temp/6446627d4f07a1b5.vpi b/Test/AstTest/temp/6446627d4f07a1b5.vpi deleted file mode 100644 index 55f6a1f..0000000 --- a/Test/AstTest/temp/6446627d4f07a1b5.vpi +++ /dev/null @@ -1,86 +0,0 @@ -""" -Auto-generated Python stub file from w32.winsock2.vp -Module: w32.winsock2 -""" - - -import t, c -from stdint import * -from w32.win32base import * - -WINSOCK_VERSION: t.CDefine = 0x0202 # 2.2 -AF_INET: t.CDefine = 2 -AF_INET6: t.CDefine = 23 -SOCK_STREAM: t.CDefine = 1 # TCP -SOCK_DGRAM: t.CDefine = 2 # UDP -SOCK_RAW: t.CDefine = 3 # 原始套接字 -IPPROTO_TCP: t.CDefine = 6 -IPPROTO_UDP: t.CDefine = 17 -SOL_SOCKET: t.CDefine = 0xFFFF # WinSock2 值 -SO_RCVTIMEO: t.CDefine = 0x1006 # WinSock2 值 -SO_SNDTIMEO: t.CDefine = 0x1005 # WinSock2 值 -SO_REUSEADDR: t.CDefine = 0x0004 # WinSock2 值 -INADDR_ANY: t.CDefine = 0 -SOCKET_ERROR: t.CDefine = -1 -INVALID_SOCKET: t.CDefine = 0xFFFFFFFF # WinSock2: ~0 -MSG_NOSIGNAL: t.CDefine = 0 # Windows 不支持,设为 0 -SD_SEND: t.CDefine = 1 -SD_RECV: t.CDefine = 0 -SD_BOTH: t.CDefine = 2 - -class WSASocketAddr: - family: u16 - port: u16 - addr: u32 - zero: u64 -class WSAData: - wVersion: WORD - wHighVersion: WORD - szDescription: BYTE - szSystemStatus: BYTE - iMaxSockets: u16 - iMaxUdpDg: u16 - lpVendorInfo: CHARPTR -class WSAHostEnt: - h_name: CHARPTR - h_aliases: CHARPTR - h_addrtype: SHORT - h_length: SHORT - h_addr_list: CHARPTR -class WinTimeVal: - tv_sec: LONG - tv_usec: LONG - -def WSAStartup(wVersionRequested: WORD, lpWSAData: WSAData | t.CPtr) -> INT | t.State: pass - -def WSACleanup() -> INT | t.State: pass - -def WSAGetLastError() -> INT | t.State: pass - -def socket(family: INT, type: INT, protocol: INT) -> u64 | t.State: pass - -def closesocket(s: u64) -> INT | t.State: pass - -def connect(s: u64, name: WSASocketAddr | t.CPtr, namelen: INT) -> INT | t.State: pass - -def send(s: u64, buf: t.CVoid | t.CPtr, len: INT, flags: INT) -> INT | t.State: pass - -def recv(s: u64, buf: t.CVoid | t.CPtr, len: INT, flags: INT) -> INT | t.State: pass - -def bind(s: u64, name: WSASocketAddr | t.CPtr, namelen: INT) -> INT | t.State: pass - -def listen(s: u64, backlog: INT) -> INT | t.State: pass - -def accept(s: u64, addr: WSASocketAddr | t.CPtr, addrlen: INT | t.CPtr) -> u64 | t.State: pass - -def setsockopt(s: u64, level: INT, optname: INT, optval: t.CVoid | t.CPtr, optlen: INT) -> INT | t.State: pass - -def shutdown(s: u64, how: INT) -> INT | t.State: pass - -def gethostbyname(name: t.CChar | t.CConst | t.CPtr) -> WSAHostEnt | t.CPtr | t.State: pass - -def ntohs(netshort: u16) -> u16 | t.State: pass - -def htons(hostshort: u16) -> u16 | t.State: pass - -def inet_addr(cp: t.CChar | t.CConst | t.CPtr) -> u32 | t.State: pass diff --git a/Test/AstTest/temp/6c658cc728d0bbf4.stub.ll.dep b/Test/AstTest/temp/6c658cc728d0bbf4.stub.ll.dep deleted file mode 100644 index 793e7ed..0000000 --- a/Test/AstTest/temp/6c658cc728d0bbf4.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb \ No newline at end of file diff --git a/Test/AstTest/temp/6c658cc728d0bbf4.vpi b/Test/AstTest/temp/6c658cc728d0bbf4.vpi deleted file mode 100644 index d7c42cf..0000000 --- a/Test/AstTest/temp/6c658cc728d0bbf4.vpi +++ /dev/null @@ -1,22 +0,0 @@ -""" -Auto-generated Python stub file from stdlib.vp -Module: stdlib -""" - -import c - - -from stdint import * -import t - -def malloc(size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass - -def calloc(nmemb: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass - -def realloc(p: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass - -def free(p: t.CVoid | t.CPtr) -> t.State: pass - -def system(cmd: t.CConst | t.CChar | t.CPtr) -> INT | t.State: pass - -def exit(status: int) -> t.State: pass diff --git a/Test/AstTest/temp/71e0a3ffcb3ebfad.stub.ll.dep b/Test/AstTest/temp/71e0a3ffcb3ebfad.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/AstTest/temp/71e0a3ffcb3ebfad.vpi b/Test/AstTest/temp/71e0a3ffcb3ebfad.vpi deleted file mode 100644 index f99012f..0000000 --- a/Test/AstTest/temp/71e0a3ffcb3ebfad.vpi +++ /dev/null @@ -1,20 +0,0 @@ -""" -Auto-generated Python stub file from stdarg.vp -Module: stdarg -""" - -import c - - -import t - -def va_start(args: t.CPtr, last_arg: t.CPtr) -> t.State: pass - -def va_arg(args: t.CPtr, type: t.CPtr) -> t.CPtr | t.State: pass - -def va_end(args: t.CPtr) -> t.State | t.State: pass - - -va_list: t.CTypedef = t.CUnsignedChar | t.CPtr - -def arg(type: t.CType) -> t.State: pass diff --git a/Test/AstTest/temp/72e2d5ccb7cedcf1.vpi b/Test/AstTest/temp/72e2d5ccb7cedcf1.vpi deleted file mode 100644 index f85ee45..0000000 --- a/Test/AstTest/temp/72e2d5ccb7cedcf1.vpi +++ /dev/null @@ -1,91 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32memory.vp -Module: w32.win32memory -""" - -import c - - -import t -from stdint import * -from w32.win32base import * - -MEM_COMMIT: t.CDefine = 0x00001000 -MEM_RESERVE: t.CDefine = 0x00002000 -MEM_DECOMMIT: t.CDefine = 0x00004000 -MEM_RELEASE: t.CDefine = 0x00008000 -MEM_FREE: t.CDefine = 0x00010000 -MEM_RESET: t.CDefine = 0x00080000 -MEM_TOP_DOWN: t.CDefine = 0x00100000 -MEM_WRITE_WATCH: t.CDefine = 0x00200000 -MEM_PHYSICAL: t.CDefine = 0x00400000 -MEM_LARGE_PAGES: t.CDefine = 0x20000000 -PAGE_NOACCESS: t.CDefine = 0x01 -PAGE_READONLY: t.CDefine = 0x02 -PAGE_READWRITE: t.CDefine = 0x04 -PAGE_WRITECOPY: t.CDefine = 0x08 -PAGE_EXECUTE: t.CDefine = 0x10 -PAGE_EXECUTE_READ: t.CDefine = 0x20 -PAGE_EXECUTE_READWRITE: t.CDefine = 0x40 -PAGE_EXECUTE_WRITECOPY: t.CDefine = 0x80 -PAGE_GUARD: t.CDefine = 0x100 -PAGE_NOCACHE: t.CDefine = 0x200 -PAGE_WRITECOMBINE: t.CDefine = 0x400 -HEAP_NO_SERIALIZE: t.CDefine = 0x00000001 -HEAP_GROWABLE: t.CDefine = 0x00000002 -HEAP_GENERATE_EXCEPTIONS: t.CDefine = 0x00000004 -HEAP_ZERO_MEMORY: t.CDefine = 0x00000008 -HEAP_REALLOC_IN_PLACE_ONLY: t.CDefine = 0x00000010 - -class MEMORY_BASIC_INFORMATION: - BaseAddress: VOIDPTR - AllocationBase: VOIDPTR - AllocationProtect: ULONG - RegionSize: t.CSizeT - State: ULONG - Protect: ULONG - Type: ULONG - -def VirtualAlloc(lpAddress: VOIDPTR, dwSize: t.CSizeT, flAllocationType: ULONG, flProtect: ULONG) -> VOIDPTR | t.State: pass - -def VirtualFree(lpAddress: VOIDPTR, dwSize: t.CSizeT, dwFreeType: ULONG) -> BOOL | t.State: pass - -def VirtualProtect(lpAddress: VOIDPTR, dwSize: t.CSizeT, flNewProtect: ULONG, lpflOldProtect: ULONG | t.CPtr) -> BOOL | t.State: pass - -def VirtualQuery(lpAddress: t.CConst | VOIDPTR, lpBuffer: MEMORY_BASIC_INFORMATION | t.CPtr, dwLength: t.CSizeT) -> t.CSizeT | t.State: pass - -def VirtualLock(lpAddress: VOIDPTR, dwSize: t.CSizeT) -> BOOL | t.State: pass - -def VirtualUnlock(lpAddress: VOIDPTR, dwSize: t.CSizeT) -> BOOL | t.State: pass - -def GetProcessHeap() -> HANDLE | t.State: pass - -def HeapCreate(flOptions: ULONG, dwInitialSize: t.CSizeT, dwMaximumSize: t.CSizeT) -> HANDLE | t.State: pass - -def HeapDestroy(hHeap: HANDLE) -> BOOL | t.State: pass - -def HeapAlloc(hHeap: HANDLE, dwFlags: ULONG, dwBytes: t.CSizeT) -> VOIDPTR | t.State: pass - -def HeapReAlloc(hHeap: HANDLE, dwFlags: ULONG, lpMem: VOIDPTR, dwBytes: t.CSizeT) -> VOIDPTR | t.State: pass - -def HeapFree(hHeap: HANDLE, dwFlags: ULONG, lpMem: VOIDPTR) -> BOOL | t.State: pass - -def HeapSize(hHeap: HANDLE, dwFlags: ULONG, lpMem: t.CConst | VOIDPTR) -> t.CSizeT | t.State: pass - -def HeapValidate(hHeap: HANDLE, dwFlags: ULONG, lpMem: t.CConst | VOIDPTR) -> BOOL | t.State: pass - -def HeapCompact(hHeap: HANDLE, dwFlags: ULONG) -> t.CSizeT | t.State: pass - -def GlobalAlloc(uFlags: UINT, dwBytes: t.CSizeT) -> VOIDPTR | t.State: pass - -def GlobalFree(hMem: VOIDPTR) -> VOIDPTR | t.State: pass - -def GlobalLock(hMem: VOIDPTR) -> VOIDPTR | t.State: pass - -def GlobalUnlock(hMem: VOIDPTR) -> BOOL | t.State: pass - -def GlobalSize(hMem: VOIDPTR) -> t.CSizeT | t.State: pass - -def LocalAlloc(uFlags: UINT, dwBytes: t.CSizeT) -> VOIDPTR | t.State: pass - -def LocalFree(hMem: VOIDPTR) -> VOIDPTR | t.State: pass diff --git a/Test/AstTest/temp/_phase1_manifest.json b/Test/AstTest/temp/_phase1_manifest.json deleted file mode 100644 index 700ada0..0000000 --- a/Test/AstTest/temp/_phase1_manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"d:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\AstTest\\App\\main.vp": {"sha1": "6eed58d6587aba87", "mtime": 1786380384.1598237, "size": 9276}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.vp": {"sha1": "7cadfe07e983fd90", "mtime": 1785338614.5410473, "size": 3238}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\__init__.vp": {"sha1": "876e256c06636777", "mtime": 1786370438.7959065, "size": 3919}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\astaux.vp": {"sha1": "34dc6a647fa19b7b", "mtime": 1786033586.0642571, "size": 11475}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\base.vp": {"sha1": "71b20381eda0450a", "mtime": 1786370425.011384, "size": 16357}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\exprs.vp": {"sha1": "43ec967d0517abc1", "mtime": 1786370434.0783823, "size": 40976}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\lexer.vp": {"sha1": "d0072d5282b9b65f", "mtime": 1786095601.8036606, "size": 24838}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\match.vp": {"sha1": "3b2a307c9c7d0129", "mtime": 1786095636.9718795, "size": 12297}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\parser.vp": {"sha1": "6b2a008dbdcddb7f", "mtime": 1786205592.4913094, "size": 102238}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\stmts.vp": {"sha1": "46ea1349c980c7f4", "mtime": 1786369520.4458838, "size": 38239}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\tokens.vp": {"sha1": "cea844466f10ac61", "mtime": 1786196689.3449256, "size": 14506}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.vp": {"sha1": "aa246c6e6aa30484", "mtime": 1785389628.701967, "size": 1198}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.vp": {"sha1": "2408ce147bac090b", "mtime": 1786323167.9697752, "size": 33121}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.vp": {"sha1": "b57252077e6b596b", "mtime": 1785332415.2187803, "size": 1266}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\posix.vp": {"sha1": "28de517e3820658a", "mtime": 1785335629.2014928, "size": 10586}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.vp": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.vp": {"sha1": "f5522571bcce7bcb", "mtime": 1785563642.3805652, "size": 4356}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.vp": {"sha1": "285b6aa29a34754d", "mtime": 1785332415.1829746, "size": 561}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.vp": {"sha1": "6c658cc728d0bbf4", "mtime": 1785750602.5446548, "size": 413}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.vp": {"sha1": "4c39369ffedaddac", "mtime": 1786188859.6154988, "size": 12277}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\sys.vp": {"sha1": "0c67644125bea0fd", "mtime": 1785325556.7317626, "size": 5606}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.vp": {"sha1": "2c175afd85852faf", "mtime": 1786320035.0415876, "size": 1685}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.vp": {"sha1": "bba983c61a970f7c", "mtime": 1786320034.4835327, "size": 59458}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.vp": {"sha1": "fc980acec33d69a7", "mtime": 1785332415.2228394, "size": 2653}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.vp": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.vp": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}} \ No newline at end of file diff --git a/Test/AstTest/temp/_sha1_map.txt b/Test/AstTest/temp/_sha1_map.txt deleted file mode 100644 index 5a22d3a..0000000 --- a/Test/AstTest/temp/_sha1_map.txt +++ /dev/null @@ -1,26 +0,0 @@ -067c78e9f121dce3:includes/w32\win32process.vp -0c67644125bea0fd:includes/sys.vp -2408ce147bac090b:includes/memhub.vp -285b6aa29a34754d:includes/stdio.vp -28de517e3820658a:includes/posix.vp -2c175afd85852faf:includes/viperio.vp -34dc6a647fa19b7b:includes/ast\astaux.vp -3b2a307c9c7d0129:includes/ast\match.vp -43ec967d0517abc1:includes/ast\exprs.vp -46ea1349c980c7f4:includes/ast\stmts.vp -4c39369ffedaddac:includes/string.vp -6b2a008dbdcddb7f:includes/ast\parser.vp -6c658cc728d0bbf4:includes/stdlib.vp -6eed58d6587aba87:main.vp -71b20381eda0450a:includes/ast\base.vp -71e0a3ffcb3ebfad:includes/stdarg.vp -7cadfe07e983fd90:includes/_list.vp -876e256c06636777:includes/ast\__init__.vp -aa246c6e6aa30484:includes/atom.vp -b57252077e6b596b:includes/platmacro.vp -bba983c61a970f7c:includes/viperlib.vp -bbdf3bbd4c3bc28c:includes/w32\win32console.vp -cea844466f10ac61:includes/ast\tokens.vp -d0072d5282b9b65f:includes/ast\lexer.vp -f5522571bcce7bcb:includes/stdint.vp -fc980acec33d69a7:includes/w32\win32base.vp diff --git a/Test/AstTest/temp/aa246c6e6aa30484.stub.ll.dep b/Test/AstTest/temp/aa246c6e6aa30484.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/AstTest/temp/aa246c6e6aa30484.vpi b/Test/AstTest/temp/aa246c6e6aa30484.vpi deleted file mode 100644 index 3147b54..0000000 --- a/Test/AstTest/temp/aa246c6e6aa30484.vpi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from atom.vp -Module: atom -""" - - -import t, c - -ATOMIC_RELAXED: t.CDefine = 0 -ATOMIC_CONSUME: t.CDefine = 1 -ATOMIC_ACQUIRE: t.CDefine = 2 -ATOMIC_RELEASE: t.CDefine = 3 -ATOMIC_ACQ_REL: t.CDefine = 4 -ATOMIC_SEQ_CST: t.CDefine = 5 - -def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass - -def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass - -def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass - -def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass - -def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - -def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass diff --git a/Test/AstTest/temp/b57252077e6b596b.stub.ll.dep b/Test/AstTest/temp/b57252077e6b596b.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/AstTest/temp/b57252077e6b596b.vpi b/Test/AstTest/temp/b57252077e6b596b.vpi deleted file mode 100644 index 32c2251..0000000 --- a/Test/AstTest/temp/b57252077e6b596b.vpi +++ /dev/null @@ -1,53 +0,0 @@ -""" -Auto-generated Python stub file from platmacro.vp -Module: platmacro -""" - - -import t, c - -IS_WINDOWS: t.CDefine = 1 -IS_WIN64: t.CDefine = 1 -IS_X86_64: t.CDefine = 1 -IS_LP64: t.CDefine = 1 -IS_LITTLE_ENDIAN: t.CDefine = 1 -IS_LINUX: t.CDefine = 0 -IS_MACOS: t.CDefine = 0 -IS_ARM64: t.CDefine = 0 -IS_BIG_ENDIAN: t.CDefine = 0 -IS_ILP32: t.CDefine = 0 -PTR_SIZE: t.CDefine = 8 -INT_SIZE: t.CDefine = 4 -LONG_SIZE: t.CDefine = 4 -WORD_SIZE: t.CDefine = 8 -CACHE_LINE_SIZE: t.CDefine = 64 -PAGE_SIZE: t.CDefine = 4096 -STACK_ALIGN: t.CDefine = 16 -MAX_PATH_LEN: t.CDefine = 260 -PLATFORM_NAME: t.CDefine = 1 -ARCH_NAME: t.CDefine = 1 -WINVER: t.CDefine = 0x0A00 -_WIN32_WINNT: t.CDefine = 0x0A00 -NTDDI_VERSION: t.CDefine = 0x0A000006 -HAS_SSE2: t.CDefine = 1 -HAS_AVX: t.CDefine = 1 -HAS_AVX2: t.CDefine = 1 -HAS_FMA: t.CDefine = 1 -HAS_NEON: t.CDefine = 0 -ALIGNOF_INT: t.CDefine = 4 -ALIGNOF_LONG: t.CDefine = 4 -ALIGNOF_PTR: t.CDefine = 8 -ALIGNOF_DOUBLE: t.CDefine = 8 -ALIGNOF_LONG_DOUBLE: t.CDefine = 16 -SIZEOF_SHORT: t.CDefine = 2 -SIZEOF_INT: t.CDefine = 4 -SIZEOF_LONG: t.CDefine = 4 -SIZEOF_LONG_LONG: t.CDefine = 8 -SIZEOF_FLOAT: t.CDefine = 4 -SIZEOF_DOUBLE: t.CDefine = 8 -SIZEOF_LONG_DOUBLE: t.CDefine = 16 -SIZEOF_POINTER: t.CDefine = 8 -SIZEOF_SIZE_T: t.CDefine = 8 -SIZEOF_PTRDIFF_T: t.CDefine = 8 -BYTE_ORDER_LE: t.CDefine = 1 -BYTE_ORDER_BE: t.CDefine = 0 \ No newline at end of file diff --git a/Test/AstTest/temp/bbdf3bbd4c3bc28c.stub.ll.dep b/Test/AstTest/temp/bbdf3bbd4c3bc28c.stub.ll.dep deleted file mode 100644 index d4b382c..0000000 --- a/Test/AstTest/temp/bbdf3bbd4c3bc28c.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb|fc980acec33d69a7 \ No newline at end of file diff --git a/Test/AstTest/temp/bbdf3bbd4c3bc28c.vpi b/Test/AstTest/temp/bbdf3bbd4c3bc28c.vpi deleted file mode 100644 index 4709b3e..0000000 --- a/Test/AstTest/temp/bbdf3bbd4c3bc28c.vpi +++ /dev/null @@ -1,138 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32console.vp -Module: w32.win32console -""" - -import c - - -import t -from stdint import * -from w32.win32base import * - -ENABLE_PROCESSED_INPUT: t.CDefine = 0x0001 -ENABLE_LINE_INPUT: t.CDefine = 0x0002 -ENABLE_ECHO_INPUT: t.CDefine = 0x0004 -ENABLE_WINDOW_INPUT: t.CDefine = 0x0008 -ENABLE_MOUSE_INPUT: t.CDefine = 0x0010 -ENABLE_INSERT_MODE: t.CDefine = 0x0020 -ENABLE_QUICK_EDIT_MODE: t.CDefine = 0x0040 -ENABLE_EXTENDED_FLAGS: t.CDefine = 0x0080 -ENABLE_PROCESSED_OUTPUT: t.CDefine = 0x0001 -ENABLE_WRAP_AT_EOL_OUTPUT: t.CDefine = 0x0002 -ENABLE_VIRTUAL_TERMINAL_PROCESSING: t.CDefine = 0x0004 -DISABLE_NEWLINE_AUTO_RETURN: t.CDefine = 0x0008 -ENABLE_LVB_GRID_WORLDWIDE: t.CDefine = 0x0010 -FOREGROUND_BLUE: t.CDefine = 0x0001 -FOREGROUND_GREEN: t.CDefine = 0x0002 -FOREGROUND_RED: t.CDefine = 0x0004 -FOREGROUND_INTENSITY: t.CDefine = 0x0008 -BACKGROUND_BLUE: t.CDefine = 0x0010 -BACKGROUND_GREEN: t.CDefine = 0x0020 -BACKGROUND_RED: t.CDefine = 0x0040 -BACKGROUND_INTENSITY: t.CDefine = 0x0080 -KEY_EVENT: t.CDefine = 0x0001 -MOUSE_EVENT: t.CDefine = 0x0002 -WINDOW_BUFFER_SIZE_EVENT: t.CDefine = 0x0004 -MENU_EVENT: t.CDefine = 0x0008 -FOCUS_EVENT: t.CDefine = 0x0010 - -class COORD: - X: SHORT - Y: SHORT -class SMALL_RECT: - Left: SHORT - Top: SHORT - Right: SHORT - Bottom: SHORT -class CONSOLE_SCREEN_BUFFER_INFO: - dwSize: COORD - dwCursorPosition: COORD - wAttributes: WORD - srWindow: SMALL_RECT - dwMaximumWindowSize: COORD -class CONSOLE_CURSOR_INFO: - dwSize: ULONG - bVisible: BOOL -class CHAR_INFO: - UnicodeChar: WCHAR - Attributes: WORD -class KEY_EVENT_RECORD: - bKeyDown: BOOL - wRepeatCount: WORD - wVirtualKeyCode: WORD - wVirtualScanCode: WORD - uChar: WCHAR - dwControlKeyState: ULONG -class MOUSE_EVENT_RECORD: - dwMousePosition: COORD - dwButtonState: ULONG - dwControlKeyState: ULONG - dwEventFlags: ULONG -class WINDOW_BUFFER_SIZE_RECORD: - dwSize: COORD -class INPUT_RECORD: - EventType: WORD - Event: KEY_EVENT_RECORD - -def SetConsoleOutputCP(codepage: UINT) -> BOOL | t.State: pass - -def SetConsoleCP(codepage: UINT) -> BOOL | t.State: pass - -def GetConsoleCP() -> UINT | t.State: pass - -def GetConsoleOutputCP() -> UINT | t.State: pass - -def GetConsoleScreenBufferInfo(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: CONSOLE_SCREEN_BUFFER_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleScreenBufferSize(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL | t.State: pass - -def SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) -> BOOL | t.State: pass - -def GetConsoleCursorInfo(hConsoleOutput: HANDLE, lpConsoleCursorInfo: CONSOLE_CURSOR_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleCursorInfo(hConsoleOutput: HANDLE, lpConsoleCursorInfo: CONSOLE_CURSOR_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL | t.State: pass - -def FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: t.CChar, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfCharsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FillConsoleOutputCharacterW(hConsoleOutput: HANDLE, cCharacter: WCHAR, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfCharsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FillConsoleOutputAttribute(hConsoleOutput: HANDLE, wAttribute: WORD, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfAttrsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def WriteConsoleA(hConsoleOutput: HANDLE, lpBuffer: t.CConst | VOIDPTR, nNumberOfCharsToWrite: ULONG, lpNumberOfCharsWritten: ULONG | t.CPtr, lpReserved: VOIDPTR) -> BOOL | t.State: pass - -def WriteConsoleW(hConsoleOutput: HANDLE, lpBuffer: t.CConst | VOIDPTR, nNumberOfCharsToWrite: ULONG, lpNumberOfCharsWritten: ULONG | t.CPtr, lpReserved: VOIDPTR) -> BOOL | t.State: pass - -def ReadConsoleA(hConsoleInput: HANDLE, lpBuffer: VOIDPTR, nNumberOfCharsToRead: ULONG, lpNumberOfCharsRead: ULONG | t.CPtr, pInputControl: VOIDPTR) -> BOOL | t.State: pass - -def ReadConsoleW(hConsoleInput: HANDLE, lpBuffer: VOIDPTR, nNumberOfCharsToRead: ULONG, lpNumberOfCharsRead: ULONG | t.CPtr, pInputControl: VOIDPTR) -> BOOL | t.State: pass - -def GetConsoleMode(hConsoleHandle: HANDLE, lpMode: ULONG | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleMode(hConsoleHandle: HANDLE, dwMode: ULONG) -> BOOL | t.State: pass - -def ReadConsoleInputA(hConsoleInput: HANDLE, lpBuffer: INPUT_RECORD | t.CPtr, nLength: ULONG, lpNumberOfEventsRead: ULONG | t.CPtr) -> BOOL | t.State: pass - -def ReadConsoleInputW(hConsoleInput: HANDLE, lpBuffer: INPUT_RECORD | t.CPtr, nLength: ULONG, lpNumberOfEventsRead: ULONG | t.CPtr) -> BOOL | t.State: pass - -def GetNumberOfConsoleInputEvents(hConsoleInput: HANDLE, lpNumberOfEvents: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FlushConsoleInputBuffer(hConsoleInput: HANDLE) -> BOOL | t.State: pass - -def SetConsoleTitleA(lpConsoleTitle: LPCSTR) -> BOOL | t.State: pass - -def SetConsoleTitleW(lpConsoleTitle: LPCWSTR) -> BOOL | t.State: pass - -def GetConsoleTitleA(lpConsoleTitle: CHARPTR, nSize: ULONG) -> ULONG | t.State: pass - -def GetConsoleTitleW(lpConsoleTitle: WCHARPTR, nSize: ULONG) -> ULONG | t.State: pass - -def AllocConsole() -> BOOL | t.State: pass - -def FreeConsole() -> BOOL | t.State: pass - -def SetConsoleWindowInfo(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: SMALL_RECT | t.CPtr) -> BOOL | t.State: pass - -def ScrollConsoleScreenBufferA(hConsoleOutput: HANDLE, lpScrollRectangle: SMALL_RECT | t.CPtr, lpClipRectangle: SMALL_RECT | t.CPtr, dwDestinationOrigin: COORD, lpFill: CHAR_INFO | t.CPtr) -> BOOL | t.State: pass diff --git a/Test/AstTest/temp/d137b1f3311f3a7f.vpi b/Test/AstTest/temp/d137b1f3311f3a7f.vpi deleted file mode 100644 index a85310e..0000000 --- a/Test/AstTest/temp/d137b1f3311f3a7f.vpi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from w32.fileio.vp -Module: w32.fileio -""" - - -import t, c -from stdint import * -import stdio -import w32.win32base -import w32.win32file - -class MODE(t.CEnum): - R = 0 - W = 1 - A = 2 - RP = 3 - WP = 4 - AP = 5 - X = 6 - XP = 7 -class FRESULT(t.CEnum): - OK = 0 - ERR = -1 - ERR_CLOSED = -2 - ERR_PERM = -3 - ERR_IO = -4 - ERR_NOTFOUND = -5 - -SEEK_SET: t.CDefine = 0 -SEEK_CUR: t.CDefine = 1 -SEEK_END: t.CDefine = 2 -INVALID_SET_FILE_POINTER: t.CDefine = -1 -SHARE_READ: t.CDefine = 0x00000001 -SHARE_WRITE: t.CDefine = 0x00000002 -SHARE_DELETE: t.CDefine = 0x00000004 - -class File: - handle: w32.win32base.HANDLE - closed: bool - can_read: bool - can_write: bool - is_append: bool - _share_mode: ULONG - def __init__(self: File, filename: str, mode: ULONG, share: ULONG = SHARE_READ) -> t.CInt: pass - def __enter__(self: File) -> 'File' | t.CPtr: pass - def __exit__(self: File) -> t.CInt: pass - def read(self: File, buf: bytes, count: ULONG) -> LONG: pass - def write(self: File, buf: bytes, count: ULONG) -> LONG: pass - def write_str(self: File, s: str) -> LONG: pass - def seek(self: File, offset: LONG, origin: ULONG) -> LONG: pass - def tell(self: File) -> LONG: pass - def close(self: File) -> LONG: pass - def flush(self: File) -> LONG: pass - def size(self: File) -> LONGLONG: pass - def readline(self: File, buf: bytes, max_count: ULONG) -> LONG: pass - def read_all(self: File, buf: bytes, max_count: ULONG) -> LONG: pass -class FileW: - handle: w32.win32base.HANDLE - closed: bool - can_read: bool - can_write: bool - is_append: bool - _share_mode: ULONG - def __init__(self: FileW, filename: w32.win32base.LPCWSTR, mode: ULONG, share: ULONG = SHARE_READ) -> t.CInt: pass - def __enter__(self: FileW) -> 'FileW' | t.CPtr: pass - def __exit__(self: FileW) -> t.CInt: pass - def read(self: FileW, buf: bytes, count: ULONG) -> LONG: pass - def write(self: FileW, buf: bytes, count: ULONG) -> LONG: pass - def write_str(self: FileW, s: str) -> LONG: pass - def seek(self: FileW, offset: LONG, origin: ULONG) -> LONG: pass - def tell(self: FileW) -> LONG: pass - def close(self: FileW) -> LONG: pass - def flush(self: FileW) -> LONG: pass - def size(self: FileW) -> LONGLONG: pass - def readline(self: FileW, buf: bytes, max_count: ULONG) -> LONG: pass - def read_all(self: FileW, buf: bytes, max_count: ULONG) -> LONG: pass - -def open(filename: str, mode: ULONG, share: ULONG = SHARE_READ) -> File | t.CPtr: pass - -def openw(filename: w32.win32base.LPCWSTR, mode: ULONG, share: ULONG = SHARE_READ) -> FileW | t.CPtr: pass diff --git a/Test/AstTest/temp/f5522571bcce7bcb.stub.ll.dep b/Test/AstTest/temp/f5522571bcce7bcb.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/AstTest/temp/f5522571bcce7bcb.vpi b/Test/AstTest/temp/f5522571bcce7bcb.vpi deleted file mode 100644 index f0bc071..0000000 --- a/Test/AstTest/temp/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,100 +0,0 @@ -""" -Auto-generated Python stub file from stdint.vp -Module: stdint -""" - -import c - - -import t - -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool \ No newline at end of file diff --git a/Test/AstTest/temp/f6b51804a0ba8ff0.vpi b/Test/AstTest/temp/f6b51804a0ba8ff0.vpi deleted file mode 100644 index 6ee80a6..0000000 --- a/Test/AstTest/temp/f6b51804a0ba8ff0.vpi +++ /dev/null @@ -1,192 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32file.vp -Module: w32.win32file -""" - -import c - - -import t -from stdint import * -from w32.win32base import * - -GENERIC_READ: t.CDefine = 0x80000000 -GENERIC_WRITE: t.CDefine = 0x40000000 -GENERIC_EXECUTE: t.CDefine = 0x20000000 -GENERIC_ALL: t.CDefine = 0x10000000 -FILE_SHARE_READ: t.CDefine = 0x00000001 -FILE_SHARE_WRITE: t.CDefine = 0x00000002 -FILE_SHARE_DELETE: t.CDefine = 0x00000004 -CREATE_NEW: t.CDefine = 1 -CREATE_ALWAYS: t.CDefine = 2 -OPEN_EXISTING: t.CDefine = 3 -OPEN_ALWAYS: t.CDefine = 4 -TRUNCATE_EXISTING: t.CDefine = 5 -FILE_ATTRIBUTE_READONLY: t.CDefine = 0x00000001 -FILE_ATTRIBUTE_HIDDEN: t.CDefine = 0x00000002 -FILE_ATTRIBUTE_SYSTEM: t.CDefine = 0x00000004 -FILE_ATTRIBUTE_DIRECTORY: t.CDefine = 0x00000010 -FILE_ATTRIBUTE_ARCHIVE: t.CDefine = 0x00000020 -FILE_ATTRIBUTE_NORMAL: t.CDefine = 0x00000080 -FILE_ATTRIBUTE_TEMPORARY: t.CDefine = 0x00000100 -FILE_ATTRIBUTE_COMPRESSED: t.CDefine = 0x00000800 -FILE_ATTRIBUTE_OFFLINE: t.CDefine = 0x00001000 -FILE_ATTRIBUTE_ENCRYPTED: t.CDefine = 0x00004000 -FILE_FLAG_WRITE_THROUGH: t.CDefine = 0x80000000 -FILE_FLAG_OVERLAPPED: t.CDefine = 0x40000000 -FILE_FLAG_NO_BUFFERING: t.CDefine = 0x20000000 -FILE_FLAG_RANDOM_ACCESS: t.CDefine = 0x10000000 -FILE_FLAG_SEQUENTIAL_SCAN: t.CDefine = 0x08000000 -FILE_FLAG_DELETE_ON_CLOSE: t.CDefine = 0x04000000 -FILE_FLAG_BACKUP_SEMANTICS: t.CDefine = 0x02000000 -FILE_FLAG_POSIX_SEMANTICS: t.CDefine = 0x01000000 -FILE_BEGIN: t.CDefine = 0 -FILE_CURRENT: t.CDefine = 1 -FILE_END: t.CDefine = 2 -STD_INPUT_HANDLE: t.CDefine = t.CUnsignedLong(-10) -STD_OUTPUT_HANDLE: t.CDefine = t.CUnsignedLong(-11) -STD_ERROR_HANDLE: t.CDefine = t.CUnsignedLong(-12) -MOVEFILE_REPLACE_EXISTING: t.CDefine = 0x00000001 -MOVEFILE_COPY_ALLOWED: t.CDefine = 0x00000002 -MOVEFILE_WRITE_THROUGH: t.CDefine = 0x00000008 - -class BY_HANDLE_FILE_INFORMATION: - dwFileAttributes: ULONG - ftCreationTime: FILETIME - ftLastAccessTime: FILETIME - ftLastWriteTime: FILETIME - dwVolumeSerialNumber: ULONG - nFileSizeHigh: ULONG - nFileSizeLow: ULONG - nNumberOfLinks: ULONG - nFileIndexHigh: ULONG - nFileIndexLow: ULONG -class WIN32_FIND_DATAA: - dwFileAttributes: ULONG - ftCreationTime: FILETIME - ftLastAccessTime: FILETIME - ftLastWriteTime: FILETIME - nFileSizeHigh: ULONG - nFileSizeLow: ULONG - dwReserved0: ULONG - dwReserved1: ULONG - cFileName: t.CArray[t.CChar, 260] - cAlternateFileName: t.CArray[t.CChar, 14] -class WIN32_FIND_DATAW: - dwFileAttributes: ULONG - ftCreationTime: FILETIME - ftLastAccessTime: FILETIME - ftLastWriteTime: FILETIME - nFileSizeHigh: ULONG - nFileSizeLow: ULONG - dwReserved0: ULONG - dwReserved1: ULONG - cFileName: t.CArray[t.CUInt16T, 260] - cAlternateFileName: t.CArray[t.CUInt16T, 14] - -def CreateFileA(lpFileName: LPCSTR, dwDesiredAccess: ULONG, dwShareMode: ULONG, lpSecurityAttributes: SECURITY_ATTRIBUTES | t.CPtr, dwCreationDisposition: ULONG, dwFlagsAndAttributes: ULONG, hTemplateFile: HANDLE) -> HANDLE | t.State: pass - -def CreateFileW(lpFileName: LPCWSTR, dwDesiredAccess: ULONG, dwShareMode: ULONG, lpSecurityAttributes: SECURITY_ATTRIBUTES | t.CPtr, dwCreationDisposition: ULONG, dwFlagsAndAttributes: ULONG, hTemplateFile: HANDLE) -> HANDLE | t.State: pass - -def ReadFile(hFile: HANDLE, lpBuffer: VOIDPTR, nNumberOfBytesToRead: ULONG, lpNumberOfBytesRead: ULONG | t.CPtr, lpOverlapped: OVERLAPPED | t.CPtr) -> BOOL | t.State: pass - -def WriteFile(hFile: HANDLE, lpBuffer: t.CConst | VOIDPTR, nNumberOfBytesToWrite: ULONG, lpNumberOfBytesWritten: ULONG | t.CPtr, lpOverlapped: OVERLAPPED | t.CPtr) -> BOOL | t.State: pass - -def SetFilePointer(hFile: HANDLE, lDistanceToMove: LONG, lpDistanceToMoveHigh: LONG | t.CPtr, dwMoveMethod: ULONG) -> LONG | t.State: pass - -def SetFilePointerEx(hFile: HANDLE, liDistanceToMove: LARGE_INTEGER | t.CPtr, lpNewFilePointer: LARGE_INTEGER | t.CPtr, dwMoveMethod: ULONG) -> BOOL | t.State: pass - -def GetFileSize(hFile: HANDLE, lpFileSizeHigh: ULONG | t.CPtr) -> ULONG | t.State: pass - -def GetFileSizeEx(hFile: HANDLE, lpFileSize: LARGE_INTEGER | t.CPtr) -> BOOL | t.State: pass - -def SetEndOfFile(hFile: HANDLE) -> BOOL | t.State: pass - -def FlushFileBuffers(hFile: HANDLE) -> BOOL | t.State: pass - -def GetFileType(hFile: HANDLE) -> ULONG | t.State: pass - -def GetFileAttributesA(lpFileName: LPCSTR) -> ULONG | t.State: pass - -def GetFileAttributesW(lpFileName: LPCWSTR) -> ULONG | t.State: pass - -def SetFileAttributesA(lpFileName: LPCSTR, dwFileAttributes: ULONG) -> BOOL | t.State: pass - -def SetFileAttributesW(lpFileName: LPCWSTR, dwFileAttributes: ULONG) -> BOOL | t.State: pass - -def DeleteFileA(lpFileName: LPCSTR) -> BOOL | t.State: pass - -def DeleteFileW(lpFileName: LPCWSTR) -> BOOL | t.State: pass - -def MoveFileA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR) -> BOOL | t.State: pass - -def MoveFileW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR) -> BOOL | t.State: pass - -def MoveFileExA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, dwFlags: ULONG) -> BOOL | t.State: pass - -def MoveFileExW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: ULONG) -> BOOL | t.State: pass - -def CopyFileA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR, bFailIfExists: BOOL) -> BOOL | t.State: pass - -def CopyFileW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, bFailIfExists: BOOL) -> BOOL | t.State: pass - -def CreateDirectoryA(lpPathName: LPCSTR, lpSecurityAttributes: SECURITY_ATTRIBUTES | t.CPtr) -> BOOL | t.State: pass - -def CreateDirectoryW(lpPathName: LPCWSTR, lpSecurityAttributes: SECURITY_ATTRIBUTES | t.CPtr) -> BOOL | t.State: pass - -def RemoveDirectoryA(lpPathName: LPCSTR) -> BOOL | t.State: pass - -def RemoveDirectoryW(lpPathName: LPCWSTR) -> BOOL | t.State: pass - -def FindFirstFileA(lpFileName: LPCSTR, lpFindFileData: WIN32_FIND_DATAA | t.CPtr) -> HANDLE | t.State: pass - -def FindFirstFileW(lpFileName: LPCWSTR, lpFindFileData: WIN32_FIND_DATAW | t.CPtr) -> HANDLE | t.State: pass - -def FindNextFileA(hFindFile: HANDLE, lpFindFileData: WIN32_FIND_DATAA | t.CPtr) -> BOOL | t.State: pass - -def FindNextFileW(hFindFile: HANDLE, lpFindFileData: WIN32_FIND_DATAW | t.CPtr) -> BOOL | t.State: pass - -def FindClose(hFindFile: HANDLE) -> BOOL | t.State: pass - -def GetStdHandle(nStdHandle: ULONG) -> HANDLE | t.State: pass - -def SetStdHandle(nStdHandle: ULONG, hHandle: HANDLE) -> BOOL | t.State: pass - -def GetFileInformationByHandle(hFile: HANDLE, lpFileInformation: BY_HANDLE_FILE_INFORMATION | t.CPtr) -> BOOL | t.State: pass - -def LockFile(hFile: HANDLE, dwFileOffsetLow: ULONG, dwFileOffsetHigh: ULONG, nNumberOfBytesToLockLow: ULONG, nNumberOfBytesToLockHigh: ULONG) -> BOOL | t.State: pass - -def UnlockFile(hFile: HANDLE, dwFileOffsetLow: ULONG, dwFileOffsetHigh: ULONG, nNumberOfBytesToUnlockLow: ULONG, nNumberOfBytesToUnlockHigh: ULONG) -> BOOL | t.State: pass - -def GetTempPathA(nBufferLength: ULONG, lpBuffer: CHARPTR) -> ULONG | t.State: pass - -def GetTempPathW(nBufferLength: ULONG, lpBuffer: WCHARPTR) -> ULONG | t.State: pass - -def GetTempFileNameA(lpPathName: LPCSTR, lpPrefixString: LPCSTR, uUnique: UINT, lpTempFileName: CHARPTR) -> UINT | t.State: pass - -def GetTempFileNameW(lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: UINT, lpTempFileName: WCHARPTR) -> UINT | t.State: pass - -def GetCurrentDirectoryA(nBufferLength: ULONG, lpBuffer: CHARPTR) -> ULONG | t.State: pass - -def GetCurrentDirectoryW(nBufferLength: ULONG, lpBuffer: WCHARPTR) -> ULONG | t.State: pass - -def SetCurrentDirectoryA(lpPathName: LPCSTR) -> BOOL | t.State: pass - -def SetCurrentDirectoryW(lpPathName: LPCWSTR) -> BOOL | t.State: pass - -def GetModuleFileNameA(hModule: HANDLE, lpFilename: CHARPTR, nSize: ULONG) -> ULONG | t.State: pass - -def GetModuleFileNameW(hModule: HANDLE, lpFilename: WCHARPTR, nSize: ULONG) -> ULONG | t.State: pass - - -HANDLE_FLAG_INHERIT: t.CDefine = 0x00000001 -HANDLE_FLAG_PROTECT_FROM_CLOSE: t.CDefine = 0x00000002 - -def CreatePipe(hReadPipe: HANDLE | t.CPtr, hWritePipe: HANDLE | t.CPtr, lpPipeAttributes: SECURITY_ATTRIBUTES | t.CPtr, nSize: ULONG) -> BOOL | t.State: pass - -def SetHandleInformation(hObject: HANDLE, dwMask: ULONG, dwFlags: ULONG) -> BOOL | t.State: pass - -def DuplicateHandle(hSourceProcessHandle: HANDLE, hSourceHandle: HANDLE, hTargetProcessHandle: HANDLE, lpTargetHandle: HANDLE | t.CPtr, dwDesiredAccess: ULONG, bInheritHandle: BOOL, dwOptions: ULONG) -> BOOL | t.State: pass - - -DUPLICATE_SAME_ACCESS: t.CDefine = 0x00000002 \ No newline at end of file diff --git a/Test/AstTest/temp/fc980acec33d69a7.stub.ll.dep b/Test/AstTest/temp/fc980acec33d69a7.stub.ll.dep deleted file mode 100644 index 793e7ed..0000000 --- a/Test/AstTest/temp/fc980acec33d69a7.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb \ No newline at end of file diff --git a/Test/AstTest/temp/fc980acec33d69a7.vpi b/Test/AstTest/temp/fc980acec33d69a7.vpi deleted file mode 100644 index 3f9feff..0000000 --- a/Test/AstTest/temp/fc980acec33d69a7.vpi +++ /dev/null @@ -1,100 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32base.vp -Module: w32.win32base -""" - -import c - - -import t -from stdint import * - -HANDLE: t.CTypedef = VOIDPTR -LPCSTR: t.CTypedef = t.CConst | t.CChar | t.CPtr -LPCWSTR: t.CTypedef = t.CConst | t.CUnsignedShort | t.CPtr -INVALID_HANDLE_VALUE: t.CDefine = -1 -NULL: t.CDefine = 0 -TRUE: t.CDefine = 1 -FALSE: t.CDefine = 0 -INFINITE: t.CDefine = 0xFFFFFFFF -WAIT_FAILED: t.CDefine = 0xFFFFFFFF -WAIT_OBJECT_0: t.CDefine = 0 -WAIT_TIMEOUT: t.CDefine = 258 -WAIT_ABANDONED: t.CDefine = 0x80 -MAX_PATH: t.CDefine = 260 -ERROR_SUCCESS: t.CDefine = 0 -ERROR_FILE_NOT_FOUND: t.CDefine = 2 -ERROR_ACCESS_DENIED: t.CDefine = 5 -ERROR_INSUFFICIENT_BUFFER: t.CDefine = 122 - -class SECURITY_ATTRIBUTES: - nLength: ULONG - lpSecurityDescriptor: VOIDPTR - bInheritHandle: BOOL -class OVERLAPPED: - Internal: ULONGLONG - InternalHigh: ULONGLONG - Offset: ULONG - OffsetHigh: ULONG - hEvent: HANDLE -class FILETIME: - dwLowDateTime: DWORD - dwHighDateTime: DWORD -class SYSTEMTIME: - wYear: WORD - wMonth: WORD - wDayOfWeek: WORD - wDay: WORD - wHour: WORD - wMinute: WORD - wSecond: WORD - wMilliseconds: WORD -class GUID: - Data1: DWORD - Data2: WORD - Data3: WORD - Data4: BYTEPTR -class LARGE_INTEGER: - QuadPart: LONGLONG -class ULARGE_INTEGER: - QuadPart: ULONGLONG - -def GetLastError() -> ULONG | t.State: pass - -def SetLastError(dwErrCode: ULONG) -> t.State: pass - -def CloseHandle(hObject: HANDLE) -> BOOL | t.State: pass - -def GetProcAddress(hModule: HANDLE, lpProcName: LPCSTR) -> VOIDPTR | t.State: pass - -def GetModuleHandleA(lpModuleName: LPCSTR) -> HANDLE | t.State: pass - -def GetModuleHandleW(lpModuleName: LPCWSTR) -> HANDLE | t.State: pass - -def LoadLibraryA(lpLibFileName: LPCSTR) -> HANDLE | t.State: pass - -def LoadLibraryW(lpLibFileName: LPCWSTR) -> HANDLE | t.State: pass - -def FreeLibrary(hLibModule: HANDLE) -> BOOL | t.State: pass - -def GetSystemTime(lpSystemTime: SYSTEMTIME | t.CPtr) -> t.State: pass - -def GetLocalTime(lpSystemTime: SYSTEMTIME | t.CPtr) -> t.State: pass - -def FileTimeToSystemTime(lpFileTime: FILETIME | t.CPtr, lpSystemTime: SYSTEMTIME | t.CPtr) -> BOOL | t.State: pass - -def SystemTimeToFileTime(lpSystemTime: SYSTEMTIME | t.CPtr, lpFileTime: FILETIME | t.CPtr) -> BOOL | t.State: pass - -def QueryPerformanceCounter(lpPerformanceCount: LARGE_INTEGER | t.CPtr) -> BOOL | t.State: pass - -def QueryPerformanceFrequency(lpFrequency: LARGE_INTEGER | t.CPtr) -> BOOL | t.State: pass - -def Sleep(dwMilliseconds: ULONG) -> t.State: pass - -def SleepEx(dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG | t.State: pass - -def GetTickCount() -> ULONG | t.State: pass - -def GetTickCount64() -> ULONGLONG | t.State: pass - -def GetCommandLineA() -> CHARPTR | t.State: pass diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/_sha1_map.txt b/Test/BuiltinDecoratorTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 0f02d85..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,8 +0,0 @@ -f5522571bcce7bcb:includes/stdint.vp -09c0472e6fd0d088:includes/stdio.vp -989dba6e92235032:includes/stdlib.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -e710417730391023:includes/w32/win32base.vp -e3ac223bdaf94a0c:main.vp diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/e3/e3ac223bdaf94a0c.vpi b/Test/BuiltinDecoratorTest/.tpv_build/temp/e3/e3ac223bdaf94a0c.vpi deleted file mode 100644 index 8b52e8e..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/e3/e3ac223bdaf94a0c.vpi +++ /dev/null @@ -1,100 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -from stdint import * -from stdio import printf -from stdlib import malloc -import testcheck -class Rect: - width: t.CInt - height: t.CInt - def __new__(self, w: t.CInt, h: t.CInt) -> 'Rect' | t.CPtr: pass - def __init__(self, w: t.CInt, h: t.CInt): pass - @property - def area(self) -> t.CInt: pass - @property - def is_square(self) -> bool: pass - -def test_property_getter(): pass - -class Temperature: - _celsius: t.CDouble - def __new__(self, celsius_val: t.CDouble) -> 'Temperature' | t.CPtr: pass - def __init__(self, celsius_val: t.CDouble): pass - @property - def celsius(self) -> t.CDouble: pass - @celsius.setter - def celsius(self, val: t.CDouble): pass - @property - def fahrenheit(self) -> t.CDouble: pass - -def test_property_setter(): pass - -class Counter: - _count: t.CInt - def __new__(self) -> 'Counter' | t.CPtr: pass - def __init__(self): pass - @property - def value(self) -> t.CInt: pass - @value.setter - def value(self, v: t.CInt): pass - -def test_property_getter_redef(): pass - -class Config: - _value: t.CInt - _deleted: t.CInt - def __new__(self, v: t.CInt) -> 'Config' | t.CPtr: pass - def __init__(self, v: t.CInt): pass - @property - def value(self) -> t.CInt: pass - @value.setter - def value(self, v: t.CInt): pass - @value.deleter - def value(self): pass - def is_deleted(self) -> bool: pass - -def test_property_deleter(): pass - -class MathUtils: - @staticmethod - def add(a: t.CInt, b: t.CInt) -> t.CInt: pass - @staticmethod - def max_val(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def test_staticmethod(): pass - -class Point: - x: t.CDouble - y: t.CDouble - def __new__(self, x: t.CDouble, y: t.CDouble) -> 'Point' | t.CPtr: pass - def __init__(self, x: t.CDouble, y: t.CDouble): pass - @classmethod - def origin(cls: Point) -> Point: pass - @classmethod - def from_int(cls: Point, x: t.CInt, y: t.CInt) -> Point: pass - def dist_sq(self) -> t.CDouble: pass - -def test_classmethod(): pass - -class Circle: - _radius: t.CDouble - def __new__(self, r: t.CDouble) -> 'Circle' | t.CPtr: pass - def __init__(self, r: t.CDouble): pass - @property - def radius(self) -> t.CDouble: pass - @radius.setter - def radius(self, val: t.CDouble): pass - @property - def area(self) -> t.CDouble: pass - @staticmethod - def is_unit(r: t.CDouble) -> bool: pass - @classmethod - def unit(cls: Circle) -> Circle: pass - -def test_combined(): pass - -def main() -> t.CInt | t.CExport: pass - diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/BuiltinDecoratorTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.deps.txt b/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.deps.txt deleted file mode 100644 index ddfe193..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t stdio testcheck \ No newline at end of file diff --git a/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.vpi b/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.vpi deleted file mode 100644 index ca831c9..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/5a/5a548a4b33e11918.vpi +++ /dev/null @@ -1,13 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -import stdio -import testcheck -def make_counter() -> t.CPtr: pass - -def test_closure_call(): pass - -def main() -> t.CInt: pass - diff --git a/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/ClosureCallTest/.tpv_build/temp/_sha1_map.txt b/Test/ClosureCallTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index a4b9a62..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -5a548a4b33e11918:main.vp diff --git a/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/ClosureCallTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/ClosureTest/.tpv_build/temp/52/52e6b51da061882f.vpi b/Test/ClosureTest/.tpv_build/temp/52/52e6b51da061882f.vpi deleted file mode 100644 index 12c795b..0000000 --- a/Test/ClosureTest/.tpv_build/temp/52/52e6b51da061882f.vpi +++ /dev/null @@ -1,34 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -import stdio -import testcheck -g_val: t.CInt = 100 -def outer_modify_global(): pass - -def test_global_in_nested(): pass - -def test_nonlocal_multi_level(): pass - -g_mixed: t.CInt = 0 -def test_global_nonlocal_mixed(): pass - -def test_lambda_multi_capture(): pass - -def test_lambda_arg_capture(): pass - -def test_nested_return(): pass - -def test_nonlocal_loop(): pass - -g_arr: t.CArray[t.CInt, 4] -def test_global_array(): pass - -def test_nested_conditional(): pass - -def test_lambda_chain(): pass - -def main() -> t.CInt: pass - diff --git a/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/ClosureTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/ClosureTest/.tpv_build/temp/_sha1_map.txt b/Test/ClosureTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 0ab6244..0000000 --- a/Test/ClosureTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -52e6b51da061882f:main.vp diff --git a/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/ClosureTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/ClosureTest2/.tpv_build/temp/44/440f18f9dce85a95.vpi b/Test/ClosureTest2/.tpv_build/temp/44/440f18f9dce85a95.vpi deleted file mode 100644 index 12676ba..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/44/440f18f9dce85a95.vpi +++ /dev/null @@ -1,43 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -import stdio -import testcheck -def test_nonlocal_conditional(): pass - -def test_nonlocal_multi_var(): pass - -g_counter: t.CInt = 0 -def inc_global(): pass - -def add_global(n: t.CInt): pass - -def test_global_cross_functions(): pass - -def test_nested_ref_capture(): pass - -def test_lambda_capture_then_modify(): pass - -def test_nonlocal_loop_accumulate(): pass - -def test_deep_nested_vars(): pass - -g_state: t.CInt = 0 -def test_global_nonlocal_same_func(): pass - -def test_lambda_default_and_capture(): pass - -def test_nested_accumulate(): pass - -def test_nonlocal_while(): pass - -class Point: - x: t.CInt - y: t.CInt - -def test_nested_modify_struct(): pass - -def main() -> t.CInt: pass - diff --git a/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/ClosureTest2/.tpv_build/temp/_sha1_map.txt b/Test/ClosureTest2/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 6ed2aa5..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -440f18f9dce85a95:main.vp diff --git a/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/ClosureTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/_sha1_map.txt b/Test/DecoratorMarkerTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 2c57d36..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -b1122357fee8fd68:main.vp diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/b1/b1122357fee8fd68.vpi b/Test/DecoratorMarkerTest/.tpv_build/temp/b1/b1122357fee8fd68.vpi deleted file mode 100644 index d204b5f..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/b1/b1122357fee8fd68.vpi +++ /dev/null @@ -1,32 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -from stdio import printf -import testcheck -@t.CStruct -class Point: - x: t.CInt - y: t.CInt - -@t.CEnum -class Color: - pass - -@t.CUnion -class Data: - i: t.CInt - f: t.CFloat - -@t.CExport -def test() -> t.CInt: pass - -@t.CStatic -def static_func() -> t.CInt: pass - -@t.CStatic -def mixed_func() -> t.CInt | t.CExport: pass - -def main() -> t.CInt: pass - diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/DecoratorMarkerTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/EdgeCaseTest/.tpv_build/temp/_sha1_map.txt b/Test/EdgeCaseTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index 5579fcc..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -ac0d686cb2cc783b:main.vp diff --git a/Test/EdgeCaseTest/.tpv_build/temp/ac/ac0d686cb2cc783b.vpi b/Test/EdgeCaseTest/.tpv_build/temp/ac/ac0d686cb2cc783b.vpi deleted file mode 100644 index eeadf16..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/ac/ac0d686cb2cc783b.vpi +++ /dev/null @@ -1,78 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -import t as tt -import stdio -import testcheck -from t import CEnum as en -from t import CUnion as un -from t import REnum as ren -from t import CStruct as cs -from t import CInt as myint -from t import CChar, CPtr -class Color(en): - pass - -class Status(tt.CEnum): - pass - -class Data(un): - i_val: t.CInt - f_val: t.CFloat - -class Opt(ren): - class Some: - val: myint - - -class Parent: - a: t.CInt - def get_a(self) -> t.CInt: pass - -class Child(Parent): - b: t.CInt - def get_sum(self) -> t.CInt: pass - -class Base: - x: t.CInt - def base_val(self) -> t.CInt: pass - -class Mid(Base): - y: t.CInt - def mid_val(self) -> t.CInt: pass - -class Leaf(Mid): - z: t.CInt - def leaf_val(self) -> t.CInt: pass - -val: myint = 42 -class NetHeader: - magic: t.CInt | t.BigEndian - length: t.CShort | t.BigEndian - normal: t.CInt - -class TtPoint(tt.CStruct): - x: t.CInt - y: t.CInt - -@tt.Object -class TtObject: - val: t.CInt - def get_val(self) -> t.CInt: pass - -class CsPoint(cs): - x: t.CInt - y: t.CInt - -class TtUnion(tt.CUnion): - a: t.CInt - b: t.CFloat - -@tt.Object -class TtEmptyObject: - val: t.CInt - -def main() -> t.CInt: pass - diff --git a/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/EdgeCaseTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/ForAndLoopTest/.tpv_build/temp/_sha1_map.txt b/Test/ForAndLoopTest/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index a3bb76d..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,13 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -989dba6e92235032:includes/stdlib.vp -b8970f3b6886efa6:includes/string.vp -7e4672b992208969:includes/memhub.vp -748d0424e8976fa0:includes/testcheck.vp -e94ef9e139461915:includes/_list.vp -001947a1f780bd5f:includes/builtins.vp -f5522571bcce7bcb:includes/stdint.vp -aa246c6e6aa30484:includes/atom.vp -2c175afd85852faf:includes/viperio.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -e710417730391023:includes/w32/win32base.vp -918064226d2858b3:main.vp diff --git a/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.deps.txt b/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.deps.txt deleted file mode 100644 index b092476..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c \ No newline at end of file diff --git a/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.vpi b/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.vpi deleted file mode 100644 index 850204b..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/aa/aa246c6e6aa30484.vpi +++ /dev/null @@ -1,22 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -ATOMIC_RELAXED: t.CDefine = 0 -ATOMIC_CONSUME: t.CDefine = 1 -ATOMIC_ACQUIRE: t.CDefine = 2 -ATOMIC_RELEASE: t.CDefine = 3 -ATOMIC_ACQ_REL: t.CDefine = 4 -ATOMIC_SEQ_CST: t.CDefine = 5 -def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass - -def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass - -def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass - -def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass - -def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - -def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - diff --git a/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/ForAndLoopTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/G4/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/G4/.tpv_build/temp/_sha1_map.txt b/Test/G4/.tpv_build/temp/_sha1_map.txt index 716e3d8..99c08c4 100644 --- a/Test/G4/.tpv_build/temp/_sha1_map.txt +++ b/Test/G4/.tpv_build/temp/_sha1_map.txt @@ -1,15 +1,15 @@ 09c0472e6fd0d088:includes/stdio.vp 989dba6e92235032:includes/stdlib.vp -7e4672b992208969:includes/memhub.vp +1819d836dcee9afa:includes/memhub.vp dbd53aaa91309ba1:includes/g4node.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp -f5522571bcce7bcb:includes/stdint.vp -b8970f3b6886efa6:includes/string.vp +23899f9254639ba7:includes/testcheck.vp +50b9991a98ff2dd5:includes/builtins.vp +d856ba5f6f074f04:includes/stdint.vp +4a42e6e4a0818b1e:includes/string.vp aa246c6e6aa30484:includes/atom.vp 2c175afd85852faf:includes/viperio.vp e94ef9e139461915:includes/_list.vp -a5e9a83e9db303ad:includes/linkedlist.vp +8e92345fd262a343:includes/linkedlist.vp db613a1bd6a3ca26:includes/w32/win32console.vp e710417730391023:includes/w32/win32base.vp a45655b992cc8767:caller1.vp diff --git a/Test/G4/.tpv_build/temp/a4/a45655b992cc8767.vpi b/Test/G4/.tpv_build/temp/a4/a45655b992cc8767.vpi index a8e6676..98a4219 100644 --- a/Test/G4/.tpv_build/temp/a4/a45655b992cc8767.vpi +++ b/Test/G4/.tpv_build/temp/a4/a45655b992cc8767.vpi @@ -8,6 +8,4 @@ import stdlib import memhub from g4node import G4Node, new_g4node def caller1_make_chain(pool: memhub.MemBuddy | t.CPtr) -> G4Node | t.CPtr: pass - def caller1_sum_chain(head: G4Node | t.CPtr) -> t.CInt: pass - diff --git a/Test/G4/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt b/Test/G4/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt deleted file mode 100644 index 103beac..0000000 --- a/Test/G4/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdint \ No newline at end of file diff --git a/Test/G4/.tpv_build/temp/aa/aa246c6e6aa30484.vpi b/Test/G4/.tpv_build/temp/aa/aa246c6e6aa30484.vpi index 850204b..be87c45 100644 --- a/Test/G4/.tpv_build/temp/aa/aa246c6e6aa30484.vpi +++ b/Test/G4/.tpv_build/temp/aa/aa246c6e6aa30484.vpi @@ -9,14 +9,8 @@ ATOMIC_RELEASE: t.CDefine = 3 ATOMIC_ACQ_REL: t.CDefine = 4 ATOMIC_SEQ_CST: t.CDefine = 5 def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass - def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass - def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - diff --git a/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/G4/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/G5/.tpv_build/temp/5c/5c5f2d19bc9e75ab.vpi b/Test/G5/.tpv_build/temp/5c/5c5f2d19bc9e75ab.vpi index 4bdaa0e..2517aa8 100644 --- a/Test/G5/.tpv_build/temp/5c/5c5f2d19bc9e75ab.vpi +++ b/Test/G5/.tpv_build/temp/5c/5c5f2d19bc9e75ab.vpi @@ -13,22 +13,14 @@ from linkedlist import GSListNode, GSList class G5Node(GSListNode[G5Node]): Value: t.CInt def __init__(self): pass - GSLIST_SIZE: t.CDefine = 24 @t.NoVTable class G5ListWrapper: List: GSList[G5Node] | t.CPtr def __init__(self, pool: memhub.MemBuddy | t.CPtr): pass - def test_g5node_create(): pass - def test_g5node_next(): pass - def test_gslist_create(): pass - def test_gslist_append(): pass - def test_wrapper_list_field(): pass - def main() -> t.CInt: pass - diff --git a/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/G5/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/G5/.tpv_build/temp/_sha1_map.txt b/Test/G5/.tpv_build/temp/_sha1_map.txt index 288a253..48a4344 100644 --- a/Test/G5/.tpv_build/temp/_sha1_map.txt +++ b/Test/G5/.tpv_build/temp/_sha1_map.txt @@ -1,12 +1,12 @@ 09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp +23899f9254639ba7:includes/testcheck.vp 989dba6e92235032:includes/stdlib.vp -7e4672b992208969:includes/memhub.vp -b8970f3b6886efa6:includes/string.vp -a5e9a83e9db303ad:includes/linkedlist.vp -001947a1f780bd5f:includes/builtins.vp +1819d836dcee9afa:includes/memhub.vp +4a42e6e4a0818b1e:includes/string.vp +8e92345fd262a343:includes/linkedlist.vp +50b9991a98ff2dd5:includes/builtins.vp db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp +d856ba5f6f074f04:includes/stdint.vp aa246c6e6aa30484:includes/atom.vp 2c175afd85852faf:includes/viperio.vp e94ef9e139461915:includes/_list.vp diff --git a/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt b/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt deleted file mode 100644 index 103beac..0000000 --- a/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdint \ No newline at end of file diff --git a/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi b/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi deleted file mode 100644 index 4031ba3..0000000 --- a/Test/G5/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi +++ /dev/null @@ -1,64 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -from stdint import * -@t.NoVTable -class LinkedNode: - next: 'LinkedNode' | t.CPtr - prev: 'LinkedNode' | t.CPtr - child: 'LinkedNode' | t.CPtr - last_child: 'LinkedNode' | t.CPtr - parent: 'LinkedNode' | t.CPtr - child_count: t.CSizeT - def append(self, node: 'LinkedNode' | t.CPtr): pass - def prepend(self, node: 'LinkedNode' | t.CPtr): pass - def insert_before(self, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr): pass - def insert_after(self, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr): pass - def remove_child(self, node: 'LinkedNode' | t.CPtr): pass - def detach(self): pass - def unlink(self): pass - def has_children(self) -> t.CInt: pass - def child_at(self, index: t.CSizeT) -> 'LinkedNode' | t.CPtr: pass - def count_children(self) -> t.CSizeT: pass - def first_sibling(self) -> 'LinkedNode' | t.CPtr: pass - def last_sibling(self) -> 'LinkedNode' | t.CPtr: pass - -@t.NoVTable -class SListNode: - Next: 'SListNode' | t.CPtr - def append(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def append_after(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def count(self) -> t.CSizeT: pass - def at(self, index: t.CSizeT) -> 'SListNode' | t.CPtr: pass - def remove(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - -@t.NoVTable -class GSListNode[T]: - Next: T | t.CPtr - -@t.NoVTable -class GSList[T]: - Head: T | t.CPtr - Tail: T | t.CPtr - Count: t.CSizeT - def __init__(self): pass - def append(self, node: T): pass - def count(self) -> t.CSizeT: pass - def at(self, index: t.CSizeT) -> T | t.CPtr: pass - -@t.NoVTable -class GTreeNode[T]: - Next: T | t.CPtr - Prev: T | t.CPtr - Child: T | t.CPtr - LastChild: T | t.CPtr - Parent: T | t.CPtr - Count: t.CSizeT - def append(self, node: T | t.CPtr): pass - def prepend(self, node: T | t.CPtr): pass - def detach(self): pass - def has_children(self) -> t.CInt: pass - def child_at(self, index: t.CSizeT) -> T | t.CPtr: pass - def count_children(self) -> t.CSizeT: pass - diff --git a/Test/G5/.tpv_build/temp/aa/aa246c6e6aa30484.vpi b/Test/G5/.tpv_build/temp/aa/aa246c6e6aa30484.vpi index 850204b..be87c45 100644 --- a/Test/G5/.tpv_build/temp/aa/aa246c6e6aa30484.vpi +++ b/Test/G5/.tpv_build/temp/aa/aa246c6e6aa30484.vpi @@ -9,14 +9,8 @@ ATOMIC_RELEASE: t.CDefine = 3 ATOMIC_ACQ_REL: t.CDefine = 4 ATOMIC_SEQ_CST: t.CDefine = 5 def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass - def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass - def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - diff --git a/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/G5/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/G7/.tpv_build/temp/12/12c1b8e59d117476.vpi b/Test/G7/.tpv_build/temp/12/12c1b8e59d117476.vpi index 9b89ab3..8af53d7 100644 --- a/Test/G7/.tpv_build/temp/12/12c1b8e59d117476.vpi +++ b/Test/G7/.tpv_build/temp/12/12c1b8e59d117476.vpi @@ -10,6 +10,4 @@ import memhub from conflict_node import Value Value: t.CPtr = None def test_value_struct_fields(): pass - def main() -> t.CInt: pass - diff --git a/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/G7/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/G7/.tpv_build/temp/_sha1_map.txt b/Test/G7/.tpv_build/temp/_sha1_map.txt index 6de0af7..1eaef9e 100644 --- a/Test/G7/.tpv_build/temp/_sha1_map.txt +++ b/Test/G7/.tpv_build/temp/_sha1_map.txt @@ -1,15 +1,15 @@ 09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp +23899f9254639ba7:includes/testcheck.vp 989dba6e92235032:includes/stdlib.vp -7e4672b992208969:includes/memhub.vp +1819d836dcee9afa:includes/memhub.vp d76710b4e0707c91:includes/conflict_node.vp -001947a1f780bd5f:includes/builtins.vp +50b9991a98ff2dd5:includes/builtins.vp db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp -b8970f3b6886efa6:includes/string.vp +d856ba5f6f074f04:includes/stdint.vp +4a42e6e4a0818b1e:includes/string.vp aa246c6e6aa30484:includes/atom.vp 2c175afd85852faf:includes/viperio.vp e94ef9e139461915:includes/_list.vp -a5e9a83e9db303ad:includes/linkedlist.vp +8e92345fd262a343:includes/linkedlist.vp e710417730391023:includes/w32/win32base.vp 12c1b8e59d117476:main.vp diff --git a/Test/G7/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt b/Test/G7/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt deleted file mode 100644 index 103beac..0000000 --- a/Test/G7/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdint \ No newline at end of file diff --git a/Test/G7/.tpv_build/temp/aa/aa246c6e6aa30484.vpi b/Test/G7/.tpv_build/temp/aa/aa246c6e6aa30484.vpi index 850204b..be87c45 100644 --- a/Test/G7/.tpv_build/temp/aa/aa246c6e6aa30484.vpi +++ b/Test/G7/.tpv_build/temp/aa/aa246c6e6aa30484.vpi @@ -9,14 +9,8 @@ ATOMIC_RELEASE: t.CDefine = 3 ATOMIC_ACQ_REL: t.CDefine = 4 ATOMIC_SEQ_CST: t.CDefine = 5 def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass - def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass - def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass - def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass - diff --git a/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/G7/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/GenericTest2/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/GenericTest2/.tpv_build/temp/_sha1_map.txt b/Test/GenericTest2/.tpv_build/temp/_sha1_map.txt index 849f4bf..fa182a3 100644 --- a/Test/GenericTest2/.tpv_build/temp/_sha1_map.txt +++ b/Test/GenericTest2/.tpv_build/temp/_sha1_map.txt @@ -1,7 +1,7 @@ 09c0472e6fd0d088:includes/stdio.vp -748d0424e8976fa0:includes/testcheck.vp -001947a1f780bd5f:includes/builtins.vp +23899f9254639ba7:includes/testcheck.vp +50b9991a98ff2dd5:includes/builtins.vp db613a1bd6a3ca26:includes/w32/win32console.vp -f5522571bcce7bcb:includes/stdint.vp +d856ba5f6f074f04:includes/stdint.vp e710417730391023:includes/w32/win32base.vp bdfc8bd243b7e5b7:main.vp diff --git a/Test/GenericTest2/.tpv_build/temp/bd/bdfc8bd243b7e5b7.vpi b/Test/GenericTest2/.tpv_build/temp/bd/bdfc8bd243b7e5b7.vpi index 932bfcf..0369768 100644 --- a/Test/GenericTest2/.tpv_build/temp/bd/bdfc8bd243b7e5b7.vpi +++ b/Test/GenericTest2/.tpv_build/temp/bd/bdfc8bd243b7e5b7.vpi @@ -6,13 +6,9 @@ import stdio import c import testcheck def square(x: T) -> T: pass - def test_generic_square_types(): pass - def clamp(val: T, lo: T, hi: T) -> T: pass - def test_generic_clamp(): pass - class Stack[T]: data: t.CArray[t.CInt, 16] top: t.CInt @@ -22,34 +18,23 @@ class Stack[T]: def is_empty(self) -> t.CInt: pass def size_of(self) -> t.CSizeT: pass def type_size(self) -> t.CSizeT: pass - def test_generic_stack(): pass - class IntPair: a: t.CInt b: t.CInt - def generic_swap(p: IntPair | t.CPtr): pass - def test_generic_swap(): pass - class Range[T]: start: T end_val: T step: T def __init__(self, s: T, e: T, st: T): pass def sum_all(self) -> T: pass - def test_generic_range(): pass - def array_sum(arr: t.CArray[t.CInt, 8], n: t.CInt) -> t.CInt: pass - def test_generic_array_sum(): pass - def max_of_three(a: T, b: T, c_val: T) -> T: pass - def test_generic_max_three(): pass - class Container[T]: values: t.CArray[t.CInt, 8] size: t.CInt @@ -58,22 +43,14 @@ class Container[T]: def get(self, idx: t.CInt) -> T: pass def contains(self, v: T) -> t.CInt: pass def total(self) -> T: pass - def test_generic_container(): pass - def factorial(n: T) -> T: pass - def test_generic_factorial(): pass - class Accumulator[T]: total: T def __init__(self, start: T): pass def add_val(self, v: T): pass def get_result(self) -> T: pass - def test_generic_accumulator(): pass - def test_generic_sizeof_bug(): pass - def main() -> t.CInt: pass - diff --git a/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/GenericTest2/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/Test/GenericTest4/.tpv_build/temp/42/42e09c6149524d9d.vpi b/Test/GenericTest4/.tpv_build/temp/42/42e09c6149524d9d.vpi deleted file mode 100644 index 8d40d76..0000000 --- a/Test/GenericTest4/.tpv_build/temp/42/42e09c6149524d9d.vpi +++ /dev/null @@ -1,32 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -import stdio -import testcheck -class Box[T]: - value: T - def __init__(self, v: T): pass - def get(self) -> T: pass - def set(self, v: T): pass -def test_explicit_box(): pass -class Pair[T1, T2]: - first: T1 - second: T2 - def __init__(self, a: T1, b: T2): pass - def sum_as_int(self) -> t.CInt: pass -def test_explicit_pair(): pass -class Wrapper[T]: - data: T - def __init__(self, v: T): pass - def get(self) -> T: pass -def test_mixed_generic_class(): pass -class Counter[T]: - count: T - def __init__(self, start: T): pass - def increment(self): pass - def get_count(self) -> T: pass -def test_explicit_counter(): pass -def test_explicit_box_set(): pass -def main() -> t.CInt: pass diff --git a/Test/GenericTest4/.tpv_build/temp/_sha1_map.txt b/Test/GenericTest4/.tpv_build/temp/_sha1_map.txt deleted file mode 100644 index c29d8d1..0000000 --- a/Test/GenericTest4/.tpv_build/temp/_sha1_map.txt +++ /dev/null @@ -1,7 +0,0 @@ -09c0472e6fd0d088:includes/stdio.vp -23899f9254639ba7:includes/testcheck.vp -50b9991a98ff2dd5:includes/builtins.vp -db613a1bd6a3ca26:includes/w32/win32console.vp -d856ba5f6f074f04:includes/stdint.vp -e710417730391023:includes/w32/win32base.vp -42e09c6149524d9d:main.vp diff --git a/Test/NewAstTest/.tpv_build/temp/_sha1_map.txt b/Test/NewAstTest/.tpv_build/temp/_sha1_map.txt index ed8cf0d..c0a645c 100644 --- a/Test/NewAstTest/.tpv_build/temp/_sha1_map.txt +++ b/Test/NewAstTest/.tpv_build/temp/_sha1_map.txt @@ -1,21 +1,21 @@ 09c0472e6fd0d088:includes/stdio.vp -7e4672b992208969:includes/memhub.vp +1819d836dcee9afa:includes/memhub.vp 989dba6e92235032:includes/stdlib.vp -b8970f3b6886efa6:includes/string.vp -6394599d6a61cabf:includes/ast/__init__.vp -001947a1f780bd5f:includes/builtins.vp -f5522571bcce7bcb:includes/stdint.vp +4a42e6e4a0818b1e:includes/string.vp +3571eabe5a83d798:includes/ast/__init__.vp +e94ef9e139461915:includes/_list.vp +50b9991a98ff2dd5:includes/builtins.vp +d856ba5f6f074f04:includes/stdint.vp aa246c6e6aa30484:includes/atom.vp 2c175afd85852faf:includes/viperio.vp -e94ef9e139461915:includes/_list.vp -eb09ac7f10988a63:includes/ast/tokens.vp -e9dfb296a8674aee:includes/ast/base.vp -4618d74293c6746a:includes/ast/stmts.vp -c0def010dcebadb1:includes/ast/exprs.vp -34dc6a647fa19b7b:includes/ast/astaux.vp -3b2a307c9c7d0129:includes/ast/match.vp -43ee0269efffadc3:includes/ast/lexer.vp -df83e214ee82d0f3:includes/ast/parser.vp +3c774069d112cc3f:includes/ast/tokens.vp +7565e081d88517ac:includes/ast/base.vp +ebe3b1f219d7b887:includes/ast/stmts.vp +12bc7ec9063821df:includes/ast/exprs.vp +7ebdc3bbda127a46:includes/ast/astaux.vp +ad445c65d2ac295a:includes/ast/match.vp +58d97de24b40f9dc:includes/ast/lexer.vp +269b410a8b96c1f5:includes/ast/parser.vp 95a546a38b5b6316:includes/viperlib.vp cf900a640e6eeff3:includes/stdarg.vp 4175f14c5fbef360:main.vp diff --git a/Test/NewAstTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/NewAstTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/NewAstTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/NewAstTest/App/main.vp b/Test/NewAstTest/App/main.vp index 3765416..9699dbc 100644 --- a/Test/NewAstTest/App/main.vp +++ b/Test/NewAstTest/App/main.vp @@ -1648,10 +1648,10 @@ class C(Base1, Base2): m_complex_mod: Module | CPtr = parse(m_complex_src, pool) if m_complex_mod is not None: dump(m_complex_mod, dump_buf, DUMP_BUF_SIZE) - has_c_mv: str = string.strstr(dump_buf, "MatchValue(") + has_c_mv: str = string.strstr(dump_buf, "MatchValue(") has_c_msq: str = string.strstr(dump_buf, "MatchSequence(") - has_c_mc: str = string.strstr(dump_buf, "MatchClass(") - has_c_ma: str = string.strstr(dump_buf, "MatchAs(") + has_c_mc: str = string.strstr(dump_buf, "MatchClass(") + has_c_ma: str = string.strstr(dump_buf, "MatchAs(") if has_c_mv is not None and has_c_msq is not None and \ has_c_mc is not None and has_c_ma is not None: passed += 1 diff --git a/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt b/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt deleted file mode 100644 index acdf15c..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdio w32.win32console \ No newline at end of file diff --git a/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.vpi b/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.vpi deleted file mode 100644 index 4703a33..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/74/748d0424e8976fa0.vpi +++ /dev/null @@ -1,27 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CInt = 0 -_fail_count: t.CInt = 0 -_total_pass: t.CInt = 0 -_total_fail: t.CInt = 0 -def begin(name: str): pass - -def section(name: str): pass - -def ok(msg: str): pass - -def fail(msg: str): pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str): pass - -def info(msg: str): pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass - diff --git a/Test/NoVTableTest/.tpv_build/temp/_sha1_map.txt b/Test/NoVTableTest/.tpv_build/temp/_sha1_map.txt index 3c6e217..bbbabca 100644 --- a/Test/NoVTableTest/.tpv_build/temp/_sha1_map.txt +++ b/Test/NoVTableTest/.tpv_build/temp/_sha1_map.txt @@ -1,11 +1,11 @@ 09c0472e6fd0d088:includes/stdio.vp -b8970f3b6886efa6:includes/string.vp -748d0424e8976fa0:includes/testcheck.vp -a5e9a83e9db303ad:includes/linkedlist.vp +4a42e6e4a0818b1e:includes/string.vp +23899f9254639ba7:includes/testcheck.vp +8e92345fd262a343:includes/linkedlist.vp 95a546a38b5b6316:includes/viperlib.vp 989dba6e92235032:includes/stdlib.vp -001947a1f780bd5f:includes/builtins.vp -f5522571bcce7bcb:includes/stdint.vp +50b9991a98ff2dd5:includes/builtins.vp +d856ba5f6f074f04:includes/stdint.vp db613a1bd6a3ca26:includes/w32/win32console.vp 2c175afd85852faf:includes/viperio.vp cf900a640e6eeff3:includes/stdarg.vp diff --git a/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt b/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt deleted file mode 100644 index 103beac..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t c stdint \ No newline at end of file diff --git a/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi b/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi deleted file mode 100644 index 4031ba3..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/a5/a5e9a83e9db303ad.vpi +++ /dev/null @@ -1,64 +0,0 @@ -"""Auto-generated Python stub file""" - - -import t, c -from stdint import * -@t.NoVTable -class LinkedNode: - next: 'LinkedNode' | t.CPtr - prev: 'LinkedNode' | t.CPtr - child: 'LinkedNode' | t.CPtr - last_child: 'LinkedNode' | t.CPtr - parent: 'LinkedNode' | t.CPtr - child_count: t.CSizeT - def append(self, node: 'LinkedNode' | t.CPtr): pass - def prepend(self, node: 'LinkedNode' | t.CPtr): pass - def insert_before(self, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr): pass - def insert_after(self, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr): pass - def remove_child(self, node: 'LinkedNode' | t.CPtr): pass - def detach(self): pass - def unlink(self): pass - def has_children(self) -> t.CInt: pass - def child_at(self, index: t.CSizeT) -> 'LinkedNode' | t.CPtr: pass - def count_children(self) -> t.CSizeT: pass - def first_sibling(self) -> 'LinkedNode' | t.CPtr: pass - def last_sibling(self) -> 'LinkedNode' | t.CPtr: pass - -@t.NoVTable -class SListNode: - Next: 'SListNode' | t.CPtr - def append(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def append_after(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def count(self) -> t.CSizeT: pass - def at(self, index: t.CSizeT) -> 'SListNode' | t.CPtr: pass - def remove(self, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - -@t.NoVTable -class GSListNode[T]: - Next: T | t.CPtr - -@t.NoVTable -class GSList[T]: - Head: T | t.CPtr - Tail: T | t.CPtr - Count: t.CSizeT - def __init__(self): pass - def append(self, node: T): pass - def count(self) -> t.CSizeT: pass - def at(self, index: t.CSizeT) -> T | t.CPtr: pass - -@t.NoVTable -class GTreeNode[T]: - Next: T | t.CPtr - Prev: T | t.CPtr - Child: T | t.CPtr - LastChild: T | t.CPtr - Parent: T | t.CPtr - Count: t.CSizeT - def append(self, node: T | t.CPtr): pass - def prepend(self, node: T | t.CPtr): pass - def detach(self): pass - def has_children(self) -> t.CInt: pass - def child_at(self, index: t.CSizeT) -> T | t.CPtr: pass - def count_children(self) -> t.CSizeT: pass - diff --git a/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt b/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt deleted file mode 100644 index 32f64f4..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.deps.txt +++ /dev/null @@ -1 +0,0 @@ -t \ No newline at end of file diff --git a/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi b/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi deleted file mode 100644 index 7871c20..0000000 --- a/Test/NoVTableTest/.tpv_build/temp/f5/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,95 +0,0 @@ -"""Auto-generated Python stub file""" - -import c - -import t -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool diff --git a/wiki/02-type-system.md b/wiki/02-type-system.md index d4bcaef..b5ccfb0 100644 --- a/wiki/02-type-system.md +++ b/wiki/02-type-system.md @@ -158,84 +158,6 @@ Viper 的类型系统通过 `t` 模块提供,所有类型注解继承 `t.CType | `t.CUIntPtrT` | `uintptr_t` | 64 | 否 | | `t.CPtrDiffT` | `ptrdiff_t` | 64 | 是 | -### stdint 短名别名 - -Viper 在 `stdint` 模块中提供了更简短的类型别名,通过 `t.CTypedef` 映射到对应的完整类型。使用时需 `import stdint`。 - -#### 固定宽度整数短名 - -| 短名 | 等价 Viper 类型 | C 等价 | -|------|----------------|--------| -| `INT8` | `t.CInt8T` | `int8_t` | -| `INT16` | `t.CInt16T` | `int16_t` | -| `INT32` | `t.CInt32T` | `int32_t` | -| `INT64` | `t.CInt64T` | `int64_t` | -| `UINT8` | `t.CUInt8T` | `uint8_t` | -| `UINT16` | `t.CUInt16T` | `uint16_t` | -| `UINT32` | `t.CUInt32T` | `uint32_t` | -| `UINT64` | `t.CUInt64T` | `uint64_t` | - -#### 固定宽度指针短名 - -| 短名 | 等价 Viper 类型 | C 等价 | -|------|----------------|--------| -| `INT8PTR` | `t.CInt8T \| t.CPtr` | `int8_t*` | -| `INT16PTR` | `t.CInt16T \| t.CPtr` | `int16_t*` | -| `INT32PTR` | `t.CInt32T \| t.CPtr` | `int32_t*` | -| `INT64PTR` | `t.CInt64T \| t.CPtr` | `int64_t*` | -| `UINT8PTR` | `t.CUInt8T \| t.CPtr` | `uint8_t*` | -| `UINT16PTR` | `t.CUInt16T \| t.CPtr` | `uint16_t*` | -| `UINT32PTR` | `t.CUInt32T \| t.CPtr` | `uint32_t*` | -| `UINT64PTR` | `t.CUInt64T \| t.CPtr` | `uint64_t*` | - -#### 字符类型短名 - -| 短名 | 等价 Viper 类型 | C 等价 | -|------|----------------|--------| -| `CHAR8` | `t.CChar8T` | `char8_t` | -| `CHAR16` | `t.CChar16T` | `char16_t` | -| `CHAR32` | `t.CChar32T` | `char32_t` | -| `CHAR8PTR` | `t.CChar8T \| t.CPtr` | `char8_t*` | -| `CHAR16PTR` | `t.CChar16T \| t.CPtr` | `char16_t*` | -| `CHAR32PTR` | `t.CChar32T \| t.CPtr` | `char32_t*` | - -#### 基本类型短名 - -| 短名 | 等价 Viper 类型 | C 等价 | -|------|----------------|--------| -| `INT` | `t.CInt` | `int` | -| `UINT` | `t.CUnsignedInt` | `unsigned int` | -| `BOOL` | `t.CInt` | `int`(0/1) | -| `SHORT` | `t.CShort` | `short` | -| `USHORT` | `t.CUnsignedShort` | `unsigned short` | -| `LONG` | `t.CLong` | `long` | -| `ULONG` | `t.CUnsignedLong` | `unsigned long` | -| `LONGLONG` | `t.CLong \| t.CLong` | `long long` | -| `ULONGLONG` | `t.CUnsignedLong \| t.CLong` | `unsigned long long` | -| `FLOAT` | `t.CFloat` | `float` | -| `DOUBLE` | `t.CDouble` | `double` | - -#### 平台 / Windows 风格短名 - -| 短名 | 等价 Viper 类型 | C 等价 | -|------|----------------|--------| -| `BYTE` | `t.CUnsignedChar` | `unsigned char`(8位) | -| `BYTEPTR` | `BYTE \| t.CPtr` | `unsigned char*` | -| `WORD` | `t.CUInt16T` | `uint16_t`(16位) | -| `DWORD` | `t.CUInt32T` | `uint32_t`(32位) | -| `QWORD` | `t.CUInt64T` | `uint64_t`(64位) | -| `INTPTR` | `t.CInt \| t.CPtr` | `int*` | -| `UINTPTR` | `t.CUnsignedInt \| t.CPtr` | `unsigned int*` | -| `SHORTPTR` | `t.CShort \| t.CPtr` | `short*` | -| `USHORTPTR` | `t.CUnsignedShort \| t.CPtr` | `unsigned short*` | -| `VOIDPTR` | `t.CVoid \| t.CPtr` | `void*` | -| `TCHAR` | `t.CChar` | `char` | -| `WCHAR` | `WORD` | `uint16_t`(UTF-16) | -| `WCHARPTR` | `WORD \| t.CPtr` | `uint16_t*`(UTF-16) | -| `CHARLIST` | `str \| t.CPtr` | `char*` | -| `FSIZE_t` | `DWORD` | `uint32_t` | -| `LBA_t` | `DWORD` | `uint32_t` | - ### 浮点类型 | Viper 类型 | C 等价 | 大小(位) | @@ -248,7 +170,7 @@ Viper 在 `stdint` 模块中提供了更简短的类型别名,通过 `t.CTyped | Viper 类型 | C 等价 | 说明 | |------------|--------|------| | `t.CVoid` | `void` | 空类型 | -| `t.CBool` | `bool` | 布尔类型(8位) | +| `t.CBool` | `bool` | 布尔类型(LLVM i1,1 位;C _Bool 存储 1 字节) | | `t.CWCharT` | `wchar_t` | 宽字符(32位) | | `t.CChar8T` | `char8_t` | UTF-8 字符(8位,无符号) | | `t.CChar16T` | `char16_t` | UTF-16 字符(16位,无符号) | @@ -263,13 +185,23 @@ Viper 在 `stdint` 模块中提供了更简短的类型别名,通过 `t.CTyped |`bool`|`t.CBool`|-| |`True`|`t.CBool`|`1`| |`False`|`t.CBool`|`0`| -|`None`|`NULL`|`t.CIntPtr(0)`| +|`None`|`NULL`|`i8* NULL 常量(语义 NULL/零值)`| -对于 t.py 和 c.py 的引用,必须使用 import,不能使用 from ... import ...,也不能使用 as,因为这两者都是直接以字符串识别的。 +> 注:`True`/`False` 裸字面量在 LLVM 层为 i32 的 1/0;赋给 `bool`/`t.CBool`(i1)注解变量时,经比较归一化为 i1。 + +对于 t.py 和 c.py 的引用,支持 from ... import ... 与 as 别名(编译器自身大量依赖)。 ## 类型组合 -Viper 使用 Python 的 `|` 来组合类型修饰符(TypeUnion),其仅在左值注解中有效,其它位置均为位或语义(至少重载前是这样的),这是 Viper 最重要的语法特性之一。 +Viper 使用 Python 的 `|` 来组合类型修饰符(TypeUnion):`|` 在类型/注解上下文(参数、返回、字段、typedef、强转表达式)中表示组合,在值表达式上下文中为位或。这是 Viper 最重要的语法特性之一。 + +> **规划演进(新语法方向,尚未实现)**: +> - `t.CConst | t.CInt | t.CPtr` 这类链式组合过于冗长且不符合标准语义,**即将被取消(暂未取消,过渡期仍可用)**,改为贴近 C 的写法: +> - `a: const rawptr[int] = xxx`(rawptr = 裸指针,与 `t.CPtr[T]` 等价;规范命名为 **rawptr**——现编译器内置保留字写作 `rowptr[T]` 属笔误,将修正为 rawptr) +> - 或 `a: const int* = xxx`(C 风格指针/const 前缀类型注解) +> - `T1 | T2` 将**在基本类型间完全禁用**;`|` 转回其本意 **TypeUnion(类型联合)**。 +> - 引入 `T1 & T2` = **TypeIntersection(类型交集)**,主要面向 `object`,尤其是带 vtable 的 `object`。 +> - 基本类型联合(如 `a: int | str`)是否支持仍需考虑,目前只期望未来先针对 `object` 落实联合/交集。 ### 指针类型 @@ -312,6 +244,8 @@ int** pp2; ### 类型限定符组合 +> 规划:本节 `t.CConst | T`/`t.CConst | T | t.CPtr` 链式写法将随上述演进被 `const rawptr[int]`/`const int*` 取代(当前仍可用)。 + ```python x: t.CConst | t.CInt # const int p: t.CConst | t.CChar | t.CPtr # const char* @@ -324,6 +258,8 @@ x: t.CStatic | t.CInt # static int f: t.CExtern | t.CInt # extern int(声明其存在于外部) ``` +> 注:变量级 `static`/`extern` 语义尚未实现(仅函数级);上述声明当前会生成普通(零初始化)全局定义。外部全局与 FFI 函数推荐使用 `extern` 关键字(期望后续实现变量级语义)。 + ### 函数返回类型组合 ```python @@ -358,14 +294,16 @@ HANDLE CreateFileA(LPCSTR, ULONG, ULONG, SECURITY_ATTRIBUTES*, ULONG, ULONG, HAN ## 数组类型 -使用 Python 的 `list[ElementType, Size]` 语法表示固定大小数组(通常的,这用于栈上和 BSS 段上): +固定大小数组使用 `t.CArray[ElemType, Size]`(= rawarray)表示(通常用于栈上和 BSS 段上)。`Size` 可为模块级 `t.CDefine` 常量;单参 `t.CArray[Elem]` 可配合列表字面量推断长度;也支持多维嵌套。注意:`list[Elem, N]` 旧写法已不再表示定长数组(`list[...]` 现为泛型容器): ```python -buf: list[t.CChar, 64] # char buf[64] -ids: list[t.CInt, 10] # int ids[10] -matrix: list[t.CFloat, 16] # float matrix[16] -entries: list[idt_entry, 256] # struct idt_entry entries[256] -s: list[t.CChar, None] # 自推长度 char s[]; +buf: t.CArray[t.CChar, 64] # char buf[64] +ids: t.CArray[t.CInt, 10] # int ids[10] +matrix: t.CArray[t.CFloat, 16] # float matrix[16] +entries: t.CArray[idt_entry, 256] # struct idt_entry entries[256]; +s: t.CArray[t.CChar] = [0x68, 0x69] # char s[] = {0x68, 0x69}; 由列表字面量推断长度 2 +grid: t.CArray[t.CArray[t.CFloat, 4], 8] # float grid[8][4]; 多维嵌套 +seg: t.CArray[t.CChar, BUF_SIZE] # char seg[BUF_SIZE]; Size 可为模块级 t.CDefine 常量 ``` 等价 C 代码: @@ -379,7 +317,7 @@ struct idt_entry entries[256]; ### 数组指针和函数指针 ```python -lp: list[t.CInt, 12] | t.CPtr +lp: t.CArray[t.CInt, 12] | t.CPtr vp: t.Callable[[t.CInt, t.CInt], t.CInt] = x # 其中 t.Callable = typing.Callable,可以直接使用。 ``` diff --git a/wiki/03-variables.md b/wiki/03-variables.md index 684e8d1..341170c 100644 --- a/wiki/03-variables.md +++ b/wiki/03-variables.md @@ -9,18 +9,24 @@ Viper 的变量声明使用 Python 的类型注解语法,通过 `t` 模块指 ```python x: t.CInt = 0 # int x = 0; y: t.CUInt32T = 42 # uint32_t y = 42; -name: list[t.CChar, 64] # char name[64]; +name: t.CArray[t.CChar, 64] # char name[64]; ptr: t.CVoid | t.CPtr # void* ptr; msg: t.CConst | str = "Hello" # const char* msg = "Hello"; ``` ### 无初始值的声明 -未赋值的变量声明会生成零初始化的变量,此处是未定义行为,即在不同环境位置可能会覆盖0,也可能不会,最好预先复制或用 memset 清除: +**模块级(全局)无初值声明**生成零初始化的全局变量(LLVM `zeroinitializer`,零初始化成立): ```python -count: t.CInt # int count = 0; -buffer: list[t.CChar, 256] # char buffer[256] = {0}; +count: t.CInt # int count = 0;(zeroinitializer;仅模块级成立) +buffer: t.CArray[t.CChar, 256] # char buffer[256] = {0}; +``` + +**函数内局部无初值声明**仅分配空间、不初始化——值未定义,勿假定为 0,最好预先赋值或用 memset 清除: + +```python +tmp: t.CInt # 函数内局部:仅分配未初始化(值未定义,勿假定为 0) ``` ### 延迟赋值 @@ -100,6 +106,8 @@ x: t.CStatic | t.CInt = 0 # static int x = 0; x: t.CExtern | t.CInt # extern int x; ``` +> 注:变量级 `static`/`extern` 语义尚未实现(仅函数级);上述声明当前会生成普通(零初始化)全局定义。外部全局与 FFI 函数推荐 `extern` 关键字(期望后续实现变量级语义)。 + ## 常量定义 使用 `t.CDefine` 定义编译时常量。`t.CDefine` 不是数据类型,而是编译时元指令——常量在 LLVM IR 中不生成全局变量,而是在引用处直接内联展开。详见 [01-overview.md 中 t.CDefine 深度解析](01-overview.md#tcdefine-深度解析)。 diff --git a/wiki/04-functions.md b/wiki/04-functions.md index 48da6aa..e5b5e82 100644 --- a/wiki/04-functions.md +++ b/wiki/04-functions.md @@ -36,20 +36,20 @@ void print_msg(const char* msg) { ### 导出函数 -` t.CExport` 控制函数的符号可见性——标记为 `t.CExport` 的函数不加 SHA1 前缀,全局可见。详见 [01-overview.md 中 t.CExport 深度解析](01-overview.md#tcexport-深度解析)。 +`export` 关键字控制函数的符号可见性——标记为 `export` 的函数不加 SHA1 前缀,裸名导出、全局可见。详见 [01-overview.md 中 t.CExport 深度解析](01-overview.md#tcexport-深度解析)。 ```python -def _start() -> t.CInt | t.CExport: +export def _start() -> t.CInt: return 0 ``` ### 外部函数声明 -使用 `c.State` 表示仅声明不定义: +使用 `extern` 关键字表示仅声明不定义: ```python -def isr0() -> t.CExtern | t.CVoid | c.State: pass -def isr1() -> t.CExtern | t.CVoid | c.State: pass +extern def isr0() -> t.CVoid: pass +extern def isr1() -> t.CVoid: pass ``` 等价 C 代码: @@ -58,9 +58,11 @@ extern void isr0(); extern void isr1(); ``` +> 注明:`t.State` / `t.CExtern` / `t.CExport` 注解旧写法已废弃(`t.State` 仅 `t.CEnum` 内部临时使用)。 + ### 内联函数 -`t.CInline` 标记函数为内联函数,编译器在调用点直接展开函数体。详见 [01-overview.md 中 t.CInline 深度解析](01-overview.md#tcinline-深度解析)。 +`t.CInline` 标记函数为内联函数。当前无调用点展开实现,`t.CInline` 仅作存储类标记;实际内联用 `@c.Attribute(t.attr.always_inline())`(期望后续支持)。详见 [01-overview.md 中 t.CInline 深度解析](01-overview.md#tcinline-深度解析)。 ```python def fast_add(a: t.CInt, b: t.CInt) -> t.CInt | t.CInline: @@ -69,7 +71,9 @@ def fast_add(a: t.CInt, b: t.CInt) -> t.CInt | t.CInline: ### 宏函数 -当函数返回类型注解包含 `t.CDefine` 时,该函数被视为宏函数,不生成 LLVM IR 函数定义,在调用处内联展开。详见 [01-overview.md 中 t.CDefine 函数](01-overview.md#tcdefine-函数)。 +宏函数存在两种形式:`def f(...) -> t.CDefine`,或 `define` 软关键字 `define f(...)`(自动追加 `t.CDefine` 返回注解);存根保留完整函数体;调用点按编译期内联宏展开(TPC 已实现,Test/DefineTest 实证)。详见 [01-overview.md 中 t.CDefine 函数](01-overview.md#tcdefine-函数)。 + +> 注明:TransPyV 端目前仅识别返回注解为 i32,调用点展开尚未对齐(期望)。 ```python def MAKE_FLAG(bit) -> t.CDefine: @@ -125,9 +129,11 @@ def foo() -> t.CInt | t.attr.llvm.nobuiltin | t.attr.llvm.nounwind: return 0 ``` +已支持:`always_inline` / `noinline` / `noreturn` / `pure` / `const` / `nounwind` / `noredzone` / `stackrealign` / `willreturn` / `mustprogress`;示例中的 `nobuiltin` 尚未映射(会被静默丢弃,期望支持)。 + ## 多返回值(CReturn) -使用 `@c.CReturn` 装饰器实现多返回值,通过指针参数实现: +使用 `@c.CReturn` 装饰器实现多返回值,返回多个值的函数打包为 LLVM struct 返回,调用处用元组解包 `a, b = f()` 接收: ```python @c.CReturn(t.CInt, t.CInt) @@ -135,14 +141,13 @@ def divmod(a: t.CInt, b: t.CInt) -> t.CVoid: q: t.CInt = a // b r: t.CInt = a % b return q, r + +q, r = divmod(a, b) ``` 规则: 1. `CReturn` 中的类型数量决定返回值个数 -2. 自动为每个返回类型添加指针参数(`t.CInt` → `t.CInt | t.CPtr`) -3. 参数名自动生成为 `__ReturnValue0__`、`__ReturnValue1__` 等 -4. 调用处自动传参 `&xxx` -5. 必须使用左右值赋值,返回值不能直接传入函数。 +2. 必须使用左右值(元组解包)赋值,返回值不能直接传入函数。 ## 指针参数 @@ -229,7 +234,7 @@ def init() -> t.CVoid: def add(x: int, y: int, z: int): return (x + y) * z -def main() -> int | t.CExport: +export def main() -> int: print(add(1, 2, 3)) # (1 + 2) * 3 = 9 ``` @@ -237,7 +242,7 @@ def main() -> int | t.CExport: ```python # 仍然用刚才的 add 举例 -def main() -> int | t.CExport: +export def main() -> int: print(add(z=3, x=1, y=2)) # (1 + 2) * 3 = 9 ``` @@ -247,7 +252,7 @@ def main() -> int | t.CExport: def add(x: int, y: int, z: int = 1): return (x + y) * z -def main() -> int | t.CExport: +export def main() -> int: print(add(1, 2)) # (1 + 2) * 1 = 3 ``` diff --git a/wiki/05-classes.md b/wiki/05-classes.md index 9217369..b5411e2 100644 --- a/wiki/05-classes.md +++ b/wiki/05-classes.md @@ -41,8 +41,10 @@ class idt_entry: ### 结构体数组 +定长数组语法:`arr: t.CArray[ElemType, Count] = []`。`t.CArray` / `rawarray` 是定长数组;`list[Elem, N]` 旧写法已不再表示定长数组。 + ```python -idt: list[idt_entry, 256] = [] +idt: t.CArray[idt_entry, 256] = [] ``` ### 结构体指针成员 @@ -88,7 +90,7 @@ obj_ptr: MyClass | t.CPtr = c.Addr(MyClass(arg1, arg2)) ### 匿名结构体成员(❌) -> WARNING: **警告:** 由于 Viper 在声明结构体,枚举等处不需要关键字,因此 `t.Anonymouse` 是不需要使用的。此关键字不再维护,强行使用可能导致未定义行为。 +> WARNING: **警告:** `t.Anonymous` 已废弃。由于 Viper 在声明结构体,枚举等处不需要关键字,因此 `t.Anonymouse` 是不需要使用的。此关键字不再维护,强行使用可能导致未定义行为。 继承 `t.Anonymous` 的类作为匿名成员嵌入: @@ -104,6 +106,8 @@ class packet: ### 字节序标记 +> 待实现(尚无字节序处理代码)。 + > WARNING: **警告:** 此关键字是实验性的。未经充分测试,不当使用可能导致未定义行为。 使用 `t.BigEndian` 或 `t.LittleEndian` 标记成员的字节序: @@ -186,7 +190,7 @@ class LLVMType(t.REnum): pass ``` -布局为 `{ i32 __tag, }`,所有变体共享最大变体的 payload 空间。 +布局为 `{ i32 __tag, _p1, _p2, ... }`:按字段位置逐槽取所有变体的最大尺寸(i32/i64),而非单一最大 payload 区。 ### match 分派 @@ -262,6 +266,8 @@ lst.append(node) # 类型安全:append 只接受 GNode ## 位域 +> 待实现(TPC/TPV 均无解析路径)。 + 使用 `t.Bit(n)` 定义位域成员: ```python diff --git a/wiki/06-oop.md b/wiki/06-oop.md index cdb349f..20c2ec4 100644 --- a/wiki/06-oop.md +++ b/wiki/06-oop.md @@ -126,7 +126,7 @@ class Sheet: ### `__before_init__` 方法 -所有类(不限 `@t.Object`/`@t.CVTable`)自动生成 `__before_init__` 方法,在 `__init__` 之前**自动填充成员默认值**,并对 `@t.CVTable` 类初始化 vtable: +仅当类内含方法或继承虚方法时才生成 `__before_init__` 方法(纯数据 `class` 不生成)。它在 `__init__` 之前**自动填充成员默认值**,并对 `@t.CVTable` 类初始化 vtable: ```llvm define void @".ClassName.__before_init__"(%".ClassName"* %self) { @@ -143,9 +143,14 @@ entry: - 对 `@t.CVTable` 类额外初始化 vtable 指针 **调用时机**(由编译器在构造时自动插入): -1. `alloca` 栈分配后调用一次 -2. 若存在 `__new__` 方法且返回堆指针,对堆指针再调用一次(alloca 的默认值已随栈帧丢弃,必须重新填充) -3. `__init__` 调用前 +1. 不存在 `__new__` 时:在 `alloca` 分配之后调用一次,随后进入 `__init__` +2. 存在 `__new__` 时:在 `__new__` 之后对**最终存储指针**调用一次,随后进入 `__init__` + +**关于 `__new__`**: +- `__new__` 返回 `self` 时使用默认的 `alloca` 存储 +- `__new__` 的签名可与 `__init__` 不同 +- `__new__` 与 `@t.CVTable` 兼容 +- `__new__` 本身不入虚表 **就地构造**:用户也可手动调用 `__before_init__` 实现就地构造(placement new 语义),典型用法见 `mpool.alloc_buf`: @@ -165,7 +170,7 @@ buf.__init__(args) # 用户初始化逻辑 |------|---------------|--------------| | vtable 指针 | ❌ 无 | ✅ 自动插入 slot 0 | | 虚派发 | ❌ 无 | ✅ 支持 | -| 方法继承 | ✅ 生成包装函数转发 | ✅ 通过 vtable | +| 方法继承 | ✅ 调用点解析直调父类 | ✅ 通过 vtable | | 字段展平 | ✅ 父类字段前置嵌入 | ✅ 父类字段前置嵌入(vtable 之后) | | 运行时开销 | 零 | 每次虚调用一次间接跳转 | @@ -187,16 +192,7 @@ class GNode(LinkedNode): # 非多态继承 ### 方法继承机制 -子类调用父类方法时,编译器通过 `_generate_inherited_method_wrappers` 自动生成包装函数:将 `self` bitcast 为父类指针后尾调用父类方法。例如 `gnode.append(child)` 会生成: - -```llvm -define void @".GNode.append"(%".GNode"* %self, ...) { -entry: - %base = bitcast %".GNode"* %self to %".LinkedNode"* - call void @".LinkedNode.append"(%".LinkedNode"* %base, ...) - ret void -} -``` +子类调用父类方法时,实际机制为**调用点解析**:编译器沿 MRO(方法解析顺序)定位到**定义该方法**的父类,按字节偏移调整 `this` 指针后 `bitcast`,在调用点**直接调用**父类实现(无 wrapper 生成、无尾调用)。 ### 跨模块继承 @@ -217,6 +213,8 @@ node: Node | t.CPtr = (Node | t.CPtr)(child) ## `@t.CVTable` 虚函数表与多态 +> **规划**:将引入 `T1 & T2`(TypeIntersection)表达 object(尤其是带 vtable 的 object)的交集类型,作为多态对象组合的静态类型手段(详见 02-type-system.md 类型组合规划演进,尚未实现)。 + > 尽可能避免使用 `self[0]` 来获取结构体成员,其不稳定,也不要手动操作虚表。 使用 `@t.CVTable` 装饰器可以启用虚函数表支持。启用后,结构体第一个成员自动插入 `i8*` 类型的 vtable 指针。`@t.CVTable` 的操作必须配合 `@t.Object`,但有时编译器会自动识别是否存在结构体内函数,自动使用 `@t.Object`。 @@ -239,10 +237,12 @@ class Base: %".Base" = type { i8*, i32 } ``` -同时,编译器会生成全局 vtable 变量: +同时,编译器会生成全局 vtable 变量。vtable 实为 `internal constant struct{ n x i8* }`——即含 n 个 `i8*` 函数指针成员的结构体常量(成员为带 `bitcast` 的初始化文本),变量名为 `.Class.vtable`,并非 `[1 x i8*] zeroinitializer`: ```llvm -@".Base_Vtable" = internal global [1 x i8*] zeroinitializer +@".Base.vtable" = internal constant { i8* } { + i8* bitcast (i32 (%".Base"*)* @".Base.method" to i8*) +} ``` ### 继承与多态 @@ -304,6 +304,33 @@ def main() -> t.CInt | t.CExport: 6. bitcast 为正确的函数指针类型 7. 间接调用 +### 方法级虚表开关 + +类级装饰器 `@t.CVTable`/`@t.NoVTable` 决定类级默认策略,方法级装饰器可覆盖类级默认: + +- `@t.NoVTable` 类中单独标注 `@t.CVTable` 的方法进入虚表 +- `@t.CVTable` 类中单独标注 `@t.NoVTable` 的方法被排除在虚表之外 + +以上行为由 `func_vtable_test` 实证。 + +### super() + +`super().method(...)` 形态被编译为**静态父类方法调用**(仅该形态被支持),不经过 vtable 动态派发: + +```python +@t.Object +@t.CVTable +class Base: + def method(self) -> t.CVoid: + pass + +@t.Object +@t.CVTable +class Derived(Base): + def method(self) -> t.CVoid: + super().method() # 静态调用父类实现 +``` + ## 继承 ### 结构体成员继承 @@ -317,7 +344,7 @@ def main() -> t.CInt | t.CExport: ```python @t.Object class Animal: - name: list[t.CChar, 32] + name: t.CArray[t.CChar, 32] age: t.CInt def __init__(self, age: t.CInt): @@ -362,7 +389,9 @@ class SpecificError(MyError): | `/` | `__truediv__` | `a / b` → `a.__truediv__(b)` | | `//` | `__floordiv__` | `a // b` → `a.__floordiv__(b)` | | `%` | `__mod__` | `a % b` → `a.__mod__(b)` | -| `**` | `__pow__` | `a ** b` → `a.__pow__(b)` | +| `**` | `__pow__` | `a ** b` → `a.__pow__(b)`(期望实现) | + +> **注意**:binop 的 `**` 未调度——基础类型 `**` 编译失败;自定义类型走 `__pow__` 重载也属期望实现。 示例: @@ -391,30 +420,20 @@ class Vec2: ### 增量赋值运算符重载 -| 增量运算符 | 优先 Dunder | 回退 Dunder | -|-----------|------------|------------| -| `+=` | `__iadd__` | `__add__` | -| `-=` | `__isub__` | `__sub__` | -| `*=` | `__imul__` | `__mul__` | -| `/=` | `__itruediv__` | `__truediv__` | -| `//=` | `__ifloordiv__` | `__floordiv__` | -| `%=` | `__imod__` | `__mod__` | -| `**=` | `__ipow__` | `__pow__` | - -如果未定义增量版本(如 `__iadd__`),编译器自动回退到普通版本(如 `__add__`)。 +> **期望实现**:当前 `AugAssign`(增量赋值)一律按原生运算符展开(`+=`→`add`、`//=`→`sdiv` …),不调用 `__iadd__`,也没有回退到普通版本(如 `__add__`)的机制。`__iadd__` 等增量 dunder 方法均属期望实现。 ### 比较运算符重载 -> **实验性**:以下比较运算符 dunder 方法在编译器中被识别,但尚未实现自动调度。定义它们不会报错,但比较运算不会自动调用。 +`__eq__`/`__ne__`/`__lt__`/`__le__`/`__gt__`/`__ge__` 已自动调度(映射与调用点自动调度,`opovl_test` 覆盖);未定义 `__eq__` 时比较回退为默认身份比较。 | 运算符 | Dunder 方法 | 状态 | |--------|------------|------| -| `==` | `__eq__` | 仅类型推断识别 | -| `!=` | `__ne__` | 仅类型推断识别 | -| `<` | `__lt__` | 仅类型推断识别 | -| `<=` | `__le__` | 仅类型推断识别 | -| `>` | `__gt__` | 仅类型推断识别 | -| `>=` | `__ge__` | 仅类型推断识别 | +| `==` | `__eq__` | 已自动调度 | +| `!=` | `__ne__` | 已自动调度 | +| `<` | `__lt__` | 已自动调度 | +| `<=` | `__le__` | 已自动调度 | +| `>` | `__gt__` | 已自动调度 | +| `>=` | `__ge__` | 已自动调度 | ### 反向运算符重载 @@ -432,15 +451,18 @@ class Vec2: ### 一元运算符重载 -> **实验性**:以下一元运算符 dunder 方法在编译器中被识别,但尚未实现自动调度。 +`__neg__`/`__pos__`/`__invert__` 已自动调度。 | 运算符 | Dunder 方法 | 状态 | |--------|------------|------| -| `-a` | `__neg__` | 仅类型推断识别 | -| `+a` | `__pos__` | 仅类型推断识别 | +| `-a` | `__neg__` | 已自动调度 | +| `+a` | `__pos__` | 已自动调度 | +| `~a` | `__invert__` | 已自动调度 | ## 可调用对象 `__call__` +> **期望实现**:当前未调度 `__call__`,`obj(args)` 不会自动分发到该方法。 + ```python @t.Object class Counter: @@ -483,11 +505,13 @@ def __delitem__(self, key: t.CInt): ## 布尔转换 `__bool__` +> **期望实现**:当前条件真值对 struct 值恒真/指针判非空,不调度 `__bool__`。 + ```python @t.Object class Buffer: size: t.CInt - data: list[t.CChar, 1024] + data: t.CArray[t.CChar, 1024] def __bool__(self) -> t.CBool: return self.size > 0 @@ -513,6 +537,8 @@ n: t.CInt = len(buf) ## 字符串转换 `__str__` +> **期望实现**:`print` 是类型感知格式化(`str`/`%s`、`int`、`float`、`struct` 输出占位符),当前**不调度** `__str__`。 + ```python @t.Object class Point: @@ -523,11 +549,13 @@ class Point: return "Point" p: Point = Point(1, 2) -print(p) # 调用 p.__str__() +print(p) # 类型感知格式化:不调用 p.__str__() ``` ## 绝对值 `__abs__` +> **期望实现**:当前 `abs()` 不调度 `__abs__`(`abs` 为 C 库裸名调用/TPC 内建,见 11-builtins.md)。 + ```python @t.Object class SignedValue: @@ -545,7 +573,7 @@ a: t.CInt = abs(sv) # a = 42 ## 迭代器协议 -Viper 的迭代器协议与 Python 相同,但 `__next__` 的实现方式通过 `StopIteration` 异常来结束。 +Viper 的迭代器协议与 Python 相同。`__next__` 带编译器注入的隐藏 `i1*` 参数 `__stop_iter_flag__`:方法内 `raise StopIteration` 会将该参数置位并返回默认值以结束迭代。 ### `__iter__` 和 `__next__` @@ -564,7 +592,7 @@ class IntRange: def __iter__(self): return self - def __next__(self, stop_flag) -> t.CInt: + def __next__(self, __stop_iter_flag__) -> t.CInt: # 编译器注入的隐藏 i1* 参数 if self.current >= self.end: raise StopIteration val: t.CInt = self.current @@ -586,9 +614,9 @@ for i in r: IntRange r = IntRange_init(0, 10); IntRange iter = IntRange___iter__(&r); while (1) { - i1 stop_flag = 0; - int i = IntRange___next__(&iter, &stop_flag); - if (stop_flag == 1) break; + i1 __stop_iter_flag__ = 0; /* 编译器注入的隐藏 i1* 参数 */ + int i = IntRange___next__(&iter, &__stop_iter_flag__); + if (__stop_iter_flag__ == 1) break; print_int(i); } ``` @@ -629,8 +657,10 @@ with File("/test.txt", FA_READ) as f: ## 析构 `__del__` / `__delete__` +> **期望实现**:当前 `del obj` 不调度 `__del__`/`__delete__`;已实现的是 `del obj.attr`(property deleter)与 `del obj[key]`(`__delitem__`)。 + ```python -del obj # 调用 obj.__del__() 或 obj.__delete__() +del obj # 期望:调用 obj.__del__() 或 obj.__delete__()(尚未实现) del arr[idx] # 调用 arr.__delitem__(idx) ``` @@ -641,52 +671,58 @@ del arr[idx] # 调用 arr.__delitem__(idx) | Dunder 方法 | 触发语法 | 说明 | |------------|---------|------| | `__init__` | `ClassName(args)` | 构造函数 | -| `__before_init__` | 自动生成 | vtable 初始化,在 `__init__` 之前执行 | +| `__before_init__` | 自动生成 | 填充成员默认值并初始化 vtable(类内含方法或继承虚方法时才生成),在 `__init__` 之前执行 | | `__add__` | `a + b` | 加法 | | `__sub__` | `a - b` | 减法 | | `__mul__` | `a * b` | 乘法 | | `__truediv__` | `a / b` | 真除法 | | `__floordiv__` | `a // b` | 整除 | | `__mod__` | `a % b` | 取模 | -| `__pow__` | `a ** b` | 幂运算 | -| `__iadd__` | `a += b` | 增量加法(回退到 `__add__`) | -| `__isub__` | `a -= b` | 增量减法(回退到 `__sub__`) | -| `__imul__` | `a *= b` | 增量乘法(回退到 `__mul__`) | -| `__itruediv__` | `a /= b` | 增量真除法(回退到 `__truediv__`) | -| `__ifloordiv__` | `a //= b` | 增量整除(回退到 `__floordiv__`) | -| `__imod__` | `a %= b` | 增量取模(回退到 `__mod__`) | -| `__ipow__` | `a **= b` | 增量幂运算(回退到 `__pow__`) | -| `__call__` | `obj(args)` | 可调用对象 | +| `__and__` | `a & b` | 按位与 | +| `__or__` | `a \| b` | 按位或 | +| `__xor__` | `a ^ b` | 按位异或 | +| `__lshift__` | `a << b` | 左移 | +| `__rshift__` | `a >> b` | 右移 | +| `__eq__` | `a == b` | 等于(未定义 `__eq__` 时默认身份比较) | +| `__ne__` | `a != b` | 不等于 | +| `__lt__` | `a < b` | 小于 | +| `__le__` | `a <= b` | 小于等于 | +| `__gt__` | `a > b` | 大于 | +| `__ge__` | `a >= b` | 大于等于 | +| `__neg__` | `-a` | 一元负号 | +| `__pos__` | `+a` | 一元正号 | +| `__invert__` | `~a` | 按位取反 | | `__getitem__` | `obj[key]` | 下标读取 | | `__setitem__` | `obj[key] = value` | 下标赋值 | | `__delitem__` | `del obj[key]` | 下标删除 | -| `__bool__` | `if obj:` | 布尔转换 | | `__len__` | `len(obj)` | 长度 | -| `__str__` | `str(obj)` / `print(obj)` | 字符串转换 | -| `__abs__` | `abs(obj)` | 绝对值 | | `__iter__` | `for x in obj:` | 获取迭代器 | -| `__next__` | `for x in obj:` | 获取下一个值(标志位方式) | +| `__next__` | `for x in obj:` | 取下一个值(隐藏 `i1*` 参数 `__stop_iter_flag__`,`raise StopIteration` 置位后返回默认值结束迭代) | | `__enter__` | `with obj as x:` | 上下文管理器进入 | | `__exit__` | `with obj as x:` | 上下文管理器退出 | -| `__del__` | `del obj` | 析构 | -| `__delete__` | `del obj` | 删除描述符 | ### 声明支持但未实现自动调度的 Dunder 方法 | Dunder 方法 | 预期触发语法 | 当前状态 | |------------|------------|---------| -| `__eq__` | `a == b` | 仅类型推断识别,比较运算不自动调度 | -| `__ne__` | `a != b` | 同上 | -| `__lt__` | `a < b` | 同上 | -| `__le__` | `a <= b` | 同上 | -| `__gt__` | `a > b` | 同上 | -| `__ge__` | `a >= b` | 同上 | -| `__neg__` | `-a` | 仅类型推断识别,一元负号不自动调度 | -| `__pos__` | `+a` | 同上 | -| `__radd__` | 右操作数加法 | 仅类型推断识别 | -| `__rsub__` | 右操作数减法 | 同上 | -| `__rmul__` | 右操作数乘法 | 同上 | -| `__rtruediv__` | 右操作数真除法 | 同上 | -| `__rfloordiv__` | 右操作数整除 | 同上 | -| `__rmod__` | 右操作数取模 | 同上 | -| `__rpow__` | 右操作数幂运算 | 同上 | +| `__pow__` | `a ** b` | 期望实现:binop `**` 未调度(基础类型 `**` 编译失败;自定义类型走 `__pow__` 重载亦属期望) | +| `__iadd__` | `a += b` | 期望实现:AugAssign 一律按原生运算符展开(`+=`→`add`、`//=`→`sdiv` …),不调用 `__iadd__`,也无 `__add__` 回退 | +| `__isub__` | `a -= b` | 同上 | +| `__imul__` | `a *= b` | 同上 | +| `__itruediv__` | `a /= b` | 同上 | +| `__ifloordiv__` | `a //= b` | 同上 | +| `__imod__` | `a %= b` | 同上 | +| `__ipow__` | `a **= b` | 同上 | +| `__str__` | `str(obj)` / `print(obj)` | 期望实现:`print` 为类型感知格式化(`str`/`%s`、`int`、`float`、`struct` 输出占位符),不调度 `__str__` | +| `__call__` | `obj(args)` | 期望实现:当前未调度 | +| `__bool__` | `if obj:` | 期望实现:当前未调度 | +| `__abs__` | `abs(obj)` | 期望实现:当前未调度 | +| `__del__` | `del obj` | 期望实现:当前未调度 | +| `__delete__` | `del obj` | 期望实现:当前未调度 | +| `__radd__` | 右操作数加法 | 尚未调度 | +| `__rsub__` | 右操作数减法 | 尚未调度 | +| `__rmul__` | 右操作数乘法 | 尚未调度 | +| `__rtruediv__` | 右操作数真除法 | 尚未调度 | +| `__rfloordiv__` | 右操作数整除 | 尚未调度 | +| `__rmod__` | 右操作数取模 | 尚未调度 | +| `__rpow__` | 右操作数幂运算 | 尚未调度 | diff --git a/wiki/07-control-flow.md b/wiki/07-control-flow.md index 6115aee..9d6f01c 100644 --- a/wiki/07-control-flow.md +++ b/wiki/07-control-flow.md @@ -77,6 +77,8 @@ while (i < 10) { ### while-else +> 期望实现——当前编译器不生成 orelse 代码,else 块会被忽略 + ```python while i < count: if found: @@ -141,6 +143,8 @@ for item in container: ### for-else +> 期望实现——当前编译器不生成 orelse 代码,else 块会被忽略 + ```python for i in range(count): if items[i] == target: @@ -207,6 +211,8 @@ match code: ### match 或模式 +> 期望实现——当前实现只取第一个值做 switch case,其余值会落入默认分支(c.NoBreak 相关) + ```python match value: case 1 | 2 | 3: @@ -230,8 +236,11 @@ match value: 如果需要提前 break,需要使用 `c.Break()`,因为在 `Python` 中,`match` 分支不支持直接使用 `break`。 +> 期望实现——当前不存在 `c.Break()`;case 体默认自动 break,fallthrough 需用 `c.NoBreak`。 + ## assert 语句 > 避免使用此语句,此语句未经充分测试,在多数情况下,编译器不知道如何展示结果。 +> 期望实现——当前语句分派无 assert 分支 ```python assert ptr != None, "null pointer" @@ -254,3 +263,9 @@ File* f = File_enter(File_new("/test.txt", FA_READ)); int data = File_read(f); File_exit(f); ``` + +## 协程 async/await(已实现) + +`async def` / `await` 编译为帧状态机(`AsyncGenMixin`),运行时由 `coro` 模块提供 `coro_run` / `coro_sleep` / `coro_destroy` / `coro_exception` / `coro_exception_msg` / `coro_gather`,`async_test.vp` 提供实证。 + +`await` 可与 `for` / `try` / `except` / `finally` / 自定义异常等组合使用。 diff --git a/wiki/08-c-operations.md b/wiki/08-c-operations.md index 2c51ac0..a8cc8f4 100644 --- a/wiki/08-c-operations.md +++ b/wiki/08-c-operations.md @@ -101,6 +101,8 @@ c.Asm(f"""mov rdi, {c.AsmInp(msg, t.ASM_DESCR.REG_ANY)} ### ASM_DESCR 约束字符 +> 下表为 `t.ASM_DESCR` 的完整期望常量集;TPV 实际已映射子集见本节末。 + #### 操作数修饰符 | 常量 | 值 | 说明 | @@ -156,50 +158,61 @@ c.Asm(f"""mov rdi, {c.AsmInp(msg, t.ASM_DESCR.REG_ANY)} | `CLOBBER_MEMORY` | 破坏内存 | | `CLOBBER_R8` ~ `CLOBBER_R15` | 破坏 R8~R15 | +> TPV 实际已映射子集:`REG_ANY` / `REG_EAX..RDI` / `RAX..R15`、`OUTPUT_REG` / `OUTPUT_MEM` / `OUTPUT_EAX`、`INPUT_REG` / `INPUT_MEM` / `INPUT_EAX`…、`CLOBBER_MEMORY` / `CLOBBER_CC` / `CLOBBER_RAX..R15`。`REG_XMM` / `MEMORY` / `IMMEDIATE` / `ANY` / `MODIFIER_OUTPUT` / `READWRITE` / `INPUT` / `GLOBAL` 等期望实现。 + ## 预处理指令 Viper 通过 `c` 模块的函数调用实现 C 预处理指令。 ### #define -```python -c.CDefine("MAX_SIZE", 1024) # #define MAX_SIZE 1024 -``` - -上述方法容易引起未定义行为,至少是不便于理解,更常用的方式是使用类型注解: - ```python MAX_SIZE: t.CDefine = 1024 # #define MAX_SIZE 1024 ``` +注解式 `MAX_SIZE: t.CDefine = 1024` 是支持且推荐的宏定义写法。 + +> 调用式 `c.CDefine("X", v)` 不存在(期望)。 + +### define 宏函数 + +`define` 软关键字与 `def f(...) -> t.CDefine` 声明的函数均为宏函数:存根保留完整函数体,调用点在编译期内联展开。 + +> TPC 已实现;TransPyV 的展开尚未对齐。 + ### 条件编译 +编译期条件编译的真实形态是 `if` 缩进块(已实现),块结束即 `#endif`: + ```python -c.CIfndef(HEADER_H) # #ifndef HEADER_H -c.CDefine(HEADER_H) # #define HEADER_H -c.CEndif() # #endif +if c.CIfdef(DEBUG): + ... # #ifdef DEBUG ``` ```python -c.CIfdef(DEBUG) # #ifdef DEBUG -c.CEndif() # #endif +if c.CIfndef(HEADER_H): + ... # #ifndef HEADER_H ``` ```python -c.CIf(VERSION > 2) # #if VERSION > 2 -c.CElif(VERSION > 1) # #elif VERSION > 1 -c.CElse() # #else -c.CEndif() # #endif +if c.CIf(VERSION > 2): + ... # #if VERSION > 2 ``` +> 语句式 `c.CEndif()` / `c.CElif(...)` / `c.CElse()` 不存在,且暂不实现。 + ### #undef +> 期望实现——当前不存在 `c.Undef`。 + ```python c.Undef(MACRO_NAME) # #undef MACRO_NAME ``` ### #error +> 期望实现——当前不存在 `c.CError`。 + ```python c.CError("Platform not supported") # #error "Platform not supported" ``` @@ -211,7 +224,7 @@ c.CPragma("GCC diagnostic push") # #pragma GCC diagnostic push ``` ### ## 连接符 -> 此方法可能已经不再支持 +> 此方法已不再支持(属实) ```python c.TokenPast("PREFIX_", "NAME") # PREFIX_ ## NAME ``` @@ -220,35 +233,42 @@ c.TokenPast("PREFIX_", "NAME") # PREFIX_ ## NAME ## FFI 外部函数声明 -Viper 的 FFI(Foreign Function Interface)**无需任何特殊语法**——仅靠返回类型注解中的 `t.State` 标记即可声明外部函数。`t.State` 是声明性标记类型,表示"仅声明不定义"(语义等价于 `t.CExport | t.CExtern`),编译器只生成 `declare` 原型,不生成 `define` 函数体,由链接器在外部库中解析符号。 +Viper 的 FFI(Foreign Function Interface)通过 `extern` / `export` 关键字声明,无需旧版注解: + +- `extern def foo() -> T`(函数体为 `pass`):仅声明。编译器只生成 `declare` 原型,不生成 `define` 函数体,由链接器在外部库中解析符号; +- `export def foo() -> T`:以裸名导出函数定义。 + +> 旧注解写法(`t.State` / `t.CExtern` / `t.CExport`)已废弃:`t.State` 仅 `t.CEnum` 内部临时使用,很快移除。 ### 基本声明 -函数体为 `pass`,返回类型用 `RetType | t.State`: +`extern def` 仅声明(函数体为 `pass`);`export def` 以裸名导出: ```python -def isr0() -> t.CVoid | t.State: pass # extern void isr0(); — 来自汇编或外部 -def getchar() -> t.CInt | t.State: pass # extern int getchar(); — 来自 libc +extern def isr0() -> t.CVoid: pass # extern void isr0(); — 来自汇编或外部 +extern def getchar() -> t.CInt: pass # extern int getchar(); — 来自 libc +export def foo() -> t.CInt: pass # export int foo(); — 裸名导出(define) ``` 编译为 LLVM IR: ```llvm -declare void @"isr0"() ; 不加 SHA1 前缀(t.State 含 CExport 语义) +declare void @"isr0"() ; extern:不加 SHA1 前缀,仅 declare declare i32 @"getchar"() +define i32 @"foo"() { ... } ; export:不加 SHA1 前缀,裸名 define ``` ### Win32 API 绑定示例 -[includes/w32](../includes/w32) 中的 Win32 绑定全部通过 `t.State` 声明,零特殊语法: +[includes/w32](../includes/w32) 中的 Win32 绑定以 `extern` 关键字声明,零特殊语法: ```python -def CreateFileA(lpFileName: LPCSTR, dwDesiredAccess: ULONG, +extern def CreateFileA(lpFileName: LPCSTR, dwDesiredAccess: ULONG, dwShareMode: ULONG, lpSecurityAttributes: SECURITY_ATTRIBUTES | t.CPtr, dwCreationDisposition: ULONG, dwFlagsAndAttributes: ULONG, - hTemplateFile: HANDLE) -> HANDLE | t.State: + hTemplateFile: HANDLE) -> HANDLE: pass ``` @@ -261,18 +281,19 @@ HANDLE CreateFileA(LPCSTR, ULONG, ULONG, SECURITY_ATTRIBUTES*, 链接时通过 `project.json` 指定外部库(如 `kernel32.lib`、`user32.lib`),链接器解析这些符号。 -### `t.State` 与 `t.CExtern` 的区别 +### 修饰方式 -| 修饰 | SHA1 前缀 | 生成内容 | 用途 | +| 写法 | SHA1 前缀 | 生成内容 | 用途 | |------|----------|---------|------| -| 无修饰 | ✅ 加前缀 | `declare` + `define` | 模块私有函数 | -| `t.CExtern` | ❌ 不加 | `declare`(引用外部) | 引用外部 C 函数 | -| `t.CExport` | ❌ 不加 | `declare` + `define` | 对外暴露 API | -| `t.State` | ❌ 不加 | 仅 `declare` | FFI 外部函数声明(= `CExport \| CExtern`) | +| 无修饰(普通函数) | ✅ 加前缀 | `declare` + `define` | 模块私有函数 | +| `extern def f()` | ❌ 不加 | 仅 `declare` | FFI 外部函数声明(引用外部) | +| `export def f()` | ❌ 不加 | 裸名 `define` | 对外导出 API | + +> 新关键字等价写法:无修饰 = 普通函数加 SHA1 前缀;`extern` = 仅 declare;`export` = 裸名 define。原 `t.CExtern` / `t.CExport` / `t.State` 注解修饰已废弃。 ### 声明外部全局变量 -外部全局变量通过 `t.CExtern` 注解声明: +外部全局变量目前仍通过 `t.CExtern` 类型注解声明(变量声明场景,属旧注解遗留写法): ```python errno: t.CExtern | t.CInt # extern int errno; @@ -284,7 +305,7 @@ errno: t.CExtern | t.CInt # extern int errno; ### c.LLVMIR -直接嵌入原始 LLVM IR 文本来实现高效且跨平台的汇编操作(无返回值、不做指令解析): +设计期望无返回值(void),直接嵌入原始 LLVM IR 文本(不做指令解析);当前过渡期调用可带第二类型参数取得返回值(`llvmir_test` 用法),后续以无返回值为准并修订代码: ```python c.LLVMIR(f"{c.LOut(r)} = add i32 {c.LInp(a)}, {c.LInp(b)}") diff --git a/wiki/09-exceptions.md b/wiki/09-exceptions.md index 7f93516..d14e0b6 100644 --- a/wiki/09-exceptions.md +++ b/wiki/09-exceptions.md @@ -1,10 +1,12 @@ # 09 - 异常处理 -Viper 支持 Python 风格的 `try/except/finally` 异常处理,编译为基于 jmp_buf 和错误码的 C 级别异常处理机制。 +> 本章待修订(机制与实现存在偏差,见各节标注) + +Viper 支持 Python 风格的 `try/except/finally` 异常处理,采用基于错误码 + 错误消息出参的传播机制(不使用 C++ 风格的零开销异常)。 ## 异常处理机制 -Viper 的异常处理不使用 C++ 风格的零开销异常,而是通过函数参数传递错误码和错误消息实现。编译器自动为可能抛出异常的函数添加 `__eh_msg_out__` 和 `__eh_code_out__` 参数。 +编译器自动为可能抛出异常的函数追加 `__eh_code_out__(i32*)` 与 `__eh_msg_out__(i8**)` 出参;调用点传入接收缓冲,调用后检查 `msg != NULL`,按 `code` 匹配 `except`。 ## try / except @@ -50,6 +52,8 @@ class ReadOnlyError(DiskFullError): ### 多异常捕获 +> 语法暂不支持(期望)。 + ```python try: result = operation() @@ -68,6 +72,8 @@ except Exception as e: ## try / finally +> 普通函数中尚未实现(仅协程子集支持纯 try/finally)——期望/后续修正 + ```python try: result = operation() @@ -79,6 +85,8 @@ finally: ## try / except / finally +> 普通函数中尚未实现(仅协程子集支持纯 try/finally)——期望/后续修正 + ```python try: result = operation() @@ -104,6 +112,8 @@ raise MyCustomError("something went wrong") ### 重新抛出异常 +> 当前裸 raise 不重新抛出(返回默认值),期望实现重抛当前异常。 + ```python raise ``` diff --git a/wiki/10-imports.md b/wiki/10-imports.md index 8aed548..531b434 100644 --- a/wiki/10-imports.md +++ b/wiki/10-imports.md @@ -2,6 +2,8 @@ Viper 的模块系统基于 Python 的 `import` 语法,但编译时通过 TransPyC 的符号表和类型系统实现跨模块的类型解析。 +> 注:`extern`/`export`/`define` 关键字属语言语法([includes/ast](../includes/ast) parser 中的软关键字;`define` 为宏函数),而非 `t` 模块的类型注解。 + ## 导入语法 ### 标准导入 @@ -70,7 +72,7 @@ asm.BSSClean() # 清零 BSS 段 ### `string` 模块 字符串/内存操作模块,对应 C 标准库的 `string.h`: -> string 部分使用 x86_64 专有汇编进行加速,因此某些函数在其它架构可能需要手动重新编写。 +> 确认:string 模块确实使用 Viper `c.Asm` 内联汇编进行加速(`memset`/`memcpy`/`memmove` 等,见 [includes/string.vp](../includes/string.vp))。因使用 x86_64 专有汇编,某些函数在其它架构可能需要手动重新编写。 ```python import string @@ -121,7 +123,7 @@ import vpsdk.syscall as syscall ### `ast` 模块(自研解析器) -[includes/ast](../includes/ast) 是**完全自研的 Python 解析器**(词法器 + 语法器 + AST 构造,约 4176 LOC),覆盖 CPython 几乎全部语法。这是向 `TransPyV` 完全自举的关键组件——自举后编译器不再依赖 Python 运行时解析源文件。 +[includes/ast](../includes/ast) 是**完全自研的 Python 解析器**(词法器 + 语法器 + AST 构造,现行 9 个文件约 8K 行;"约 4176 LOC"为 2026-06 历史口径),覆盖 CPython 几乎全部语法。这是向 `TransPyV` 完全自举的关键组件——自举后编译器不再依赖 Python 运行时解析源文件。 ```python from ast import parse, parse_expression @@ -134,7 +136,7 @@ AST 采用**胖节点**设计:70+ 变体共用一个 struct,用 `vtype`(`A ### `llvmlite` 模块(自研 IR 生成库) -[includes/llvmlite](../includes/llvmlite) 是**完全自研的 LLVM IR 文本生成库**(约 1500 LOC),封装类型/值/模块/函数/基本块/构造器的创建与打印。同样是自举的关键组件。 +[includes/llvmlite](../includes/llvmlite) 是**完全自研的 LLVM IR 文本生成库**(现行约 5.9K 行;"约 1500 LOC"为 2026-06 历史口径),封装类型/值/模块/函数/基本块/构造器的创建与打印。同样是自举的关键组件。 ```python from llvmlite import LLVMTypeCore, LLVMModuleCore @@ -186,6 +188,14 @@ handle: HANDLE = CreateFileA("test.txt", GENERIC_READ, FILE_SHARE_READ, 子模块:`win32base`(基础类型/常量)、`win32file`(文件 IO)、`win32console`(控制台)、`win32memory`(内存)、`win32process`(进程/线程)、`win32sync`(同步对象)、`fileio`(高层文件操作封装)。详见 [08-c-operations.md 的 FFI 章节](08-c-operations.md#ffi-外部函数声明)。 +### `coro`/`stdio`/`stdlib`/`memhub`/`testcheck` 等内置模块 + +特殊模块清单末尾补充: +- `coro`:协程运行时,提供 `coro_run`/`coro_sleep`/`coro_destroy`/`coro_exception`/`coro_exception_msg`/`coro_gather` +- `stdio` / `stdlib`:C 标准库风格的 IO 与通用库函数 +- `memhub`:内存管理中枢 +- `testcheck`:测试辅助(断言/检查用例) + ## 模块解析流程 ### 编译时模块加载 @@ -198,20 +208,20 @@ Viper 的 `import` 是编译时操作,不涉及运行时模块加载。完整 4. **阶段二**:翻译源文件时,通过符号表解析跨模块的类型和函数引用 5. **阶段二**:将被引用模块的 `.stub.ll` 声明嵌入到生成的 `.ll` 文件头部 +> 注:阶段一主要产出 `.vpi`;`.stub.ll`/`.text.ll` 由阶段二 Phase A 写盘。`.vpi`/`.stub` 按需加载而非全量;共享符号表为内存 `StubMergerStore`;`_sha1_map.txt` 仅人类可读(映射本体在内存 `Sha1Store`)。 + ### 类型存根文件(.vpi) -`.vpi` 文件是模块的声明接口,由 `PythonToStubConverter` 在阶段一生成。存根文件的内容规则: +`.vpi` 文件是模块的声明接口,由 `PythonToStubConverter` 在阶段一生成。TPV 自举路径使用自研 `StubGen`/`Converter.vp`(从 AST 直接生成,不依赖 CPython 的 `PythonToStubConverter`)。存根文件的内容规则: | 元素 | 存根表示 | |------|---------| | `t.CDefine` 常量 | 保留完整定义(含赋值) | | `t.CDefine` 函数 | 保留完整函数体 | -| 普通函数 | 仅签名 + `t.State` | +| 普通函数 | 仅保留签名:`def foo(...) -> T: pass` | | 全局变量 | 添加 `t.CExtern` | | 类定义 | 保留成员类型注解和方法签名 | -存根文件还自动添加宏守卫(`c.CIfndef`/`c.CEndif()`),防止重复包含。 - ### SHA1 命名空间与导入 每个模块的函数和结构体在 LLVM IR 中自动加上 SHA1 前缀,消除跨模块符号冲突。只有标记为 `t.CExport` 的函数保持原始名称。详见 [01-overview.md 中 SHA1 命名空间机制](01-overview.md#sha1-命名空间机制)。 @@ -230,7 +240,7 @@ Viper 的 `import` 是编译时操作,不涉及运行时模块加载。完整 ```python # 在 fat32_types.vp 中定义 class fat32_fileinfo: - fname: list[t.CChar, 13] + fname: t.CArray[t.CChar, 13] attr: t.CUInt8T file_size: t.CUInt32T diff --git a/wiki/11-builtins.md b/wiki/11-builtins.md index 877b367..9abfaa6 100644 --- a/wiki/11-builtins.md +++ b/wiki/11-builtins.md @@ -24,13 +24,17 @@ s: t.CSizeT = sizeof(t.CInt) # sizeof(int) s: t.CSizeT = obj.__sizeof__() # sizeof(obj) ``` +> **注意**:裸 `sizeof()` 为 TPC 支持;TransPyV 以 `X.__sizeof__()`/`len(数组)` 为主。 + ### abs ```python a: t.CInt = abs(x) # abs(x) ``` -### int / float / bool +> **注意**:TPC 为硬编码内建;TransPyV 按 C 库裸名调用 `@abs`(两者并存)。 + +### int / float / bool / char / double(裸内建强转) ```python i: t.CInt = int(3.14) # (int)3.14 @@ -38,18 +42,17 @@ f: t.CFloat = float(42) # (float)42 b: t.CBool = bool(x) # x != 0 ``` -### min / max +> **已实现**:编译器硬编码内建强转(`bool(x)`=与 0 比较得 `i1`;`int(x)`=截断/零扩展/浮点转整;`char(x)`=`i8`;`float`/`double(x)`=`sitofp`/`fpext` 等)。 + +### min / max / chr / ord + +> **实现说明**:min/max/chr/ord 定义于 `includes/builtins.vp`(`ord`: `t.CChar`→`int`;`chr`: `int`→`t.CChar`;`min`/`max`: `double` 参数,`int`/`float` 实参无损提升,返回按调用侧目标类型 coerce),编译器自动关联 builtins 模块,无需显式 import。 ```python -m: t.CInt = min(a, b) # a < b ? a : b -m: t.CInt = max(a, b) # a > b ? a : b -``` - -### chr / ord - -```python -c: t.CChar = chr(65) # 'A' (整数转字符) -n: t.CInt = ord('A') # 65 (字符转整数) +m: t.CInt = min(a, b) # min(a, b)(builtins.vp,double 参数,返回按目标类型 coerce) +m: t.CInt = max(a, b) # max(a, b) +c: t.CChar = chr(65) # chr: int → t.CChar +n: t.CInt = ord('A') # ord: t.CChar → int ``` ### range @@ -74,7 +77,7 @@ for i in range(0, 10, 2): pass # for (int i = 0; i < 10; i += 2) | `a / b` | `a / b` | 浮点除法 | | `a // b` | `a / b` | 整数除法 | | `a % b` | `a % b` | 取模 | -| `a ** b` | `pow(a, b)` | 幂运算 | +| `a ** b` | — | 暂不支持:基础类型 `**` 无内建翻译;自定义类型走 `__pow__` 重载(`__pow__` 属期望实现) | | `-a` | `-a` | 取负 | | `+a` | `+a` | 正号 | @@ -149,7 +152,7 @@ buf[i] = value # buf[i] = value; (自动计算偏移) ## 数组下标 ```python -buf: list[t.CChar, 64] +buf: t.CArray[t.CChar, 64] buf[0] = 'H' # buf[0] = 'H'; buf[i] = value # buf[i] = value; diff --git a/wiki/12-project.md b/wiki/12-project.md index 854f007..9f9e60e 100644 --- a/wiki/12-project.md +++ b/wiki/12-project.md @@ -1,16 +1,15 @@ # 12 - 项目配置与构建 -Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 +Viper 项目使用 `project.vpj` 配置文件管理编译和链接参数(Python 单文件模式仍接受 `project.json`)。 -## project.json 结构 +## project.vpj 结构 ```json { "name": "Kernel", "version": "1.0.0", "source_dir": "./Kernel", - "temp_dir": "./temp", - "output_dir": "./output", + "build_dir": "./.tpv_build", "compiler": { "cmd": "llc", "flags": ["-filetype=obj", "-mtriple=x86_64-none-elf", "-relocation-model=static", "-O2"] @@ -32,6 +31,7 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 }, "options": { "slice_level": 3, + "sha1_slice_level": 1, "target": "llvm", "strict_mode": true } @@ -46,9 +46,8 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 |------|------|------| | `name` | string | 项目名称 | | `version` | string | 项目版本 | -| `source_dir` | string | 源代码目录(相对于 project.json 所在目录) | -| `temp_dir` | string | 临时文件目录(存放 .vpi 存根等) | -| `output_dir` | string | 输出文件目录 | +| `source_dir` | string | 源代码目录(相对于 project.vpj 所在目录) | +| `build_dir` | string | 构建目录(默认 `./.tpv_build`);`temp`/`output` 均由它派生 | ### 编译器配置 @@ -67,10 +66,14 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 | 字段 | 类型 | 说明 | |------|------|------| -| `linker.cmd` | string | 链接器命令(通常为 `ld.lld.exe`) | +| `linker.cmd` | string | 链接器命令(通常为 `ld.lld.exe`;TransPyV 宿主工程为 `clang++`) | | `linker.flags` | string[] | 链接器标志 | +| `linker.static_libs` | string[] | 静态库/目标文件列表(`.a`/`.obj`) | +| `linker.dynamic_libs` | string[] | 动态库列表(`.dll`/`.so`) | | `linker.output` | string | 输出文件名 | +支持 DSO(动态共享对象)构建:开启后产物为 `*_dso.ll`。 + 常用 `ld.lld` 标志: - `-m elf_x86_64`:ELF x86_64 格式 - `-T linker.ld`:链接脚本 @@ -85,9 +88,8 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 | `target.triple` | string | LLVM 目标三元组 | | `target.datalayout` | string | LLVM 数据布局字符串 | -默认值: -- triple: `x86_64-none-elf` -- datalayout: `e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128` +注意:**无统一默认 triple**——由各工程 `project.vpj` 自行指定(TransPyV 自身为 `x86_64-pc-windows-gnu`;ViperOS 内核为 `x86_64-none-elf`)。`target.datalayout` 同样随工程配置,内核工程常用: +`e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128` ### 包含路径 @@ -100,6 +102,7 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 | 字段 | 类型 | 说明 | |------|------|------| | `options.slice_level` | int | 切片优化级别(0-3) | +| `options.sha1_slice_level` | int | SHA1 切片存储级别(默认 1;≥1 时产物按 `{temp}/{sha1[0:2]}/` 子目录存放) | | `options.target` | string | 编译目标(目前仅支持 `llvm`) | | `options.strict_mode` | bool | 严格模式 | @@ -119,7 +122,7 @@ Viper 项目使用 `project.json` 配置文件管理编译和链接参数。 ``` VKernel/ -├── project.json # 项目配置 +├── project.vpj # 项目配置 ├── linker.ld # 链接脚本 ├── Kernel/ # 源代码目录 │ ├── main.vp # 内核入口 @@ -134,37 +137,43 @@ VKernel/ │ │ ├── storage/ │ │ └── ... │ └── ... -├── temp/ # 临时文件(自动生成) -│ ├── .vpi # 签名存根(阶段一生成) -│ ├── .stub.ll # LLVM IR 声明(阶段一生成) -│ └── _sha1_map.txt # SHA1→源文件路径映射 -└── output/ # 输出文件(自动生成) - ├── kernel.bin # 内核二进制 - ├── *.deps.json # 依赖信息 - └── linker.ld # 生成的链接脚本 +├── .tpv_build/ # 构建目录(build_dir,自动生成) +│ ├── temp/ # 临时文件 +│ │ ├── / # SHA1 切片子目录(sha1_slice_level ≥ 1) +│ │ │ ├── .vpi # 签名存根 +│ │ │ ├── .stub.ll # LLVM IR 声明 +│ │ │ ├── .text.ll # 含代码的 .ll +│ │ │ └── .deps.txt # 依赖信息 +│ │ └── _sha1_map.txt # SHA1→源文件路径映射(仅人类可读) +│ └── output/ # 输出文件 +│ ├── kernel.bin # 内核二进制 +│ ├── *.deps.txt # 依赖信息 +│ └── linker.ld # 生成的链接脚本 ``` ### 应用项目 ``` HelloWorld/ -├── project.json # 项目配置 +├── project.vpj # 项目配置 ├── linker.ld # 链接脚本 ├── main.vp # 应用入口 -├── temp/ # 临时文件 -└── output/ # 输出文件 - └── helloworld.elf # ELF 可执行文件 +└── .tpv_build/ # 构建目录(自动生成) + ├── temp/ # 临时文件 + └── output/ # 输出文件 + └── helloworld.elf # ELF 可执行文件 ``` ### 库项目 ``` SerialLogger/ -├── project.json # 项目配置 +├── project.vpj # 项目配置 ├── linker.ld # 链接脚本 ├── serial_logger.vp # 库源码 -├── temp/ # 临时文件 -└── output/ # 输出文件 +└── .tpv_build/ # 构建目录(自动生成) + ├── temp/ # 临时文件 + └── output/ # 输出文件 ``` ## 链接脚本 @@ -220,28 +229,40 @@ python TransPyC.py -f InputFile -o OutputFile [options] | `-args` | 运行参数 | | `-h` | 辅助文件(C 或 Python) | -工程编译使用: +工程编译使用(`--project` 指定工程文件): ```bash -python Projectrans.py xxx.json +python Projectrans.py --project project.vpj ``` 即可 +## 构建流程(真实骨架) + +工程构建的实际流水线: + +- **Phase 1(声明阶段)**:扫描入口与依赖并建依赖图 → 1a 结构体注册 → 1b 生成 `.vpi` 并翻译生成 stub +- **Phase 2(翻译与链接)** + - **Phase A-pre-vpi / Phase A-pre**:加载 `.vpi`,预翻译准备 + - **Phase A**:主循环多遍收敛翻译,`.stub.ll`/`.text.ll` 在此写盘 + - **Phase B**:`llc` 并行编译 `.ll` → `.o` + - **Phase B+**:缺失 includes 按需编译 + - **Phase C**:链接(`linker.cmd` 决定链接器) + ## 增量编译 TransPyC 支持基于 SHA1 的增量编译,与两阶段编译模型紧密耦合: ### 阶段一增量 -- 每个源文件按内容计算 SHA1 哈希(16位) +- 每个源文件按内容计算 SHA1 哈希(16 个十六进制字符,即 64 位截断) - 如果 `.vpi` 和 `.stub.ll` 已存在,则跳过生成(缓存命中) - 只有源文件内容变化导致 SHA1 变化时才重新生成声明接口 -- `temp/_sha1_map.txt` 记录 SHA1 → 源文件路径的映射,格式为 `:` +- SHA1 → 源文件路径映射在内存 `Sha1Store` 中多遍收敛构建;`temp/_sha1_map.txt`(格式 `:`)仅人类可读 ### 阶段二增量 -- 阶段二加载 `temp/_sha1_map.txt` 重建 SHA1 映射 -- 过滤掉不在当前 SHA1 映射中的旧 `.vpi` 和 `.stub.ll` 文件 -- 共享符号表一次性构建,避免每个文件重复加载 +- 阶段二(Phase A 主循环)在内存 `Sha1Store`/`StubMergerStore` 中多遍收敛构建并复用映射,不依赖 `_sha1_map.txt` +- 旧产物清理使用 `--clear-cache` +- 共享符号表为内存 `StubMergerStore`,按需加载避免每个文件重复加载 ### SHA1 命名空间与增量编译的协同 diff --git a/wiki/13-bootstrapping.md b/wiki/13-bootstrapping.md index e5cfe83..7538bed 100644 --- a/wiki/13-bootstrapping.md +++ b/wiki/13-bootstrapping.md @@ -1,9 +1,10 @@ # TransPyC 自举可行性分析 -> **状态**:进行中 -> **创建时间**:2026-06-26 -> **最后更新**:2026-06-30 -> **结论**:完全自举可行,核心障碍已被攻克,剩余工作明确 +> **状态**:已完成(本文为 2026-06-30 可行性分析历史记录) +> **创建时间**:2026-06-26 +> **最后更新**:2026-06-30 +> **结论**:完全自举可行——已于 2026-08 后实现:TPC 编译 TransPyV → `TransPyV/output/TransPyV.exe`(Phase A)→ 自举编译自身(Phase B/C 已跑通);当前编译器脱离 Python 运行时,由 includes/ast 自研解析器 + Viper 编译器自举 +> **现状说明**:本文全部 LOC/文件结构数据(includes/ast 4,176 行、`__tokens`/`__nodes`/`__parser` 文件名、llvmlite ~1,500 行、main.vp 10 个 llvmlite 测试等)均为 2026-06-30 历史数据。现状:includes/ast 为 tokens/base/exprs/stmts/parser 等 9 文件约 8K 行;llvmlite 7 文件约 5.9K 行;TransPyV/App/main.vp 现为编译器 CLI 入口。 --- @@ -59,8 +60,8 @@ |------|-----|------| | `includes/numpy/__init__.vp` | 1,016 | ndarray n 维数组 | | `includes/zlib/` | ~1,900 | 完整 deflate/inflate/huffman/checksum | -| `includes/ast/` | 4,176 | **自研 Python 解析器(自举组件)** | -| `includes/llvmlite/` | ~1,500 | **自研 LLVM IR 生成库(自举组件)** | +| `includes/ast/` | 4,176 | **自研 Python 解析器(自举组件)**(历史数据,2026-06-30) | +| `includes/llvmlite/` | ~1,500 | **自研 LLVM IR 生成库(自举组件)**(历史数据,2026-06-30) | | `includes/linkedlist.vp` | ~400 | 泛型链表(@t.NoVTable + PEP 695) | | `includes/vipermath.vp` | 450 | 数学库 | | ...(30+ 文件) | ... | mpool/mbuddy/string/stdio/json/w32 等 | @@ -92,6 +93,8 @@ | `__lexer.vp` | ~800 | 词法分析器 | | `__parser.vp` | 4,176(含表格) | 递归下降语法分析器 | +*注:上表 includes/ast 文件名与行数(`__tokens`/`__nodes`/`__lexer`/`__parser`,4,176 行)为 2026-06-30 历史数据;现状:includes/ast 已重构为 tokens/base/exprs/stmts/parser 等 9 文件约 8K 行。* + **覆盖语法**:装饰器、async/await、match(含复杂模式 `[x,*rest]`/`{'type':t,**rest}`/`Point(x,y)`/`0|1|2`)、try/except/finally/raise from、with、lambda、列表/集合/字典/生成器推导式、f-string(含 `!r`/`!s` 转换和 `:>{width}` 格式说明)、链式比较、walrus、yield from、global/nonlocal、切片、嵌套三元。 **设计要点**: @@ -111,13 +114,15 @@ | `__module.vp` | Module 容器 + 目标三元组 + 输出 .ll | | `__builder.vp` | IRBuilder(指令发射 + SSA 命名) | +*注:上表 includes/llvmlite 结构(~1,500 行、18/18 测试)为 2026-06-30 历史数据;现状:llvmlite 7 文件约 5.9K 行。* + **设计要点**: - `LLVMType` 用 `t.REnum`(tagged union)—— 少变体、无通用字段、match 分派的理想场景 - 指令 opcode 用 `t.CEnum`(IROp)—— 类型安全且零开销 - IR 文本生成用 `viperlib.snprintf` 格式化,避免手写逐字符拼接 - 对象分配用普通类 + `mpool`,不持有全局 `mbuddy` -**验证**:[TransPyV/App/main.vp](../TransPyV/App/main.vp) 10 个测试覆盖类型打印、值打印、build_add、if-else、模块打印、lli 实际执行。TransPyV 程序运行时自己生成合法 IR,被 `lli` 成功执行。 +**验证**:[TransPyV/App/main.vp](../TransPyV/App/main.vp) 10 个 llvmlite 测试覆盖类型打印、值打印、build_add、if-else、模块打印、lli 实际执行。TransPyV 程序运行时自己生成合法 IR,被 `lli` 成功执行。(历史数据,2026-06-30;该 main.vp 现为编译器 CLI 入口) ### 3.3 ✅ 基础设施库 @@ -147,7 +152,7 @@ **原问题**:编译器用 Python `ast` 模块解析源码,自举需自己写 Python 解析器(预计 5,000-10,000 LOC)。 -**解决**:`includes/ast/` 4,176 LOC 实现完整 Python 解析器,AstTest 解析 CPython 凥乎全部语法通过。预言已兑现,且实际规模(4,176 LOC)低于预估下限(5,000 LOC)。 +**解决**:`includes/ast/` 4,176 LOC(历史数据,2026-06-30)实现完整 Python 解析器,AstTest 解析 CPython 凥乎全部语法通过。预言已兑现,且实际规模(4,176 LOC)低于预估下限(5,000 LOC)。 ### 4.3 ~~动态反射 4241 处(原:致命)~~ → ⚠️ 降级为可控 @@ -187,8 +192,8 @@ ### 5.1 路径 A:完全自举(当前目标,可行) **已完成**: -1. ✅ `includes/ast/` Python 解析器(4,176 LOC) -2. ✅ `includes/llvmlite/` LLVM IR 生成库(~1,500 LOC) +1. ✅ `includes/ast/` Python 解析器(4,176 LOC,历史数据,2026-06-30;现为 9 文件约 8K 行) +2. ✅ `includes/llvmlite/` LLVM IR 生成库(~1,500 LOC,历史数据,2026-06-30;现为 7 文件约 5.9K 行) 3. ✅ 基础设施库(linkedlist/mpool/mbuddy/string/json/w32) **剩余工作**: @@ -198,7 +203,7 @@ 4. **lib/StubGen 重写**(~2K LOC) 5. **Python 标准库缺口补齐**(os/subprocess/re/pickle,~5K LOC) -**预计新增代码量**:30-35K LOC TransPyC。与已完成的 includes/ast(4,176 LOC)+ includes/llvmlite(~1,500 LOC)+ 其他基础库为同一量级——已经证明过两次能做这件事。 +**预计新增代码量**:30-35K LOC TransPyC。与已完成的 includes/ast(4,176 LOC)+ includes/llvmlite(~1,500 LOC)+ 其他基础库为同一量级(历史数据,2026-06-30)——已经证明过两次能做这件事。 ### 5.2 关键技术验证点(已完成) @@ -250,3 +255,14 @@ | "4241 处动态反射致命" | 90% 是工程偷懒(isinstance 节点分派/IR 类型分派),真实反射约 200-500 处 | | "推荐路径 C:不自举" | 推荐路径 A:完全自举 | | "预计自举后 60K-80K LOC" | 修正为 30-35K LOC(基础组件已 5,700 LOC 完成) | + +--- + +## 9. 当前自举状态(2026-08 后) + +完整构建流程、产物与命令见 [TransPyV/README.md](../TransPyV/README.md) 与 [MCP/protocol.md](../MCP/protocol.md)(在仓库根目录执行): + +```text +python Projectrans.py --project TransPyV\project.json --clean +TransPyV/output/TransPyV.exe --help +``` diff --git a/wiki/14-oo-refactor.md b/wiki/14-oo-refactor.md index 077fb95..e1fc2d5 100644 --- a/wiki/14-oo-refactor.md +++ b/wiki/14-oo-refactor.md @@ -1,7 +1,7 @@ # TPV 对象化重构方案 > 基线:TPV `f63dcd7` / TransPyC `e1cb560`(对象化前最后稳定版本,2026-08-09) -> 状态:方案讨论稿,未开始实施 +> 状态:已实施(落地形态与方案存在偏差,见下) ## 1. 背景与目标 @@ -19,6 +19,8 @@ TPV 编译器当前是"**数据对象 + 行为函数式**"架构: | HandlesClassDef.vp | 172KB | 4010 | | HandlesType.vp | 102KB | 2360 | +*注:表中 Handles*.vp 行数为历史基线(TransPyV/App/lib/core/Handles 已删除);迁移去向:HandlesExprCall → Gen/Call(12 文件)、HandlesExpr → Gen/Expr、HandlesClassDef → Gen/Class、HandlesType → Gen/Type(位于 TransPyV/App/lib/core/Gen/)。* + ### 1.2 重构目标 1. **对象化**:引入 `Generator` 生成器对象(Mixin 组合),状态集中于 `self`,与 TPC 的 `Translator + LlvmCodeGenerator` 架构对齐 @@ -63,7 +65,7 @@ includes/llvmlite/ # ① 方法化平移(P0) TransPyV/App/lib/core/ ├── Gen/ # ② 生成器对象(P1-P6) - │ ├── Generator.vp # 入口:@t.CVTable,Mixin 组合,visit 分派 + │ ├── Generator.vp # 入口:实际落地为组合:@t.NoVTable class Generator 持 46 个 GenMixin 子对象,非 Mixin 多继承 │ ├── BaseGenMixin.vp # 状态/Pool/Module/Builder/SymTab + 错误/trace │ ├── TypeGenMixin.vp # 类型映射/注解解析(← HandlesType) │ ├── StructGenMixin.vp # struct 注册/字段/继承/vtable(← HandlesStruct+ClassDef 布局) @@ -78,6 +80,8 @@ TransPyV/App/lib/core/ ## 4. P0:llvmlite 方法化(双轨过渡) +> **落地状态**:未实施/已放弃,保留顶层函数调用(build_load → self.load 方法化未落地)。 + ### 4.1 原则 **纯方法化平移,不改布局、不改语义**:顶层函数 → 类方法,`self` 替代首参;类保持 `@t.NoVTable` + 硬编码 SIZE(不引入 vtable 继承)。 @@ -146,6 +150,8 @@ class Generator(BaseGenMixin, TypeGenMixin, StructGenMixin, pass ``` +*注:本骨架为原始方案;实际落地为组合架构(@t.NoVTable class Generator 持 46 个 GenMixin 子对象),见 §3 图注。* + BaseGenMixin 状态字段(迁移自 HandlesTranslator): `Pool` / `Module` / `Builder` / `SymTab` / `FuncTable` / `FuncCount` / `StructTable` / `VTableCache` / `ImportedModules` / `FromImports` / `ModuleSha1` / `CurFunc` / `CurBuilder` / `CurClassName` / 错误 trace 栈 @@ -175,6 +181,8 @@ self.visit_call(node) # 内部用 self.Pool/self.Builder/self.Module/se - 中间态:`self.visit_call(node, funcs_ptr, func_count)`(表引用局部化后去参) - 迁移顺序**从叶子到根**(先无依赖者),每迁移一个 Mixin 立即 bootstrap +> **落地状态**:未完全落地:pool/builder/mod/funcs 仍显式连传(CallGenMixin.translate_call),GenApi 保留模块级兼容壳。 + ### 5.4 CallGen 拆解(P4,膨胀治理重点) `translate_call` 7043 行按分支簇拆为方法(**纯移动,逻辑零改动**): diff --git a/wiki/15-multiple-inheritance.md b/wiki/15-multiple-inheritance.md index dfb49f5..5d9e63f 100644 --- a/wiki/15-multiple-inheritance.md +++ b/wiki/15-multiple-inheritance.md @@ -1,9 +1,9 @@ # Viper 多继承支持方案 > 背景:Viper 语法层已支持 `class X(A, B)`(`ClassDef.bases` 是列表,parser 正常解析), -> 但语义层只实现单继承(`StructEntry.ParentName` 单值,字段展平/vtable/方法查找均单父)。 -> 目标:实现多继承(含字段合并、vtable 合并、方法查找、菱形去重),并同步 TPC 参考实现。 -> 状态:方案稿,未实施。 +> 已支持 `class X(A, B)` 多继承:`StructEntry` 含 `ParentName`(首父兼容)+ `ParentNames` + `ParentCount`。 +> 目标:实现多继承(含字段合并、vtable 合并、方法查找、菱形去重)并同步参考实现——本文为实施方案记录,均已落地。 +> 状态:已实现。 ## 1. 现状(已实测定位) @@ -17,8 +17,12 @@ | HandlesExprCall.vp `try_operator_overload` / `_translate_method_call` | `get_parent_name` 单链 | 需多父链 | | HandlesExpr.vp 属性访问回退链 | `get_parent_name` 单链 | 需多父链 | +*注:上表 Handles*.vp 位置/行号均为实施方案(历史稿)引用,路径已失效;等价实现已迁移至 Gen:字段展平 ClassGenDef、vtable 合并 ClassGenVTable、MRO StructGenMixin、this 调整 CallGenCall、运算符重载 ExprGenOps(下文各节同)。* + ## 2. MRO 规则(分阶段) +> **落地状态**:已按方案落地:DFS + 声明序去重 MRO、字段/方法短名去重先声明优先、菱形静默最左;无 C3(Phase 2 未实施)、无虚继承。 + ### Phase 1(本方案默认):深度优先 + 声明顺序 + 去重 - 查找顺序:**当前类 → bases 声明顺序逐个递归** - 同名冲突:**先声明者优先**(最左优先) @@ -116,6 +120,8 @@ TPC(Python,`lib/core/`)与 TPV 结构一致,按顺序同步: ## 10. 验证用例(Test/MultiInheritTest/App/main.vp) +*注:回归用例位于仓库根 Test/MultiInheritTest 与 Test/NoVTableCrossMixinTest(TransPyV/Test 自身无双父用例)。* + - 多父字段合并 + 属性访问(`d = D(); d.a + d.b`) - 多父方法调用(非虚 + 虚 vtable 分派) - 运算符重载继承链(父类 dunder)