From 12d2411dfcc47d4042f5b231dcece370e95256aa Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 11:52:45 +0900 Subject: [PATCH 1/6] Targets all, compile, clean, and test seem to work --- README.md | 7 ++++++ prototype/README.md | 32 +++++++++++++++++++++++++++ prototype/corfurl/Makefile | 3 ++- prototype/corfurl/rebar.config | 6 +++++ prototype/corfurl/src/corfurl.app.src | 10 +++++++++ prototype/corfurl/src/corfurl_flu.erl | 5 ++++- 6 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 prototype/README.md create mode 100644 prototype/corfurl/rebar.config create mode 100644 prototype/corfurl/src/corfurl.app.src diff --git a/README.md b/README.md index 678997f..a069037 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,11 @@ as I continue work in early March 2015. Meanwhile, see the wiki for this repo for helpful hints, as time permits. +## Initial re-porting on 'prototype' directory + +* `chain-manager`: not started +* `corfurl`: in progress +* `demo-day-hack`: not started +* `tango`: not started + -Scott and the Machi team diff --git a/prototype/README.md b/prototype/README.md new file mode 100644 index 0000000..e5b10fb --- /dev/null +++ b/prototype/README.md @@ -0,0 +1,32 @@ +# Prototype directory + +The contents of the `prototype` directory is the result of +consolidating several small & independent repos. Originally, each +small was a separate prototype/quick hack for experimentation +purposes. The code is preserved here for use as: + +* Examples of what not to do ... the code **is** a bit ugly, after + all. ^_^ +* Some examples of what to do when prototyping in Erlang. For + example, "Let it crash" style coding is so nice to hack on quickly. +* Some code might actually be reusable, as-is or after some + refactoring. + +## The chain-manager prototype + +TODO + +## The corfurl prototype + +The `corfurl` code is a mostly-complete complete implementation of the +CORFU server & client specification. More details on the papers about +CORFU are mentioned in the `corfurl/docs/corfurl.md` file. + +## The demo-day-hack prototype + +TODO + +## The tango prototype + +TODO + diff --git a/prototype/corfurl/Makefile b/prototype/corfurl/Makefile index c3bdbe5..661cee2 100644 --- a/prototype/corfurl/Makefile +++ b/prototype/corfurl/Makefile @@ -1,6 +1,6 @@ REBAR_BIN := $(shell which rebar) ifeq ($(REBAR_BIN),) -REBAR_BIN = ./rebar +REBAR_BIN = /local/path/to/rebar endif .PHONY: rel deps package pkgclean @@ -15,6 +15,7 @@ deps: clean: $(REBAR_BIN) clean + -for dir in deps/*; do (cd $$dir ; $(REBAR_BIN) clean); done test: deps compile eunit diff --git a/prototype/corfurl/rebar.config b/prototype/corfurl/rebar.config new file mode 100644 index 0000000..bb0358a --- /dev/null +++ b/prototype/corfurl/rebar.config @@ -0,0 +1,6 @@ +%%% {erl_opts, [warnings_as_errors, {parse_transform, lager_transform}, debug_info]}. +{erl_opts, [{parse_transform, lager_transform}, debug_info]}. +{deps, [ + {lager, "2.0.1", {git, "git://github.com/basho/lager.git", {tag, "2.0.1"}}} + ]}. + diff --git a/prototype/corfurl/src/corfurl.app.src b/prototype/corfurl/src/corfurl.app.src new file mode 100644 index 0000000..4e3b9a6 --- /dev/null +++ b/prototype/corfurl/src/corfurl.app.src @@ -0,0 +1,10 @@ +{application, corfurl, [ + {description, "Quick prototype of CORFU in Erlang."}, + {vsn, "0.0.0"}, + {applications, [kernel, stdlib, lager]}, + {mod,{corfurl_unfinished_app,[]}}, + {registered, []}, + {env, [ + {ring_size, 32} + ]} +]}. diff --git a/prototype/corfurl/src/corfurl_flu.erl b/prototype/corfurl/src/corfurl_flu.erl index c092761..e8825f0 100644 --- a/prototype/corfurl/src/corfurl_flu.erl +++ b/prototype/corfurl/src/corfurl_flu.erl @@ -213,7 +213,10 @@ handle_call({{fill, ClientEpoch, _LogicalPN}, LC1}, _From, {reply, {error_badepoch, LC2}, State}; handle_call({{fill, _ClientEpoch, LogicalPN}, LC1}, _From, State) -> LC2 = lclock_update(LC1), - io:format(user, "~s.erl line ~w: TODO: this 'fill or trim' logic is probably stupid, due to mis-remembering the CORFU paper, sorry! Commenting out this warning line is OK, if you wish to proceed with testing Corfurl. This code can change a fill into a trim. Those things are supposed to be separate, silly me, a fill should never automagically change to a trim.\n", [?MODULE, ?LINE]), + case application:get_env(corfurl, todo_warning_flu) of + undefined -> io:format(user, "~s.erl line ~w: TODO: this 'fill or trim' logic is probably stupid, due to mis-remembering the CORFU paper, sorry! Commenting out this warning line is OK, if you wish to proceed with testing Corfurl. This code can change a fill into a trim. Those things are supposed to be separate, silly me, a fill should never automagically change to a trim.\n", [?MODULE, ?LINE]), application:set_env(corfurl, todo_warning_flu, true); + _ -> ok + end, {Reply, NewState} = do_trim_or_fill(fill, LogicalPN, State), ?EVENT_LOG({flu, fill, self(), LogicalPN, Reply}), {reply, {Reply, LC2}, NewState}; From fbd2b6c31d56aefdca7d2ba517a62d163d516a77 Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 14:09:39 +0900 Subject: [PATCH 2/6] Fix up README & using-pulse docs, other fixups --- prototype/README.md | 4 + prototype/corfurl/README.md | 49 +++++-- prototype/corfurl/docs/corfurl.md | 107 -------------- prototype/corfurl/docs/using-pulse.md | 193 ++++++++++++++++++++++++++ prototype/corfurl/src/corfurl_flu.erl | 14 +- 5 files changed, 247 insertions(+), 120 deletions(-) create mode 100644 prototype/corfurl/docs/using-pulse.md diff --git a/prototype/README.md b/prototype/README.md index e5b10fb..c391287 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -22,6 +22,10 @@ The `corfurl` code is a mostly-complete complete implementation of the CORFU server & client specification. More details on the papers about CORFU are mentioned in the `corfurl/docs/corfurl.md` file. +This code contains a QuickCheck + PULSE test. If you wish to use it, +please note the usage instructions and restrictions mentioned in the +`README.md` file. + ## The demo-day-hack prototype TODO diff --git a/prototype/corfurl/README.md b/prototype/corfurl/README.md index 295cfd7..f048333 100644 --- a/prototype/corfurl/README.md +++ b/prototype/corfurl/README.md @@ -1,13 +1,44 @@ -The corfurl code is in the 'src' and 'include' directories. In -addition, there are docs here: +# CORFU in Erlang, a prototype -https://github.com/basho/corfurl/blob/master/docs/corfurl.md +This is a mostly-complete complete prototype implementation of the +CORFU server & client specification. More details on the papers about +CORFU are mentioned in the `docs/corfurl.md` file. -This is a README-style collection of CORFU-related papers, -building instructions, and testing instructions. +## Compilation & unit testing -https://github.com/basho/corfurl/tree/master/docs/corfurl/notes -https://github.com/basho/corfurl/tree/master/docs/corfurl/notes#two-clients-try-to-write-the-exact-same-data-at-the-same-time-to-the-same-lpn +Use `make` and `make test`. Note that the Makefile assumes that the +`rebar` utility is available somewhere in your path. -The above are some notes about testing problems & solutions that -I was/am/?? hoping might find their way into a paper someday. +## Testing with QuickCheck + PULSE + +This model is a bit exciting because it includes all of the following: + +* It uses PULSE +* It uses temporal logic to help verify the model's properties +* It also includes a (manual!) fault injection method to help verify +that the model can catch many bugs. The `eqc_temporal` library uses +a lot of `try/catch` internally, and if your callback code causes an +exception in the "wrong" places, the library will pursue a default +action rather than triggering an error! The fault injection is an +additional sanity check to verify that the model isn't (obviously) +flawed or broken. +* Uses Lamport clocks to help order happens-before and concurrent events. +* Includes stopping the sequencer (either nicely or brutal kill) to verify +that the logic still works without any active sequencer. +* Includes logic to allow the sequencer to give +**faulty sequencer assignments**, including duplicate page numbers and +gaps of unused pages. + +If you have a Quviq QuickCheck license, then you can also use the +`make pulse` target. +Please note the following prerequisites: + +* Erlang R16B. Perhaps R15B might also work, but it has not been + tested yet. +* Quviq QuickCheck version 1.30.2. There appears to be an + `eqc_statem` change in Quviq EQC 1.33.2 that has broken the + test. We'll try to fix the test to be able to use 1.33.x or later, + but it is a lower priority work item for the team right now. + +For more information about the PULSE test and how to use it, see the +`docs/using-pulse.md` file. diff --git a/prototype/corfurl/docs/corfurl.md b/prototype/corfurl/docs/corfurl.md index 8801454..4298f5f 100644 --- a/prototype/corfurl/docs/corfurl.md +++ b/prototype/corfurl/docs/corfurl.md @@ -82,110 +82,3 @@ reading was "No way, wacky" ... and has since changed his mind. http://www.snookles.com/scottmp/corfu/CIDR11Proceedings.pdf pages 9-20 - - -## Fiddling with PULSE - -Do the following: - - make clean - make - make pulse - -... then watch the dots go across the screen for 60 seconds. If you -wish, you can press `Control-c` to interrupt the test. We're really -interested in the build artifacts. - - erl -pz .eunit deps/*/ebin - eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). - -This will run the PULSE test for 5 seconds. Feel free to adjust for -as many seconds as you wish. - - Erlang R16B02-basho4 (erts-5.10.3) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] - - Eshell V5.10.3 (abort with ^G) - 1> eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). - Starting Quviq QuickCheck version 1.30.4 - (compiled at {{2014,2,7},{9,19,50}}) - Licence for Basho reserved until {{2014,2,17},{1,41,39}} - ...................................................................................... - OK, passed 86 tests - schedule: Count: 86 Min: 2 Max: 1974 Avg: 3.2e+2 Total: 27260 - true - 2> - -REPL interactive work can be done via: - -1. Edit code, e.g. `corfurl_pulse.erl`. -2. Run `env BITCASK_PULSE=1 ./rebar skip_deps=true -D PULSE eunit suites=SKIP` -to compile. -3. Reload any recompiled modules, e.g. `l(corfurl_pulse).` -4. Resume QuickCheck activities. - -## Seeing an PULSE scheduler interleaving failure in action - -1. Edit `corfurl_pulse:check_trace()` to uncomment the - use of `conjunction()` that mentions `bogus_order_check_do_not_use_me` - and comment out the real `conjunction()` call below it. -2. Recompile & reload. -3. Check. - -For example: - - 9> eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). - .........Failed! After 9 tests. - -Sweet! The first tuple below are the first `?FORALL()` values, -and the 2nd is the list of commands, -`{SequentialCommands, ListofParallelCommandLists}`. The 3rd is the -seed used to perturb the PULSE scheduler. - -In this case, `SequentialCommands` has two calls (to `setup()` then -`append()`) and there are two parallel procs: one makes 1 call -call to `append()` and the other makes 2 calls to `append()`. - - {2,2,9} - {{[{set,{var,1},{call,corfurl_pulse,setup,[2,2,9]}}], - [[{set,{var,3}, - {call,corfurl_pulse,append, - [{var,1},<<231,149,226,203,10,105,54,223,147>>]}}], - [{set,{var,2}, - {call,corfurl_pulse,append, - [{var,1},<<7,206,146,75,249,13,154,238,110>>]}}, - {set,{var,4}, - {call,corfurl_pulse,append, - [{var,1},<<224,121,129,78,207,23,79,216,36>>]}}]]}, - {27492,46961,4884}} - -Here are our results: - - simple_result: passed - errors: passed - events: failed - identity: passed - bogus_order_check_do_not_use_me: failed - [{ok,1},{ok,3},{ok,2}] /= [{ok,1},{ok,2},{ok,3}] - -Our (bogus!) order expectation was violated. Shrinking! - - simple_result: passed - errors: passed - events: failed - identity: passed - bogus_order_check_do_not_use_me: failed - [{ok,1},{ok,3},{ok,2}] /= [{ok,1},{ok,2},{ok,3}] - -Shrinking was able to remove two `append()` calls and to shrink the -size of the pages down from 9 bytes down to 1 byte. - - Shrinking........(8 times) - {1,1,1} - {{[{set,{var,1},{call,corfurl_pulse,setup,[1,1,1]}}], - [[{set,{var,3},{call,corfurl_pulse,append,[{var,1},<<0>>]}}], - [{set,{var,4},{call,corfurl_pulse,append,[{var,1},<<0>>]}}]]}, - {27492,46961,4884}} - events: failed - bogus_order_check_do_not_use_me: failed - [{ok,2},{ok,1}] /= [{ok,1},{ok,2}] - false diff --git a/prototype/corfurl/docs/using-pulse.md b/prototype/corfurl/docs/using-pulse.md new file mode 100644 index 0000000..2504770 --- /dev/null +++ b/prototype/corfurl/docs/using-pulse.md @@ -0,0 +1,193 @@ + +# Fiddling with PULSE + +## About the PULSE test + +This test is based on `eqc_statem` QuickCheck model, i.e., a +stateful/state machine style test. Roughly speaking, it does the +following things: + +1. Chooses a random number of chains, chain length, and simulated flash + page size. +2. Generates a random set of stateful commands to run. +3. During the test case run, an event trace log is generated. +4. If there are any `postcondition()` checks that fail, of course, + QuickCheck will stop the test and start shrinking. +5. If all of the postcondition checks (and the rest of QuickCheck's + sanity checking) are OK, the event trace log is checked for + sanity. + +### The eqc_statem commands used. + +See the `corfurl_pulse:command/1` function for full details. In +summary: + +* `'setup'`, for configuring the # of chains, chain length, simulated + page size, and whether or not the sequencer is faulty (i.e., + gives faulty sequencer assignments, including duplicate page numbers and + gaps of unused pages). +* `'append'`, for `corfurl_client:append_page/2` +* '`read_approx'`, for `corfurl_client:read_page/2` +* `'scan_forward'`, for `corfurl_client:scan_forward/3` +* `'fill'`, for `corfurl_client:fill_page/2` +* `'trim'`, for `corfurl_client:trim_page/2' +* `'stop_sequencer'`, for `corfurl_sequencer:stop/2' + +### Sanity checks for the event trace log + +Checking the event trace log for errors is a bit tricky. The model is +similar to checking a key-value store. In a simple key-value store +model, we know (in advance) the full key. However, in CORFU, the +sequencer tells us the key, i.e., the flash page number that an +"append page" operation will use. So the model must be able to infer +the flash page number from the event trace, then use that page number +as the key for the rest of the key-value-store-like model checks. + +This test also uses the `eqc_temporal` library for temporal logic. I +don't claim to be a master of using temporal logic in general or that +library specifically ... so I hope that I haven't introduced a subtle +bug into the model. ^_^. + +Summary of the sanity checks of the event trace: + +* Do all calls finish? +* Are there any invalid page transitions? E.g., `written -> + unwritten` is forbidden. +* Are there any bad reads? E.g., reading an `error_unwritten` result + when the page has **definitely** been written/filled/trimmed. + * Note that temporal logic is used to calculate when we definitely + know a page's value vs. when we know that a page's value is + definitely going to change + **but we don't know exactly when the change has taken place**. + +### Manual fault injection + +TODO: Automate the fault injection testing, via "erl -D" compilation. + +There are (at least) five different types of fault injection that can +be implemented by defining certain Erlang preprocessor symbols at +compilation time of `corfurl_pulse.erl`. + + TRIP_no_append_duplicates + Will falsely report the LPN (page number) of an append, if the + actual LPN is 3, as page #3. + TRIP_bad_read + Will falsely report the value of a read operation of LPN #3. + TRIP_bad_scan_forward + Will falsely report written/filled pages if the # of requested + pages is equal to 10. + TRIP_bad_fill + Will falsely report the return value of a fill operation if the + requested LPN is between 3 & 5. + TRIP_bad_trim + Will falsely report the return value of a trim operation if the + requested LPN is between 3 & 5. + +## Compiling and executing batch-style + +Do the following: + + make clean ; make ; make pulse + +... then watch the dots go across the screen for 60 seconds. If you +wish, you can press `Control-c` to interrupt the test. We're really +interested in the build artifacts. + +## Executing interactively at the REPL shell + +After running `make pulse`, use the following two commands to start an +Erlang REPL shell and run a test for 5 seconds. + + erl -pz .eunit deps/*/ebin + eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). + +This will run the PULSE test for 5 seconds. Feel free to adjust for +as many seconds as you wish. + + Erlang R16B02-basho4 (erts-5.10.3) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] + + Eshell V5.10.3 (abort with ^G) + 1> eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). + Starting Quviq QuickCheck version 1.30.4 + (compiled at {{2014,2,7},{9,19,50}}) + Licence for Basho reserved until {{2014,2,17},{1,41,39}} + ...................................................................................... + OK, passed 86 tests + schedule: Count: 86 Min: 2 Max: 1974 Avg: 3.2e+2 Total: 27260 + true + 2> + +REPL interactive work can be done via: + +1. Edit code, e.g. `corfurl_pulse.erl`. +2. Run `env USE_PULSE=1 rebar skip_deps=true -D PULSE eunit suites=SKIP` + to compile. +3. Reload any recompiled modules, e.g. `l(corfurl_pulse).` +4. Resume QuickCheck activities. + +## Seeing an PULSE scheduler interleaving failure in action + +1. Edit `corfurl_pulse:check_trace()` to uncomment the + use of `conjunction()` that mentions `bogus_order_check_do_not_use_me` + and comment out the real `conjunction()` call below it. +2. Recompile & reload. +3. Check. + +For example: + + 9> eqc:quickcheck(eqc:testing_time(5, corfurl_pulse:prop_pulse())). + .........Failed! After 9 tests. + +Sweet! The first tuple below are the first `?FORALL()` values, +and the 2nd is the list of commands, +`{SequentialCommands, ListofParallelCommandLists}`. The 3rd is the +seed used to perturb the PULSE scheduler. + +In this case, `SequentialCommands` has two calls (to `setup()` then +`append()`) and there are two parallel procs: one makes 1 call +call to `append()` and the other makes 2 calls to `append()`. + + {2,2,9} + {{[{set,{var,1},{call,corfurl_pulse,setup,[2,2,9]}}], + [[{set,{var,3}, + {call,corfurl_pulse,append, + [{var,1},<<231,149,226,203,10,105,54,223,147>>]}}], + [{set,{var,2}, + {call,corfurl_pulse,append, + [{var,1},<<7,206,146,75,249,13,154,238,110>>]}}, + {set,{var,4}, + {call,corfurl_pulse,append, + [{var,1},<<224,121,129,78,207,23,79,216,36>>]}}]]}, + {27492,46961,4884}} + +Here are our results: + + simple_result: passed + errors: passed + events: failed + identity: passed + bogus_order_check_do_not_use_me: failed + [{ok,1},{ok,3},{ok,2}] /= [{ok,1},{ok,2},{ok,3}] + +Our (bogus!) order expectation was violated. Shrinking! + + simple_result: passed + errors: passed + events: failed + identity: passed + bogus_order_check_do_not_use_me: failed + [{ok,1},{ok,3},{ok,2}] /= [{ok,1},{ok,2},{ok,3}] + +Shrinking was able to remove two `append()` calls and to shrink the +size of the pages down from 9 bytes down to 1 byte. + + Shrinking........(8 times) + {1,1,1} + {{[{set,{var,1},{call,corfurl_pulse,setup,[1,1,1]}}], + [[{set,{var,3},{call,corfurl_pulse,append,[{var,1},<<0>>]}}], + [{set,{var,4},{call,corfurl_pulse,append,[{var,1},<<0>>]}}]]}, + {27492,46961,4884}} + events: failed + bogus_order_check_do_not_use_me: failed + [{ok,2},{ok,1}] /= [{ok,1},{ok,2}] + false diff --git a/prototype/corfurl/src/corfurl_flu.erl b/prototype/corfurl/src/corfurl_flu.erl index e8825f0..24f16a3 100644 --- a/prototype/corfurl/src/corfurl_flu.erl +++ b/prototype/corfurl/src/corfurl_flu.erl @@ -213,10 +213,7 @@ handle_call({{fill, ClientEpoch, _LogicalPN}, LC1}, _From, {reply, {error_badepoch, LC2}, State}; handle_call({{fill, _ClientEpoch, LogicalPN}, LC1}, _From, State) -> LC2 = lclock_update(LC1), - case application:get_env(corfurl, todo_warning_flu) of - undefined -> io:format(user, "~s.erl line ~w: TODO: this 'fill or trim' logic is probably stupid, due to mis-remembering the CORFU paper, sorry! Commenting out this warning line is OK, if you wish to proceed with testing Corfurl. This code can change a fill into a trim. Those things are supposed to be separate, silly me, a fill should never automagically change to a trim.\n", [?MODULE, ?LINE]), application:set_env(corfurl, todo_warning_flu, true); - _ -> ok - end, + perhaps_spew_TODO_warning(), {Reply, NewState} = do_trim_or_fill(fill, LogicalPN, State), ?EVENT_LOG({flu, fill, self(), LogicalPN, Reply}), {reply, {Reply, LC2}, NewState}; @@ -425,11 +422,20 @@ trim_page(Op, LogicalPN, #state{max_mem=MaxMem, mem_fh=FH} = S) -> %% We do *not* want to remove any special PULSE return code. undo_special_pulse_test_result(Res) -> Res. + +perhaps_spew_TODO_warning() -> + ok. -else. % PULSE undo_special_pulse_test_result({special_trimmed, LPN}) -> {ok, LPN}; undo_special_pulse_test_result(Res) -> Res. + +perhaps_spew_TODO_warning() -> + case get(todo_warning_flu) of + undefined -> io:format(user, "~s.erl line ~w: TODO: this 'fill or trim' logic is probably stupid, due to mis-remembering the CORFU paper, sorry! Commenting out this warning line is OK, if you wish to proceed with testing Corfurl. This code can change a fill into a trim. Those things are supposed to be separate, silly me, a fill should never automagically change to a trim.\n", [?MODULE, ?LINE]), put(todo_warning_flu, true); + _ -> ok + end. -endif. % PULSE From c148ed8d6690b25f5f55f0dc062300f4585071fa Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 14:43:26 +0900 Subject: [PATCH 3/6] Fix up PULSE code & documentation --- prototype/README.md | 9 +++++++++ prototype/corfurl/README.md | 3 ++- prototype/corfurl/docs/corfurl.md | 14 ++++++++++++++ prototype/corfurl/docs/corfurl/notes/README.md | 13 +++++++++++++ prototype/corfurl/docs/using-pulse.md | 3 +-- prototype/corfurl/test/corfurl_pulse.erl | 13 +++++++------ 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/prototype/README.md b/prototype/README.md index c391287..3b2e747 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -12,6 +12,15 @@ purposes. The code is preserved here for use as: * Some code might actually be reusable, as-is or after some refactoring. +The prototype code here is not meant for long-term use or +maintenance. We are unlikely to accept changes/pull requests for adding +large new features or to build full Erlang/OTP applications using this +code only. + +However, pull requests for small changes, such as support for +newer Erlang versions (e.g., Erlang 17), will be gladly accepted. +We will also accept fixes for bugs in the test code. + ## The chain-manager prototype TODO diff --git a/prototype/corfurl/README.md b/prototype/corfurl/README.md index f048333..fb89daf 100644 --- a/prototype/corfurl/README.md +++ b/prototype/corfurl/README.md @@ -27,7 +27,8 @@ flawed or broken. that the logic still works without any active sequencer. * Includes logic to allow the sequencer to give **faulty sequencer assignments**, including duplicate page numbers and -gaps of unused pages. +gaps of unused pages. Even if the sequencer **lies to us**, all other +CORFU operation should remain 100% correct. If you have a Quviq QuickCheck license, then you can also use the `make pulse` target. diff --git a/prototype/corfurl/docs/corfurl.md b/prototype/corfurl/docs/corfurl.md index 4298f5f..d991f39 100644 --- a/prototype/corfurl/docs/corfurl.md +++ b/prototype/corfurl/docs/corfurl.md @@ -1,3 +1,17 @@ +## Notes on developing & debugging this CORFU prototype + +I've recorded some notes while developing & debugging this CORFU +prototype. See the `corfurl/notes` subdirectory. + +Most of the cases mentioned involve race conditions that were notable +during the development cycle. There is one case that IIRC is not +mentioned in any of the CORFU papers and is probably a case that +cannot be fixed/solved by CORFU itself. + +Each of the scenario notes includes an MSC diagram specification file +to help illustrate the race. The diagrams are annotated by hand, both +with text and color, to point out critical points of timing. + ## CORFU papers I recommend the "5 pages" paper below first, to give a flavor of diff --git a/prototype/corfurl/docs/corfurl/notes/README.md b/prototype/corfurl/docs/corfurl/notes/README.md index b5757aa..e5deb23 100644 --- a/prototype/corfurl/docs/corfurl/notes/README.md +++ b/prototype/corfurl/docs/corfurl/notes/README.md @@ -1,3 +1,16 @@ +## NOTE + +The Git commit numbers used below refer to a private Git +repository and not to the https://github.com/basho/machi repo. My +apologies for any confusion. + +## Generating diagrams of the race/bug scenarios + +Each of the scenario notes includes an MSC diagram +(Message Sequence Chart) specification file +to help illustrate the race, each with an `.mscgen` suffix. Use the +`mscgen` utility to render the diagrams into PNG, Encapsulated Postscript, +or other graphic file formats. ## read-repair-race.1. diff --git a/prototype/corfurl/docs/using-pulse.md b/prototype/corfurl/docs/using-pulse.md index 2504770..7377394 100644 --- a/prototype/corfurl/docs/using-pulse.md +++ b/prototype/corfurl/docs/using-pulse.md @@ -128,8 +128,7 @@ REPL interactive work can be done via: ## Seeing an PULSE scheduler interleaving failure in action 1. Edit `corfurl_pulse:check_trace()` to uncomment the - use of `conjunction()` that mentions `bogus_order_check_do_not_use_me` - and comment out the real `conjunction()` call below it. + use of `conjunction()` that mentions the `{bogus_no_gaps, ...}` tuple. 2. Recompile & reload. 3. Check. diff --git a/prototype/corfurl/test/corfurl_pulse.erl b/prototype/corfurl/test/corfurl_pulse.erl index d00c2d7..28bdcb2 100644 --- a/prototype/corfurl/test/corfurl_pulse.erl +++ b/prototype/corfurl/test/corfurl_pulse.erl @@ -477,7 +477,9 @@ check_trace(Trace0, _Cmds, _Seed) -> fun(x)-> [] end, Events), {_, _, Perhaps} = lists:last(eqc_temporal:all_future(PerhapsR)), - %%?QC_FMT("*Perhaps: ~p\n", [Perhaps]), + %% ?QC_FMT("*Perhaps: ~p\n", [Perhaps]), + _PerhapsLPNs = lists:sort([LPN || {perhaps, LPN, _} <- Perhaps]), + %% ?QC_FMT("*_PerhapsLPNs: ~p\n", [_PerhapsLPNs]), Reads = eqc_temporal:stateful( fun({call, Pid, {read, LPN, _, _}}) -> {read, Pid, LPN, []} @@ -555,13 +557,12 @@ check_trace(Trace0, _Cmds, _Seed) -> InvalidTransitions == []}, {no_bad_reads, eqc_temporal:is_false(eqc_temporal:all_future(BadReads))}, - %% If you want to see PULSE causing crazy scheduling, then - %% change one of the "true orelse" -> "false orelse" below. %% {bogus_no_gaps, - %% true orelse - %% (AppendLPNs == [] orelse length(range_ify(AppendLPNs)) == 1)}, + %% (_PerhapsLPNs == [] orelse length(range_ify(_PerhapsLPNs)) == 1)}, %% {bogus_exactly_1_to_N, - %% true orelse (AppendLPNs == lists:seq(1, length(AppendLPNs)))}, + %% (_PerhapsLPNs == lists:seq(1, length(_PerhapsLPNs)))}, + %% Do not remove the {true, true}, please. It should always be the + %% last conjunction test. {true, true} ])). From 37044a9ef4cf6df944f074def3b314ca63381f04 Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 14:58:46 +0900 Subject: [PATCH 4/6] Update top-level README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a069037..15dbbb3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This source repo is in a state of chaotic consolidation of several independent repos. At the moment, none of the prototype code is expected to work. Perhaps it does, perhaps it doesn't. I'll know -as I continue work in early March 2015. +as we continue work in early March 2015. Meanwhile, see the wiki for this repo for helpful hints, as time permits. @@ -13,7 +13,7 @@ permits. ## Initial re-porting on 'prototype' directory * `chain-manager`: not started -* `corfurl`: in progress +* `corfurl`: finished * `demo-day-hack`: not started * `tango`: not started From 8ddb62d88f4262dcc5ccf18e3e5cb89c34d830b4 Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 15:03:08 +0900 Subject: [PATCH 5/6] Aw, heck, add the PNG versions of the MSC diagrams --- ...2014-02-27.chain-repair-need-write-twice.png | Bin 0 -> 13340 bytes .../docs/corfurl/notes/read-repair-race.1.png | Bin 0 -> 23879 bytes .../docs/corfurl/notes/read-repair-race.2.png | Bin 0 -> 31597 bytes .../docs/corfurl/notes/read-repair-race.2b.png | Bin 0 -> 30200 bytes .../docs/corfurl/notes/two-clients-race.1.png | Bin 0 -> 13081 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 prototype/corfurl/docs/corfurl/notes/2014-02-27.chain-repair-need-write-twice.png create mode 100644 prototype/corfurl/docs/corfurl/notes/read-repair-race.1.png create mode 100644 prototype/corfurl/docs/corfurl/notes/read-repair-race.2.png create mode 100644 prototype/corfurl/docs/corfurl/notes/read-repair-race.2b.png create mode 100644 prototype/corfurl/docs/corfurl/notes/two-clients-race.1.png diff --git a/prototype/corfurl/docs/corfurl/notes/2014-02-27.chain-repair-need-write-twice.png b/prototype/corfurl/docs/corfurl/notes/2014-02-27.chain-repair-need-write-twice.png new file mode 100644 index 0000000000000000000000000000000000000000..b37dd6f46195a338123326f812a0cc1b48fb0051 GIT binary patch literal 13340 zcmbVz1yodT*Zl=WK)QR7?h;UH0BJ;NC5I4{ZiY@Jr9(hzP*S=Z0ci%1ZUK>zly3N6 z{OQ~8_kHWX)@8BQ%)NK+oaa1e@3YUIP*r7loZFPQ0RX^JRFF{z090-8FBk(AeC3OE zrUUp7(_TTx2>@_AuK!TpaNtq_z#TwQ=7FYL%I2J2Y<4Z7pD{9tW_VkpkgcT0;PH`X z8FM;%jXciT=%!h`mvG8s``(O!vCpvV6>cF1Hmp}m_|#8MYd(vF+^W``Bk6l~^cQgaIHd4KZ^(|Fe-47fqNM8z zDtC=*hI(^IlB>7mZhU{;HOYD&iN3}_kVVF>#WlU7NmG79V^rpZPqU;i3BoO}-oW!> z*`BtzFNDj)<7ZJr03#W5{M#~tJ1C*}142ZdJ5y8sPRb5G_D|nmUiq}diK@p=Z@O=E z5Jl*aXY%s}!ybt(>L=kxHFGKwJdVZ~4)-1vg;Q(t%O|RLZG|&<`cE^Z7U|2MOTA?n zqQ$8(b` Rt5EaWMsL%Yr|z!`87i*Q6g>cj`79m*;Fp*FR|r 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 literal 0 HcmV?d00001 diff --git a/prototype/corfurl/docs/corfurl/notes/read-repair-race.2.png b/prototype/corfurl/docs/corfurl/notes/read-repair-race.2.png new file mode 100644 index 0000000000000000000000000000000000000000..928335bb12e8dd8d7b418a45cdd49aafcee0af15 GIT binary patch literal 31597 zcmd>mc{r5)`}R$VBKy9tp%5Yal0AxSG1ekvH)Mnch3s382H8S(+4ns}WzTNxVr)Yi zO9<~hs;7E>-|z4DJ>K^{-hbXdIy#JT&)lE;b6wYYo#%OdLT+iQo0vT``HCeHMb)>3Nk8&ewFH zN43MDWqkH2>%;YhdFoMb`A8mXxEU~u@K>I8D>w_idi1y%1?5<%VyzIz7ZR}>b3GJE zb6f9AvOs2YR#03Hy|aHU8lN9NF~gseNs1b}sGyqcMmk@kh*EA)ld5JrEqQ}tNBN1w z8yR0rlIIPUKCPf;?(ltrqbg$JHsDIU+*!R%&dpCPO zaVfymIiDzg4!>YdjN+$NzF+;MTBUlTn`UAdCr$h`iP3)b8{=CTQdHnLOaEU~)3%2# z?*n+@9*h;LNm7rkQH9ICsCM~foDtMxJZK6{$9cK>w_~G`Hc4Lq;2CvW9}fW7v;Dbj z^#5326=@6pfZk(#o;ebWFZa&N%|!}#oX;4WhR!*B+E;>f>}h7}>g#vRZx(7QbFUY- z!TpF;+n|vLB=<_kS{0HaCR*qAX=pd6SCZKyZ?q*+#|FV$wtONYgHaf zCYza?Z>;MiMRss-TlhuJKYbhCaemHWmewZQ;r;Sc(}K+q_c{d%`y|WB!kR8BmN^F$ zdFpIv^gzTl%0PMij)-ezjAFqU);MvJY;{dB6D7J#9Lci4_3ToQJU^{X>g-TA)8{wx=NGP%_@-;G^<8Xl zg*-B*%=$Xl1#O*_DKQf4fpRH`QeHxeD#&H@jvdFFBTJKvOcj3GD=lX9#fw-1}9i;h)Ai-Kqvg)x^kQpR$ZG|?Q$q&v#gsOBh! zN2&b=V^rj^@`M8ai38CZ-P)R&(_<(0xQg?BLc0sa_(-7q?e$yn?HLl#nU;R#lZ8 z*t@1@VzVpcsPWDsv%kt_=_K8ro>lTVoH{%;LcBnAFdcVD{^ z^RHKzeAx6XEH0pO(Ma-cg3q~#J6vUe1Z}%NEi>*xxj_(@Ja7%8dgoQL>u-&d$zQ&| zKMolQn19+f?`HYh&vZbJHk!h=Z}MgiM%`d(9MPhC!Bi!j z)t~Y)p`)+ondPDH;r2)ri`>=3ZrA+Jd|CDeY+-yoK9LOVbt>B#0Y3c2&Y{m>6NXoN zvg`x=gBBWB1Cyz5pRJbZIpzDfx3~BBpy{{{iMHMt_D%nKXRS9??s(()Xrm*Fg|MP2 z^c`{Eo6yTWjAD$Fo)d=P#(}@|5$}0EghV1?brrq-d3lvcH2A}KL;Tpx`eR5NjZGv& zpJ45QMPh#&`WNw~57(N5 ze+#h@_jW!97#RF-kmsrV`1*W14(`Tw^co`HYVy28yGp6 zja+aU3;F!oxMc`(QMD~5*g``8)9v`*vvH{bK?1AO&ZTICu0(WU<%hv=rtazHa z#uiU^d56EY)taWU_4tt5$blbJ&Hjp!QAwKsa6O;x6tXt~LJbe>->%BC?3dKNWK={u)nhJFpq%m0@ zdR|igqBs^_>)k0C=h;5DdiLb9=%dL-2;%&(@eVI~c_;IRy~pbvJH*_^QK(?)MhN1e zH83X=hI@^nzLYk?n0S4uio&*n@y7UFOP)tuNu(t+i!^EG!>#MlxB;Xj`la_ zJFLq}x;Vnxgr!1$u2UsE(xq(7;c8;4oG)?ZM@nOK_sFHUemMDmMG-*37l zmXeZkw1-MX!|Igg?PGqw+f&oB+AL$vRmdEbZ5}=vnhr$%G-64SDfL|`E5K>-)jnPY z9?5?5ksU7ZiT-=2b(ZqUY^kJ6iq}m#p(6nxixv#B^uAD6Qb5VAA&+iM^(|`dXcQ-e z(`*azbH~|ahu+er+o;;?bIu)(#fz{R3kEUcR52f3U$Z+M)nWP%>3$z|k+CQ?GEbIgS`Xth%O~`bJiPL#b z12s=|tJ=2K&11DgT{Ce14hDnFGqORq^zB@j`KY<>9#8noc${ncaGCjJzhAdPavZCUx#{)=X<(Nx`IYSm* zCK7a5h7)}g&4-GlG(_EM%N@+s#YQ9Hm-fe@YZ!%bdwk&Q=Fr25jrw8TUNSV5-z?o9mbVjzid?tU{;)$A@b`w3E_G&%@%- zkZLy;5AxnMPWB($Zg2H7UsGV2Bl)TG0Ks3YSWv0W{vA|O$~Q?OJsO7Lnt(k2qEfuo z*r-Tfg0Cwz6w+4$J$!QCM!haMFHf?2MfXAg9>7lR$X-zPcGTO>x(2_)je6}>?Hd!r zpgpyEEoUE_n7=1opV=x-myvt^^W!m20wS00Y!TT<&~>4_QA-~x8nITbRp?m1jh z;$9Vz$V!;vvv_|=fX)fQCtiKdl?|v479<;{N=y;nYU}fyovIEBceS~|(3RnC|4Id* z-F)oDyV827z*4)rckM{hV0p~GrEfKPn+s6lYYBBZyYu0FX8DV&Q4InPW>sbM5+s01 zNHP1MXke@i*V6UO_agf;yzPXcdC#vP2{q$YH|nA4sH%I{09uVt+8+-KH7dT{Sv08% z@#-{OzsnY~57wTOO6Jx@m6j@IS%_3>KugZ;Xak0^gG%qfT;c~&yBQEG+Q}Pg(KLQX?S?$SEwT#{CAWZ=e>YG6>;g`@ ztj*1{0O7fnFpHLDqEwS}q4n7r7ZXU_pMzIayx+hy~d>aB3%&ny@vCQtFUga;jd~F z0v8nkOa``e(-M2;8o!sGkH&tKRZ_-8&X_VCR|o@FQHQ$qOD=FHw$Y%5O=Hp?nXui+ z9uR6os&cLOe(@@}cg6?|I1uGKIg*9+6^8Cl()im40E;3UL)V;B{hV*VDiZ2EI_O80 z>=t8;;nszePvy;4ZeQsY$8K*WYLuK9YDyYmWrr9YMcN+UPSrhjOzvF?K_HN2+gq=6 zVm5#)x5#kgZ)P(V2w$s1=;RrjLb43Q9cz-`Z+Rlbopwc$pZd=z&#rvRbmGElSnNqy||r3P$Kv9n zgQ6??0qXf5_3{fpUgGyw9_4+vKi-ehJ`{6RBV0{jvySj#$ZrdL&DZM2DaV4NE%9{?s)1adv029DRgLY@^QGRh0PFpj8Ayi zF{6YDz6c_O;n^!rFG1RC;4?yNgUk%i&aSUhf=;y zS9Ij*JmMawD&sniTcJt>ci1Qcsbl@G#dzrJzOSdfgkAVKan&8|&6)?yQlxa>?1(E{>FEiK*gq%dP-nbChI{vi92UfpqWXxXy8zP>KU= zThP_P?Z^7b^XTX(1?7pb8d-HmuLEa6HUr1g(=#`})p@#+O1T8);m7$d|L*gykH%o= z1qt=ndBHp=|LNDx0c-Pje6RQKc%^@t8o}N2@S~?m($SW93U`ox zH25R?`g>!w(;=kM+y}3JV*Pe1ceCBsow8AzO@!NYw5zM*On{)~L0WtF>KmF!jffRL zD_(d?ElD>~vH)Fn*QibN6D5Lo86%1})r;%|f6w-ftHOCWI-r*>J%aKF6z zi|FH+PC+o3)}Hcv-Hb%4mVk*n<4NZch|@?xowPZN^ArI4g9fuQzD~@y!$X-~ zOhujlOCgbStQWftbE<1kV`-;gRd2or=tg;>rz$u~PfBjxP*f&hB@Yj@pa0kL+=xzU)II3Y_7=iAtaNQ; zb@A=H#VkIm@rzH}Fgu+SskvY>YIiBS{}gyjbgvfd=3^K~AGF{)!G`Xk{M^#f^P}Nsec!VGc@^`f6yYX8h zqeOj2k9(V&)2|xGdkjtK{`zo7`F?Jz$?#BBsHbsd;pRLBGdugHGQkzZ1=yQeoSmKB z+Z$URH=g!oihH5r{OQR0z=(FhRRnU2=eJr9N$M>9W?!~<`TT=C`E8V-<)OKTa?a(< z<6%Qp*zgo24*DSgv3)5J;hsB{AF^40cxBhdQ|9)SQ~cOG+$hey6;hKR>qRzzybSfV zzE9cQHRV)=9?;Fy+mc&pd|RcZD8(I)WY{i@&?24)E8-AU*BGgbZ6=6b}h^UxMR(!ApU1*0PbA<|d$-=vP?%Z`X#y*@SxlDeHI9q6N>YX?eh4nFNsEbw?8` z2A$?+C+j2V4K0w2kyS~Te{^6x|H5}H{ zoGp0Edqo=tfM126$T>jm#b9W3r^EM-;h%*Rh{lbnav1b@L8)9ay@8Q#G7+%f<%@ROt*2m*1s%)~*1n*mm? zx_jU%qcv*oU9(bm_jhOW(^d;;esI%$^u5XsikQUunv^S>;AL{QnY_YpXM~4mq&=)l z-$)x(so0%n1gklApJ#Q?#}k_7y{{>>zzqRQEyk@Tbs&W>aRe>xfr`HffJsBpRG1)_ zo6|BySYS#l)8{7jX~cyuBq2?{a=~t?k_KQGYs}dJ-@3ZAEDP-?}PX;SY4R?5*4w-kEw~TBWP!8dAhbhfQ6}x$^;<#|v?l}J8zB|SlWza6M?a2peThO@8 z)D%1_%&^cir>%EO&|+47UABe}VP>_NI%jjlehZ)V)A|xat37;ef{7NqrKBSOuz4~~M{xF4d9#45lJpql!-Id`nC7y{f zE@k~jT4S);F$0E8>u>Em(sQD<5}1I`6^M}<(`;RrI=Q2DS)elMY!n5=1_3& z?VFjIg{D`V2wK&r7@kZg5c!5OK|qd- zPA$yb@7=E!8>AP(TL2j-un_+j)%0g9{*qUhxYk?c0YRJ)(y+eNppUx&l)Dl*cg}LQ z6yJkfy?Xw^Vrr7I3H1X96W?;BKj|DWj!x;=gq56nRz`HktLI6wo>)BLYH>6n4&P%X z+MJzhO+J&~kbBRens8xWY)f^B?S=j?6I$S=@N&@idW(kht)P2|=?Q`CZbL(3`zF7cx6AC>c|x(+FXf!{agQHD+FYx|3}u(SwPI_XRsmMAoGP&vut_H0 zJYu9giAY_tr*C_SKRrxbnjuCzdeH28;K`HbhD00VgLDs&&Miu&!~T#J8mt(d&I1N> z3JTk}Gy>NtJYUTNXnd$y&p&t_wQyk&@7C9v6+sXS-?Q`{xD8lg_bExU=?JMj8j0FK z!TW39cTVT1xsRtglhqO%6_Iy^V_0tM+{lCoL z$9|4dB51qufvWnmcW^M+G`w0pLW=&@ct&=L-*dCS;mth%t-GyfQmh@1|3}+7Ae`#$ zRo1of>;gWDjl;s7Q-SrY#=RF1Ckie+>`$XEwjC$?|0y=z{#h!k?|wXC-pkI%c%P9f z|5qUi2I@)UDahK3+1=fh?k(f1GXsGdK47iF9`ILOTwJZ>w;i;xHs#4{97Rv{uV^@j zghQ=gJ%E8V;5$bbN;+Szs*WY|x_%>@u=yQ(c`#@JwLhN6zv_jQE<;();Qn1yOR9TX zN4IRsHp{O9m)OZHphP9O1au*Slw;1_zKJ1lT@!?>xdE!e(ia48t7)<*awHx=@#rK* zdOHTM7U7$V3oMit+8&nhjn?NJjCJ)bS3*C0syNjQf{j~C6`F3 z0v46oiQb0d?`K`Gx2bTaAh9L!6Eopxv#W+v$`j-e`1dtNFPaf`SI3$W6IVJEaJYm0 zr`J4OH_MR*xWVzI@sv}X%SdiXu(980>USnonCkAQ^)U{v^*%rl0dk;kIpu^ky&ou}|jX=-Xhd8Sy6VN0nL z0K}Z;ZW#w5r74ro!Om-*(2BZK0I7=E`Ft;RXAl5#gK_ycLI2huAYw;tc^r-d1hf6( zxxj~X0(v5|K@@%mM6172NZ204^67&TCgH# zD*m&-C7}^!jftyr-#rpwCi$MBlMBgGPFmE=I`+ZMhv60Mr~N3!Go3={rm_v^DOO>D zPk%~&pdG^1g;bdhcqf`v%a!GEoF1+d%Rt5Y^HNP0ML$afQ*E!A#0x`6Yr z9e)KZ0SD=^A4<*T$_9{0_WS~9zWsy)&3TGpDGMyh_Zglr2`{OlkrfyJac)!&A$JRIe?vJ$a<6J}PEt3udnB+xFQbkvEUOvc6$Xn?t z&=MNX=yupwKQOuqYqv5L*m4?-xLhJIInyqAb!xfHl0-^_H)ywIw6v3OGQhop1_z)i z3@MhFFeI)UAeIr(@MKON!0ZM%P0&STiq*V#aeqQrF~bT+ZqwE(xsTVruzDW|n1p}b zIa}9LQ&VSn`C9kGYffpFwFjc_Z21q!R*z0KGax&-tqVSHg=Els)aQBhO1s7A1eR;` z*6d4bNbSFEv0Z)kMFlXN9NB>uyWuztvVE-9^G=6`Ho^`oG^G4ZOA9p2?|m*caT{qL zMPI2D7Edf~q)GO^&NqS_hcgegz6pz^sGR)xPUfJuyn#mkL+NK#1cJ6s@#~`ZwBock zr|dIzENcadf!cYc-zJ=#wX}>6q&tsuDx?IzVYbQ}CZ}$1wAaf)DxE%|jHG~3B54c9 zy2*=~PF0CU9rTP2L6kZ z>9W6bHdKKSlzvFNw|7!b`dAibX2g0l-|s#Fg}F)dUt0Y>Jb*G#CDtEcoeUmK-rT!K z0Y%BKbEb@4|64>1wuyN9LoFHzR-)BYrq#4jdk?U_u(x%W#HvBeQG~my@zt#g3t&C` z(a{ykAgUdGlo%6&#rS!^_&Zq@sYy|<6Z25qdg!f=d7)tt&+5#?)^b@tOtpy6DnL@v z|J?pTmlRG29DsGiWd#vGbr^O2hP_`u1-Du!~IQ+ z!3dp(*qbzdwaS|QnEjTH=W zc8j?NcWpm3^!n?X3|l32z)g2<(mHq!jw6rVL(-sc-k`5IDcdx_;p^Y3WVBP$i{Rsp zv!ktzur0YHZFps!Z|_(U5> zYJ>T{jsS9K#I=rxu7FPp;^=}F$U-v+On8rK&JOGd%@g_i(ok3|9r@rayBzME?GQ>T zsp+$d>5*8=X-A{Wqs-ly;wDFAtAi~&Yu}SG+;i}B(7saiGICKM#$$p45r(SWpdo!J zCo3z2ewj;R!+)<3f#lxMUpN?iXp}5j*-kTxfc$!SRiWLQP#bzgBR)6&gXi!!K&M zuq3nQ5GQLjez5RmJ>1Slkk5akCqQ<3tW_HgKs$AgEQ9CUacX2#bLJ*My?0-OJp_7` zu4lDZGdY!#Qn};#=}1ri`Jqp|y#D0S;K0BR%-h&jaZrKZW=w}4Ljg;AT>eK47rfj@ zr>Lxa9W42xHSwMXIBoS6k`dH8`$*P%Dbxgo*>e#um?Q+6DO*Eas*uk?%{Mb>N=*;n zrV9Cbk_>!Zb6WPA_Wf%T1VDPt)D-6HS3|@CXzBRK^lSlxaVr~p^ypE+WQ?*}{ei~c zmCv*(DmuL{81yi_Vu+~~PLaOLzCO{B{JTE`1|QBjw;X&~s1NWHtRV&k3sNp}HZN`1 zDK)TDz;=~)^-B2?S5q!{O9|N9_6l2e0C&tdoDkP$>L(RNe$Z13r&;Co0-$-ATiL{& zJ`70~&Ypq^F`oef1!daT7Z`>vkH63LoJ{y=_NoXHN2E%9nw20#@QnM^%B$4HCbWZ% z$t?r!w+Y^3c8D8iSs6K7XvNJQuYRl4a4JFKpL7qy7^1+xFabC9wR+(&jCcnJK zXxP}L=5ubP9TIGI06<>wv^p+qfnv|67|HNEG4diNbM_^}o z=PGE}0p%7@fp5xxUgNYjh^%Q^Xr#`n{C0S-3u^ZFOJCml%>qy=9%r@p?c2AFrsGO( zSQ9~U5yDO&yJo~O?|Hyhrz?0X=Dg(v8rxqyY-z%4Om4+a(GoU>z zuzeafE~GhFBnul)$X|fz?zlsW2#0-+zCnWWozHyztyh{0!=PaYpbvL?YHE1>U6-|Q z_TTP1Da*wCzpCXx(kvbVzXxh6peApPVV++7s)WD`#Of}oXgA7R>YE^W0uqK@pe+wu z-WJB0&g%W}G`*w@A#GORImgd~@6W!Gm-Wn3=r&lyu>SM4j5)Vu?=^Ww&h=g}S0EI$ z?<+~r(*Gtcc_h`bWCrQjtux&62PK)KT5!CejW5YEz3r69H!wXI-nvC~S3H@G3t#yY zFS!j2+gP$kVwN9(Inp^99W2EM8VG)AO`zsqZ|e~%euZ2tqD}>eZ|;F)Lt|s%WSBft zREOaug^*u5f@%RY(!Fkx-2M@#6Ah@g?rCF9cSJ$InDgK(J=#u#Yw6+7+9KxWDdb~s zA0^4_zn%{Ij7PzB*V7&bGQ57*1XCqMwq6xEue+s#1WJnFqLtf@%cHNEyPm+j zQdJ$5?LeL=>4l=%f#F1d+~+mC03X5Rt0v3o5W8iLYBPlj-=V4D#^3m zI)dgGACzNCTm{C%(Kp_)z>V{~E=qTtIe2pQ;o)<>C55Rnm)I`VuUM_v@IntJ)~Ma} z-e8{zJN{hB2=X>jSZ=->OnD9plJ2bPLws^fO;PcuG#VNjDnO{JrGPU z|DkuNdgq)=Bvp-lIuU*p*n0@dx zmXR_hTPUocBStAuirM-*KZqE&4(o3`NugK?>-VjxELyydfBv;h~ z`yfonk-IWC6B{WxHduDP(o#z!IdkQ>lBS&7xdGa_a%RNJyx3VI0uD3DBj!jzN|Ccg zU$op=sfQKNOHsvVGIg@1H4dhS+#RnyQ>EvunrablC(KaOhkc)*Wx~*`D?A@E@ljK_ zb*5%YtCSN2Z)D~?{DyhiVir1!e2MYTPp+R(+b&9Wj! z!nY&#Z>Du_cVzxGK%eTuu{twZTs9$;c=e(Jt3LYCK;sRoR9Bl$0mY1!-jd-R)@%)_ z46jkh@{FIIxi261l|M9^@m>FIzq0lOhqN6gfFMg4+-zD}TK2mNe%aaCNOUFavOKsC ztFXfdbEM7&SoQ!bHw!kk&br8^j;t&9^`J1bE}&=N#Qb#j2Xg?LEncq7tbwBqQn;BQ zRH6p+?KKHnO3$iYo&*mrZ1WH93($xLPG(3;gAGUVqo3Ba3aL_p|HdR0u9_5oB8W?- z@SVDIZI+ROi}~d&zGB9AvW@exD=8fOz>^uU(-%8S7tI(t5}mRp6X#3yyi;Huq&Q9p z9MW{#-O3w=_Z+AlhFd1Zu&gy{tt81Zo<;VR)q^6gp&CwMa`T+v-(cQ0w(4OHKF$yV?l?Vzp78WvjLOU0pq4vh%A=F}?`)r#I zil0*65MwElj7T?a%7a7MUQFjgDJ*KP?L>~kY@TH$_y+?juK;d1c~FU3S^12ta#q$Z zm}Fu-`$Gf=xyZZW!W@}pmcHNRp~s{ZCpitA^^t=B<32)f~g>aymeO$|T-TOQb*yUVjBUAtrVs!Kg_{ImX zWArX?X$Ay;;uRETHsa++RF<%5& zER0{+ldy}wS!g@&v+okYz;~SRxW9L4CKgFGDg;3Ml2?N@1cBN+IPgwE*?ZWqV}X5! zsAbyRiX0R8-32vId`n$^*e->DEIbef3aWrg@EyK#|Nlr)4K~|^8xa5xz}^9Ca}sp> zc5cA4X*qV|Cf*E72&u>2uath^FRzzQzc{{1agbHbXJr!O-MR0J)Ns#QI;2}80{B9M zoWlB#rcjI9GlU(Pl9Gfw{ARt@CdI;0vZfnsHKffK)dHR^<)&Z1h@b(7KNgMDN8&zj zm7fEcqY1b|=AW1_8so6igZ(k!tWUqd>ZgB;EVQ3l;=$#-EdC+0zEV9m4p3l$AN4p( z9oiNJWA!#n1Nr0Cy0@nWmc;4{hW-*Mk^4SC1KKFJtYt%_M1XKEQL-yf7eVg^sZ4Ij z=RY?sRT@i@Bd|*D`6{2J?@vQtNZ^s@Q(R$vHlt+d{fDa$09rs>pT5>| zx7zX=C-I48>-%8P*U;kr6I&ku2>rrbe-nwDAQ}X2fJyGhnCL&178U6SQaQb-zyUg_ z*tt`{xQX0n=pU>k`zA*I7vK4>XOl!*29~$>_iG;*1blZmgC>mZL4KkClZgv(sF6!d zeRTS)UohxY2RBY*xm-MRSJ2=gbmG%Xb_zY42ai2S0LeCk03YJIBh~ur+`vpnk!pd} z7)!_gB9Dod!*Qi>c5+FwS9)elkIq0=bwNH>hMU)cA3G|fX+fNj+p-J{{nM8ltY`$h zpOh@T;m7lnr%e%+lt3?sj%ngJ>a9$Z_Otw}^h0P{4gQf-NO@TQ!f@l<8QkW39OScx z?N9|8IG53YW}OltI3%1V*N%Qc$VCs(!nJ+P8tJ(@FAUoah@eIM1B96e6ssky)?nv% zYM4rlP!X_4_)G?l&URmFfjipf+ZSIshi_ePoG4;K&C!e0gL4_F5&KGwN(83T-6%prqc$E&8k4MXW4O zKL1TQ_rn*rx&|2;$B3r9i^wNoAc3bJRc4i7RKkExJ%Mi*?CZ`L#8}ytRGgCMIU{=u zY-XP8R3W=HY*cc5Ks%ZGVWbvQz7$@CDG>c+mb;S?J4^YW4sFQT$ENo^`94q7fC5J} z_&Py*cBT|3cFfAUY!77gK*L(}!`(Qn`hUWU*ZE)vJ;=a84>d7%cN=M%Hl>N0D5>9v z>ZIo&8M6+FZStpp7LgSsH*Ow5>oO599XPeb|N6&BFLd^ZfZ~65!YE0ns*Pwv_xtFs z;?HS17iBdG@!)h)?EKUu`9PhowhHfuh;yVrY5r3zsqbQS^r=2@Qz`67skcn|0%|F% z9K!$*{EQ#e!niYI?HWZIgwU;P%(A!}DBYbmj}RvM-Qku%};M&>^cWc$aC_5ZLIxUDY*0@%=N7*0+0iJc@RQVC^d( z;`Pp4QqW*pEG=x*??RTkN3f)(f}MV4cdX*?Ghw^81HSkFnj=&DN2}F?B3>N3V#tw} zctpngCqOiT@rpp_m!j^)CXv2e+@aLg@NHjystTWTnsk7=V+}T%vFjhHoj19yoJBgZ`daLp|p1te zFFE3MRT-+5MpC<5w|r$f$88eQizcDYI7)(?3iASmEGgrv(X!~VagF7s(t`YybP|DO z-{{?<$<5xnfmB<3ypH?Td<(Qguv96A)%!+72Xh0<%`Zi3#gg*1kBV_UBHW!j3UfnPQW|x#V&)+DB^o zX6ava<6rn{wj{KsG?mFPU~wOkXG%ld*tr9ns96gd7>7=HM{K+`6o59mg~FrGz2d=N zk9%Dw<~A!M|E7^QVYxE$jZb42tI|tseeb=GoIzUNQDUiA(YTzx)zUqT!g^Gr_Uv)>HeK{x(E5W!-{y6%o1`{s zsHVWrkd$>V_>_mOZCBYPB_3BtglLt$DgDMLueCLj3J6p#aK(Hm0MBq_p z3IPWay_O=BemJIafE%-0Xo{2J8BqIOMa%r`4*4e8u;cq;iQORmInD$LXsc`bd)RPn z`+$J=Tm(3RE?-NQD>WZNc44juK5<>T?61GA6qpe~x_>>7cmn!HLAIo3oussCz7(+| zEes<91m~<1UOlX1v2mc*YuYfHi(~`h@u+5t|2azoP%A4hy?U>*9R_o?GxNwQr&+ci z=4y?>!?~l)*;4qgUDJM`ld+DmsM*~InM)S8ngWdg{N7iqh?l)l?_WsKS|`KzbRflmvkAvlj$40cU{tz(FN7{qm$g+-1#kN>fjIx$zNyNDe=%A~>w^b>YvR z2Op4*krWA~!!|uV^T3P`XUkwkhXU5KRN$A^|4NAZ9H19)9kiDLAglf#xCnn)WAhY5dMJ|!ebXbo|DYl0lLFupd!HQ~1MTOe>Lg6=ly>9KT-A8!WrPRNW+oEM zSF_S|+yzyGdlV3;>XWj=n4F_$TZB6?A2O7yKTf8|xay&XFR4lrqg zqT}CSFRX}w0Uh(P;sBIj6@N(>Kka0UTA-f{G;#g+6Ez{E4Q+5*0^q_A>MUFxVTI=I zazDy1FQOIcnfVf4TY?e4N(daq5X@`KjpfkwIvgQ;rZvODbOs%C%=EzWp>_-hJ47GvyC5 zfG}DlMpcry&*z^bOeZ)RbXU&|ZF_Z>^8M&YM?e#NiDHJII98g(Sg|^BDl`Y}7%qXb z?`Qm{Dv#fSaehucI_fi{TyI*9Qfo~jSa{@%E zxY3bHJlA)OG1Jx-)0A56h1?>S(HFV?_KO1QO0S8=@;-S=%59wHQ{-u!P?P8|%S(U~ zI2TJh^IAQF@pSRIiwZ*H96{^KL*<#{ghmKErvTgDjNa)z$80$?RSY4{SDQuyb{BZn z!#nhcPva`Qo?QU_$|vp84dvjeE^cVh8NU*6?c4i)u6<*DJ>_@J*Szj>e>(e?f7$sv zrtDDi+97CEGXI$to)p zIX2N%Va{PKKkZg!X!^9hl{<*TP2u}BT8#&LHySWT)j9+K`It_XP>BsBOU3G-1QXO( zTGq3|m2wWER4MW1XL72kVrPVw-8U6>KiBrgtG_h1GgitN^cQ(|@>7Bbo@hF+taq;X zN`ER#NlW<%o}P7VSFux6{?sc@C(F)x3bBpFnC8bdv5j6KHi~eIaYXdbLtVi0eNK)p za5ypr^(R}c<-~#XJx8elqT9A^6$Mo@uCuz%H47)_3nAwKzviv1_3u+=pipYsoas|K z0)r2V_D8XOq5e5{$Wl%M&c({|lG(TM^(P0m`*#?#AdAC>A0o)8r7Sop`GAS90tlupD_Gs*eh z`VHORjwW$P&G6F+)w&7z-TQZ5pw+C9t5hIgv$d>SKayxfHCv8%XcYjJpW2m=} z6ryt~y`!UnWOr*=#zMI8!Ia9Aiau=%Hp~&6&B?sdY!NAD>_c=g8+XRiQXR*#Y2#KH-!USEoC4vda1D2( zC3{qldv~U+f<%w)#%zwP*d?@mN2ai4oa>sQ)P?r4qc?DO&^Z_RsJeV$Pcgop%74{$ zVn=2AKvv@EK9Rri-S9Jl39Dr)i5y`I#mFNmqmFk!gMm*cE_VDQ($#4d5|0~PZ+lrH|RjJkws*Ho+(a+`N2Ag!nb(_&@X zPUC-}YMwmv&FlD>dE=<+nhPz~swKyPS~I1ws7bxvX^L8?jfnO1y@ofMB#CSK+-EXi z?iPGC6WjcvoimA@*PoR-<;G~VF>3X1Wv&U=ZK*=UCQ1w6$V_}~G``$bb|Hkq?Yo@|52nlxYK?c{EXDvYDp-QpU`gZVjAL%i zhpeGpYG+^b=(jtYA#}Z4+n^Vh#a&0*F{LK>AnapN-3=*$u8P@YSm|D2nWWS5%*q)g zlyBZ-?h%TmhmTNzEvIM6dSaEeWn{!6R1@X~60VGxiMhH%Bd{lJi%=0fpqKDTBfIH{1ol{?8hf+_2#|AlX zcs_ar4vNjr-d!es|7CBlX3RlWRu=SSuyalwa{YbgQ{l9#8rCgA0DO#4o1{w>7bW}W z*+fwfhwqCcFPxbFx_9~bNage>@g<47g@&9C;d{+qNbu`G5LRXAh7TEw*b{c4 zo)al}T)Qpt3>o{>DUPY~m*8PutEL&BXMPwa2szQ;Pbq?bXYX5;3y^pai%Amj@V`EA z7>4RD4-Y;WL8!v3AEzmtQLfP@z4)O)2qY4t+r&?tLrZes2o}sd@08o*`g+YpF(`n4 z_(L)@h(3(EtB%P40Zq|maae@ga=F7q`NHig5${jjDAM8RdvJ2DUBLvqnN6WneM?!uST}DA>P?9F3JN`a?^mCo#9d;x2$#eW zGX}oipy_tr*k`i1e}3Tk=X?qDhhR-*adGiObdTits^{wSE|x~5d@``k0X*C57$HFR z03@BJ?N5NZ*X!SXb+~1SnX}=@o?}A^AThJ8nt~PM>i`! zOrxa2#%z<-JO=$=EA>VIbwFUi$9HyVDuouv0*>ms{82i|Z0saKyK8{Ho-A$|cQO6GIgN2I#sAc~{b4qjHvsRU-Ohun=zWf2`J;QVTnTWAhf?sONY<|cY zXNsaQW?{l4WS`Yf>v7@Skr!#XmhI=qn)CG z{hdRgSkkw1)v;^CXmOkf1YQ*QNgW@o?eT5MHAB8AFDQzXKJkV7CNcINmN zE{lwY&dwYevFE{h2%pfh&^ObVm42K1Ho{Si;qE4n+1F|JQthVNE-p6-3 z9b(lJjHeHPklKRBmU;sr=! z7`Rvv&~dVvKQA+%kE8L?6?ob8?A`Mdsw7yJgY7BBzQ6BPJ>9J#A;kb#2npnF-jfx6 z%KzJ(T90U5#mfAC)EViGY6gr&F*|;tnH8B!ULX;a?`;`IzE@^QLpbA}1=E?j+#eIn z?`PW99}tvY!>IUy;bBk#`!FX&UvT&$D> z^qh_y0(F|!*oV57`pW}YCQL-POBd~0-}Q9bctOzgM_r^#6WT!CqporAs}eU*#1na` z>|4LOGPSCr(B|pG?p{^IQ1Wz%X84-{kW%+0@`$a|bfUa$UYC>1w9stJI?p9C7t!@% zd|h7wWL_UQSyw!Osfq#{LPs)u%Y9ArUR_?vM^APY{bB3D#w2oqs_vS_dvVuP zea?`jooxOTd0^~%Uz=~?Oh(N)Q7I~OL{->TYpYSZTU{|ygs_gc+=hKF~**W%VG4=)Zlpd9{3JUpSvzGdE5 z{}&wIWO>&0+KbRNxnx|_KbWVXs9mWBQsAD?CZ6aSvV8G~{qT+3%ZvugB1Ru(ENGDS z4Q`UjiG3OvgPqQ<-A7-2b4JvxwmYl~vFl(pG%E%zzL2H0$7k_Vww_WLFna5z9?7#> ziH=?8ygGO9&N8}YRvHjBRT(#!mjbN{430>O23lAPyZH!q-p0ye%%CUIsBp7g=mklq zmI@K4F){c>usQo72Z&0JUgw}LY2dziqp$Wm?FmEpFosNAejDmp{!U5wGxI~~n*cuf z2uh%{T&!nmY6>l83>=};5rf$pU9T}dYU=aQ4joBB*{S=&1e-AWHxy5m$}Ag_`hT+J z{*_hId!td60>TggPG-=o6~Tag)NOdV&S4W43 z6Cb*LlVo3>^IUM2bF?$dYUl_hQEAW@3Kl3dShj{n{CMjSA9{OgG+;wJdF zL>sHCkS5JWV)VY+i{HBdNu3s})L$Y*egAw#>i-mI{{0ww%2#|F$^a)YSn=^?(^ZhP zQ%2MjaBz?G3$U3(xEK?&c)lP=3wt5-8N-!3pp=7 z{GS06f7zJzLXZ428<~!3dhj3>8j^5^&hmFQS$xN{?B8p$I_>v!8APC^LCgkwFhbnANDk+6(| zl7{roMBI)4ucXM+p@B)9y8W8%mbleoL^is)!G)M|4xxH0SphYy7!A#DfmAiAqNxan zY#3KcNjKwJ{eArfR&l>>%{$7!e957iT-vC_23J>>(lInYvShiZtGL<>2B0CwO%3(! zj#@TnxWD-`iN@~G^t?*5t#03RIuU3Tb)VBvZrdKCn(Ds9IBUDQK{ycAc~^Gat$mkD(`z z$HwXk?VwX@Ip4u*7}el;Sf;c6%Icy`xCJZaj~;llP+_)9noo?gQU8imvj|t64Ac0; zP(vBSoFhQuiZY>!;tO7}0q{v&JnQ$Lv)i_O0|1iL{uT@d(`r4#p4vfo{rn<7#lpIn zxHy21fQ^c7%TGduA5Sh@3ldkCx3(&oBLT<{H3I9lKW<@Z^inZ7t}Zz_Gq3VyeqKfas0H_+eM3dK^g zO3TJ#W6eg(K7BgA+Tx)BQPPpnKEIDkWAEJ!BkdajSc2Mh0!ZpYK+*W37_#@Ni(1IZA%hfJ zzzoCQv;X|;t~a{--OKEGrOv(VNQwjTD}i)3F>2tom~o~MrncCiz7m~zzW?-+;Cd=_ z!!?dJ=3=~*u(3DX2pe!%U$g4-3k3xL_V#>M?k0#_BdWa@3cWp-Gg!*=sW1VxJ6mVu z_Gj-vlHHs$Aq6(|MKbjXssTS={pXsAYyvV-ZdBl)YTbLr6W4R|n2-(l41!)TXfkSSHdPfRBt|#vgdk&(UsM zHL0Q#gt$*31$as}hdmTt0+%yr^*fGWclur3l+zc|&|jT;3%bI@h0JiEyv;Ak>ZAF- z*8+MwlxBQFE$$y?4V6zM!FNn6eJOLX!A#ZlksPV4jp#3yE7ukmk0oH>7{@94Y7os& zx0IT{T+rqKWpyUq^I#C{Cz*O)n4*9x#95jcQH(L@77p6HWQT6%r6h$I*B2~Penvmv z(Kcx|pMGV;5V6elA;rU&KG|Hjs8-YbHk90vBob7C5A)4&i-arNxl~=t=&nteNP_Jg zOi7S(_TNvZUZRA!Z-k*a>V`jON75gN3oCWvIYy^M`;@+FfhqshP{%#VuePj~Ta!8u zs-4E?6a0=03<9tdZTylFB^e+s;_ApVgt~tH z0$|zXDKl)Sm*J?JR}v`RK(Ky%cXNLay#Sc`1?C+wp zSkUIp{W6WnW~k#fboUOx41fA0qn}tZWV;gVzPB?KG=kcaJpRS!L6h4HQr6`EXm|a6 z6vzco1IF>J2Tukc{A_n7_gIi{rRrJXf0zaa+CZ-m;(3hvZkN>rKM_A3*Qtu*!)U5n z(n=$=Q@w}^_y84LX5D9~vx_`MC0r%(c4U0r z=&+AgiG`JM-(-5FwjD>#st}SyUWk3qPNt^8pKZv7gMPfz2ULizzDt>BYu} z+gE1l6q4edo-Jn3=)*qj^1DejZP|*i@jUbt^?Kg(8n#wP$H4OT5;J}SCFZ_aBr;!; zMjL#d)DH7lL;BtNrZFSzR6bt4fT!@Vb;@`6+<>ZSI#Pj-Q1Fr-m!H0$;oupjmor-q zYDMEoQF(CKqBU+|^4Gm`|JgaeC2^hu9QyawLRM?;=Lp|xuCVmERPCIzis`Fd6nvPw z#1{R|N`-@=K2Zywz;bS&Vaqdh`R$q0sV)9d&F2ujw=;oWA zyc9U3QuXB!=2#yvFn4J%N?c4V!J^inbfxe;*^F)F*pHpU0h_K5;k`?r3sL(0cR9XI zIl);>?aq3#CSUSMcK6z__|5yZFd4iEE7X1R0}H03sy3oRS39s& zG4&%|zxN!gw3(`Y;=$n&F#A+|#knK|hxgd|FN7diJQcP~8Jw>yMHPBHBwH1~D~dx~ zu@IL=a4^hYXLP3#Zts^NW!zWF*LEdp+u{w$;sbH_iM5R_e1%2B4$8u%-7y;uGRG>N zxnxclfsa@z$jF+iJ>H$K4RW#x=a8)8XY%wV<8LqNu@>dq-re2Z-mWr&rT2t`tuZi> zp|`F>07Pt|t~UqrE8Q?KA^H~6~h9?AW7&6A+fa#cR<@>%q` z{Yb~_?PASa_%Y#!Q;VKn+e04p1ckD6n;dgMHMVOtf=R(=@_paq8*q?k^c08hWLnC7 z?Yh>yMdk0rGq2^{nD5`<6+l*D^m4lk5f@X%r@MfzRkmuRq&0q5u#`v%5e)ut_OCx| zPe)5UMFu_^H)oBLt(kC)<^fCQwye$X*k?B{mkGD5bqbEJs8D``br|b#q9cw8FM}ye zs>oW{n*I;p{hX8r78EP}@;#7NysNxv`N0k;6h=Rng%{+X!}3!@7J}yGk1DxyB75(W zo`JMU5<}#TNT|&48*3pb>k0SArM-vB_$sc zg3CAr`BKDtC|Vti;U3hb8l-A!#>=-vdW0}jNSjTXAxbl#+6wL(KWMb&ZY8JFWAjTO z1;%Cdqx4G{nJLQnI9MpdLG}G%M*ONo))`>T{P7!zZ=l>XeM}{IZ{OHUKL~|xBK(w-NZTD z%8ja=$d3m$Zuh zx?Cr0Xks}fA~OEYN+Ppo$hr2F6zkubC=lsid;e%31p_OF^}35h28S;;(br}Ga{2IZ zX9@`M%TnQar!4We%WZ+R_ghfX-me=DZyC`y=pbL{U(v>pv%R+$n0uQG8Rs!hLhs*B zvO*&Bg5r;(tDait&zJ#2mb|nEg_N)m+y3MbzsOY75Lk-RAzcu_-z#GiuqtH!w^=_GfW$Ha~UqN*%>dF!c)%q)vGaI5QD2%F5xgtGo;~@X%W~ zbXTsinBkI+MRT)hhkp1zSoGSrw@Y;kIh-(0+i2PT7-Nr{ebZrB`c3P&I%PGDV5~S# z$T=a}Qt5>vz?;pg?h@TcjoynEvRCXLH(yaE#eDjK&45L@qh?;rT%rr$x%KMihY%tU zhDJMgvTD7zvh1XV!9kW00I+S=dTtQfTi2C;(Y z%<3yWnALsb!wbn_{}!hZ01Tn!?7_|t9gp2D6nM9bcnE!8H5&mmH_rHzuPCs-v3mT37fpVI4JA?V3p4}x4 z6MGOgZWG|7Xr~OX1UsL$-!d-Y5-NgTH4E#|*$G;INl#Fv`GBAN-lI4Io|~Ytg)lMU zPtACC>-$BV2IMCf>I6W=QhU;)vRUgZgmmN&5x^;jDDL1&eV2p&meQW%Q(+6pl1cze znT9v@2qhT9O|D$ro;~^HoG(b4jb-Er`3N7;COX27*Pk`D456Mc|_Q=U^K& z1EvxLUFs0AT^AFD#1aqNe&h9_#b27b(cpe~sTYvzU^Ih*1%r>eR3<;=xC9N8zv~n3 z#Y{EkVh9jArt?x$Mwhhsf#D6JO|X$x`21l3(G!_6vTXUk4dF6m8p`(q!^nDHjS(2+ z;R?bOavDN6{&q$pGHp)z0%xa2e~l)9{`6Z-IJh)T@d>d(F$^l)Vht{XWGp@g9A>T}oS66~g(o zPv6f;iOx(O*i>G@bz<(L4rrKy5BITCShjw%;YbVzUAahNRv_jJM`I{CC(TMo(a(KT z;w??H8y{CM74Id$c5I8R?ZtU}(^J?}6;O9nZTUgR5k8~P;#c-+bd?|dIz2|zg_EqI zcf?;t4dwygn0;OK1P}=eVGkNU zoeQ9f!z+=C6rk<6FJU6qkNSOHeldMMy78FVmNEwYN9?*RH9rTk!+_R>**hD26eW#3 zam$0vUJ$an<^Hu$niWT2H~CJ-?_ANX_VkAn29tCzB)?vVqWMKuDAPuXRFn3h&zkSX4{8uy2`dV*mq_fAwEuzJdRRT`Q7S6H zX&)5jL8$ocLB+s_r#1;Rf%VVUMWU;&5f%8}zrJ1)F(aOx;cziMoMA3CmE_*7Y$+3n3e(iTF3WVqLn{0mJN6In;5GK(v6G!C-i%~{_Q!Uu(@}TzQsn%q%@PGC{X1&c zwo^Nh#9dCuBe+!vaV-%CA|+1H@RC=M@HZ-Jl=4xZ>o=H{_&o+1cjvCh( zbTE3)ct}3(eU+bmJ#~X9a@`@lY@C)V#*M^BEZty@JjR*Y%z>+&O)h7uku^$x5;4ss zv*#;k%*bavKuPe6Ft2(=3w^btk?-yTUVU8p^Z_Dj)~feG&t`p@jdxw%&M3rry+9`v?8y&Zr6_@{L5%p^J!P&-B~)$gO(Uxl^jjRZN&bkfiT#!kE4$+lsgGsrTp=-KZHJc z5*^i0(ET9aW1qL=_O?*E+QH#u3ih2WTK*Og6;J&DI5+uc4!GS8yX1RsNe-`3OC5yh;X zK#ud`*Ac^H!0sInZu7 zO?d3UUhI#B^8!4(hXin!fxIh`*@|aRv*n}grczPB-{b#@iK{z5?N!x~Yd|3B;zV@< z+QmC4vPw+*N4LgS*sT46WjbH@RU1xfBLY!r;~!qnW866WO}(N|ZfugHnzq8wvys!+ z9yIh9${4QZ#m428&J4*qMYyP+rP7ah-N@^|Z%u>3v`JvAn`V@_&{HC_#C`tN%?&cU zRL2y&n!`qh83bFPl$!Sg6UsBy?b@^v&h-;iW}Hc#vA6F?yLRB1%hX5`u&GFuvIgnY zb}=3CsiuIyGlPDFK6H?FIkOQDo z$5~?nx?i!ESsmG_vaQCP^?4o)Y{cm{R`%kcoNJ`)Vfo_4$RrXVi)d{ zP-DW>E4xL0AOx1lsLG4DYgS1B>G7J*UjhWjlLf#JB0MPA9jqBlfIv(GNzo}CMe2qE zIS|UHmopX9(Ih$pZAMzYQv?Q5aBmz2r1Bf|m=o)rISF(yCk7Lqys9wz-R#ZSzV|2B zp}G1fr}x!OjJzkjJ}2NL*G7Et3{+0C>m%(n%5>~t3_+G_Gc(!jokO-3l5?fFy1#=m zGaMY~!=hT@Kwy)XpTYb5EQkxzP=7h3pN;uW?lf53V#PxVrnLs z@BAfnm%0RHX4!^oEO4MKgXvo-%JdkMq*>RTDQozS_gINi{e zk&i%f5a$h7GZ& z{O7b%AgW5?G|QPXD`DDf<6@ij$skGgV)N0z<^I+LOiu+3}yL#ot zaTTas$G7u4N-odbxEBgEzSsQx`)hU9Ot9y z|IoFsF|$ID=Ii(o$7+I}E9#-)z_^?hn|F;r{>FUiIf+PMtohc~bVXj9gep=R3TAC~ z?QLTN+M5QcS18b%HJi^BZZI+KT11_$(=mVfpQDelmWb0I4ZIQW2KBQcB{?<4k?Dd1tW&Lp{`k;Y(g39lO-*_}Pm;(ERk+2{8e+tD2^- zb9LAEIc+LWk~d#5D?Sxgnwv`wK{-29)kh#`OOE9z#1<|`04dP~lR!}dWXurLT{am= zx<|<<6BFc|VFK&+UtjWDLyt^ns zvmh_ai(TZUYJyLu(xa&r`#;K{n-`~#8{B(3>{MRQQFPorI4Y$FuZ_7HxrW@HRPj3d zW)<#m*6L+d(C{Eqbn+UDz^$un4eJ|18`JI%r$<;2am|VowCv3ZRBriRW0SL*s?119 zPg9>ff3r_r^ol!QhXXcW6e><+dLWD<(D}Vj~16y4S12Ym^1Ra)cabu zo1GeotelqYTZ$hyBQ483dd#TnpKH@|@4>sHC}5OTx55Ve^F3 z)L7d_a7o-MePl~+E^%O^T1trem{~9uqK^ogrrTuvXcrpjFS1#3CKO|0+T@cb93pas z)bZwZmI#-oB)1F;R@vl0eT5J6G@n-VAZJZE_!6Ktn;XNM zm6)jRP%r{Tb-bLQ1#S%fgG;Qau?_f!r`0~fGF%tCq({qbl zZzW6fG$ayzp6$3^=#e}>mz+wqCq9JyWaW0TpcMPO{Jc3|^YDt(^x(okcZS5*$nE{) zY*7&c35R?Jt2ZoVqFiv|=>Q+`Rk)!s_oS>7Z9c&!c6aXn%^cy3L?yM0?dzrW?wEEr zv6KyLZKxpLRcH4x>%H;O69e5LMFXON=ip=CoF5ur6998l93^O(RP0zNqAC%g)aB z+24h~t>es$-HD!S+}z=mEuD7zATXjWwz^hUI-|dD;?*o*f7NHNGm=s2hRsCiN8+ycA-qUBVJ_5zF?~Lylh+Gx81h;7!oosh;}drV z9o_YB-@fha%vVzq(xN1ag0`mGof><>TZpFY?g}7TCnQ(CeR~mGWn8FgiJt9S$+>gP zcRC<^G?KPyI6y7Ar9Pl_8O?c%hZF6l*evE$c?@sI!URoG`8fwmg&5;mRU)V93W zm!7?7qPL2mtv%<{670g;CUQp7_P$#vag*01bejyBW;50jeosj4b}~C#!waNH!(3Pe zf)47kOsa}(xudK5aKTP-%q;qWB|E8;+Y^y$WJg^jUJ+P5^AcO?cGJRHc-ts~G?Qo6!Q3{%=#p6zHvbU34F3Eg)uSxC? zF%3SLk9$6j3caGD>7e5qR0>v;DAs8nhZKx7G82-n;2=!}wU+|EzU z92EC4Y1%zisWihgM?*!buO_3SsL=02?rDiWx2X3{+!s0*&$y4&_v{QC<*tsVySiqr@r);! zm9gkt=?n;HD&uBmMS`6cX8Yh?#FD&rOwYr$-|%LK{wEl!&LX7)roFQ62QeW{=gapU zCb-%Z7PwbqH}0=$dD$Y~Y}f=$EpLQeE?Ewa`*ZD|P<#f*t+%&#b9n+YdS$}VT@_>D zlF)Uz7HPg7d3E`#G&bpeozMQ>+8Vjqxud>v&$ZwNaT*#L`+L}BYt|0`DmOLDI<41X zx{2PdUAGF>%kxbv1oCTpU+h(-4wCrS@9iwKM1rXMa5<8TtaFi#<>xC5uZcE*vpH<% zz4t?OL`B=~t*}YqJ27oB-J58=T5e&=jkVCw+B}Esp`GlMeGl8Fafh&-?Nuv!p3!3v zWJaZo8eCXkuHX0e@=6(a?WRyPF8bJ_twVUEurIu&rNw7&8~ypSS@;L9zl9n&c$$pE zg@X&P6xKQNDJk3H@-%GM(jzp?4M-p|zCFQfF_MbW7bFGoAm{MI!)9R+N9@6>NuP{y zTc~D*d__N;O@GND@RIH*)NNO2qp+d5k~t*hCe0E|S$qDkx65VGA@@JRaRN`e>ST^M zt;b{4k){;vP|TleZ-TKRvKnPOP6Lr-oeaMGI^=RPGU_Rww7_W3`~%nx-DU*Rt%?5J zMMqpj9z=3Ernt%8g>~wqT+Q99%)eH0zMy-0W$XL*5;r|RP-2U3_(4(lqwF_A+rIHM z)1>JmE(!bkLpLY7lUe5(P0EQpdF7$KqtMil zm~?9(43;q+-6H@=H-VcvfHF`pm?P-uePkt0P&6J1M>=y!_61NV*#rw&v-^2p;6{ z5F@b!H(tn57mlS7KWX{eqEV|>VRX*EGRAUd-Mw7hHXs}y5?R&FNzLbv{nox7vUe%z zNu3#IQb(-vrM66d0z9~HK-&%}mQarCLmyBXUIw*y$ zQf6Lk>|Ed3+1mPsma{OH>(bEG?PwX#o6pK(U}P*99HbCC3F!}hWF25&V2ITkTzH$n z!qcCmo91x$RfGopCCHa+x|0UAyqVqGdR6a>Sc*D!cO1?OK`vqc5}WyTUXNdP`8tz8 za;3Gk=)JubK%-ZQxK?mb&}+Y@(udm1?l6EWgsHeSKuq%Oc9JOpuZ=v#S+M zKQpqzh0*iR!@9k&#g*1DEEN3cIONyrW=#$P;wK6?^}-~DzRK8EiXD1!&V{AD#Lk9h zwp~g*bcoA(xWfBt8Gj~9T~{~7a-EaE0Usg_6(SuNzCAA?7&`W3T7=L|3uVod-zdX# z)c0mtaM2sDu0j*xeK+rZ@odRR=Fp+BZX5T(Jd1NWUO5hBJV&9vr%HaciBF4LNmBBA zzdX0}C=FsR95SzvFPWUZ_|YFSWo?kt*R%6LcAb?)`+H3jU-=ZCU?&hc@FtoD&$Qvh zeCF#jo0q(1$G@J~UbvNMRY)ycC_E4kkrWeLY7l&Wi9M;uW*jzCRpgFB+I)dQ&)FJ6 zt`CxH&BVT7e|DjFcJtMm@pYXyvBSpqKEOQCp4s=kRY6+Jkz+WIS+3GqIAh7OP- z+nV7fkg4nU<1WwI`K&p?7d6SztD>DQ2b*j71PzFn0^V7kdvj` zevyF)P7M+a_NYHd`P{Xm7Z!~#O`zm=sb_Vfs}O?fE(@H3loI7=cndun}c z?N|3yi{Y=%D=2!%SLyLtGtBmOWdU)$7xo6Z|MC(9`9a9>9Fr{dj zUitd98P1FEDnfVr4Z-=R@m0^-`H6!;>M#BvI)J&UlD`sNVFdo5I7LyBke8R~zH1?# zx_@8>Z4~P#5yeW)P|)^}39A@KK5Lg&1vw~)7x|`|MRvPF=6OVm>_bGP%2?Xhb^X@U zxaKE(YiewSg)H5GV!fL8_#gou*WKZ~CrC-WiF_rKJ8`>v-5|Xetr~h+7LW%>8_(ak z(kX(g-E!y9Qo`r~Se%7T^w9IsyZblNwD;{(I_HA};zmn})?R5vFGE+Zlj7@N%cjfc zzgiuqm1}53okexczA~kC&3!<`;f&zum+s^8>F_^ZAWH;Zp6Oj~Rqb4oQ=2$fOQFl3 zO;gYsFwkGUft-q?Fhfs#_Fel?E?B&iOoowU!lz*NZ3dvDcdjqBhmNd6(7^GewPfrLv6^kaT6C13OQ^z@z5;hOsT!TpYs_6Pp?;>}q$$z?h* z-%by%UeNWc#Y_NfGBFWv;SPrj4~1}$ZCYKFfkG>*t35qDcJ_9$VHTc_gUJFuRvsyi z^NdG!U!rowa#paL%b+XjHouzwJB}30op{>5&&|zE`0VR?QKa|e3iRjZt*Nx#B6T}e zlJ2(V-uJB|Ipx*R=!v$(x4r5U?frkDmfl{!Yln|k9kCMvT|2rn&BnC-dSOrEemO5k zd3Kpp>!AAO8MhG%Gx7cPfuIy!gcW}~tSr11Gt0mKW4n}C&*$tt`QKaDM2TKl-`Sk- zsjsUmK%8oOA!wq^Xz2$q!TvTnEimxJ1iiu2rrm@Pl6MXBtk`uABS(t3z>)c04~c{~ zxDM$$2N|>P*SWL|=@V&*1Sf(?-hD40wKs^fFxXjAdNDs~hcKL=f20M7qD$!<0x#%J zht%XHs?0R&O-Of_e7GL)YgX2MIrC7Nv%d6|| z!bI?rcdQp>n7CaT=KIWsv%5KG;uK@3PoBYh$#V2*uX)Cfytt@fp}6))=xIUQn9m;{ z6OaUx1R10t#OAWM9mPl2d0ywmOf}Tn394rKd9ukcS;py2iq&KKf)-p0;o-h_Zm}M{ zY+a^RR*8I?hAL@*j)^OJsA-$n&j0ep3c?P?Zs+Er`tX_B(%MCl*A9#IWa!|9oAX0=v=wA zL>xsz#!M0gKB`LW#|Fkwlf16_2-{U-qCE4saa<JAb1yzoSs_CZdrkeKDf$qbTX)d-I1A;O-4F(QG0d5 za;l3wDbqu*&t0O7XBAevZvUaogk2Z|giJ zd8+<30iM|i<>(?|7H$0etEnAdTO4GvO2sd}<_ z4o{RZ_xWUz764^IwEkdO+B(MdSdL(;^p)pOwjkhjPN}>WeQ#GZz!? z9OU<)RgXW5HvqJ&D<>h+s#`n;abMl{Ha6nWmCH*^)~CbqgH%A-F5r2@3l7eTb)^5! z5@8dFc4;;$!e$uA_bl)AIcC!T`?X&IAAaf7e5hc<-08G6f{>c*jEf0pT%UnLN9vS( z0K5Ym-@_Ff$l&^HOP$|6^39Lm1eH#q$tmJNuLHT0Ihz9wr~>&@4`6jQHCs#aFNgzW z^C{Bh{z%dTA}v)$s=9dm*cPj$OYw=F zLS}>dyqP1g%#zkUD{N)+#jrR}Z7{%P5RI1ES9h9h# zQ$H5wxI4}P+%eb@8r;!gaIs7`EEtW6uawfpRhZ6>muly9a*bqkvr#q$MEeCms;+G9oPT@(RTeof4vRwZ4ywO&i8 zFG$-rUq5c(P1HUQ0B?AE14oK!spRDDq_79fKGSxAQtq?$$Cu;~*xxYkEg5g+y%K}|F`2A^(Ve39b6zO%bd!yrGC8Zn4Dv#`TYlC_%YyEhdnnbG3QC^on z+K#DE7n!u@hO-%ze6_ovyaXuVaV@TUcs+QS9~-i#h$`P|oSt4-zsPmBDM*gM)a=Ze zGb%X?>+{vDdDWR~In&xLr@TSq&$YaX=D0k0Uu-2OSUL*)+p!u2%0OJ^a>UVGVx(L3 zI*OD-9_%w&h|G~s?_YeZu2pQUxukp;adq|eylqdO;Y~UDK3L*q>4In+o8ph8{>X%kt&MVAr3Fg$*r@w zkL$IhqCw@QqtE?9NS+rWWmCksumWPuW8bZ>uzto11)Z@&&wr>1?^u-leBX#Uy7p+S zPPmmX7+u$6Z}#^bwu!rTa)^l(znrV^ovZg~4(Z^6@iGlw*c1)(P@SXPa9jAN-Hv{5P5Cm-_JF!ji0>v^iK$jh!PN0Sv=; zq}Y9xmHghB8^jG~Uvd#oaV`RI@g{(aAJ#boBJij{+04pu>Bmeb2pJT`%qzHh3)wyzZ4kp+_!S-2l_7>C7Gc4Z~rn!k7c>W9i@@gkRo$ z21WgeNTC&CltSJ~GHn&cj-wFx;h;WreRXav;p$vPAP@i=!B1Sh1FC~gV)1n+*OL#K zN%4ae53nB7aoLQ&iUrBZ4>EjbDE>{j`?Vu~D16y#ye4!zVhUK%M~2`?QWxT6-XEtNzvvb0$ zHPII(JUgg7YK!ZRioGUy^yR1UEMgy;qCIiAe4Ooj(-3Y(;uGR-aH{w4<*s=OVzyHQ+7vW z|L6ziMJNyVTq>=z&Xb(|@SI0#KvzGm{=i_kJ6E~dc;Z6=Ry_%J6wlq;yCAR8aiWew z{&TgsG})K_A{EOyZh-YNgppyfJQ2G%VjDDMGJOZ9lF9jZod*5O0TqpdE&oNa{SO=e zTiTtO9Ci#k{!8+`G|cW*6~70mZqEZ%_^7p%viqzc6FER$2_GK^9RcnCHC#Ed27Id9n~XY@TF87dS(1BSycv zdsp6ixOwamnR{^3rBxii{a<@0mv9nkKc0BiIE$Y-Y^hqDfChy7%bqa*kUZ5%!eA0< z*vOsqIxIdP70t0<(eJBt`CN!QX#M^>85Hm-??N8$+z!7d*2pgLm}PnHwaSdF5su51 zqeD-x=zV{6kT?Dw;U~Fj(!=;2rafgi+>v$QhJRNm#(g#5qC{KhTl9!ja&Xe?Y z<7X0Ed5-Aci84qKS?n;Vbvrz=2?M}K5$r&)_#E{cnQDFz{S<(w~$6FHqbh(*{ZFe_ZlWfj2@0N^}a4+bcB3jUTqIY(5e|w>@-uuT^@vxmo z6XOIx5h(AMkuwIDOXO9C-+6(%iE; zHKjS5voFYiYFSi+69_>o1~{kJVj`oM0l4A|a&T5vI8G69oOr^roSXI3o$toa-hVM; zN|oAUQJM~b0su7zWHg6Doi7XgvGhwKa4D5DnSDLNFOJJk?fv*0CyqN~|6CRBs8T3h9 zui-seJaV+cZIF{q#8b8IE~Ih?UYSH@ZID-6fLpt5T6XWv<0)u~zMu_O}|IyxyfySpW2x{YTGp5l^=X7;zlXLX&%fRvv;b zK|mn>q3!ca|`oNjiMjm_?;lFw;wfH(4;QrIfH|P11;=vbIOxaZ?=Yzg*xk7 zTlZ?~j(7F<0r+vv)TLw}=<5d(`^ADQ_vSomFJ=M_^nT5ThkrZ6#}{XzBjc>V}M_wX`S|xjSN$BLRLO-vo&uL8`GZ03Lcp|$48a)jUcr6RzJ{ibJu#bzZ7#W4lAGJz$U zV?`kc3g1*U<)cG|kL(Xfs6S1&;KqG^U`uI?2PE0H3_3b_O)BC)V3b92#@Op-dFu1Q zwDJIJx=#`N8klR6FJZW2}G`^xjnPxB%LOm)dR_|ps!%d*^pyYH^E|+#k*DdT@ z5j8Xsudf+c-TBBc5wXk+b)j{;49xRhEvuZJdd#toRzt_JqN;A!1WLM*o^eS-9^Js` zb_`uGiIT44#(YhAK8-lV^K|+~ru4eL++efuDg}g&qheYQZNH_EbGi!%Rw!Ii^};WZ>`@D%U}wo6ij0gL zT46vq|h`NExq9d3=C-8r3C5;~= zT7~LB|Gzbt&?#9r}NkRCJk)IUgn^HQ4_d z;W!cU@*B{V^uuasZnSdMo}UlrXUz<~rg@}f_@*lUkVlf{|N*;=)_&V zg-OUg`DwoNeYO}QiBk3P&3w3y!h`V3(q6&VXh=c;Id#qaYSSYST3NZdRFv{ZK_Z)B zrDVa!ah?S!-^3cz*9)mw{cnL2dt>c~@Y*HmbAarDlrvcTPR9G-Fb;{;8V-^&^PZ@9 zH*?&{SobHPj9UWUnBXz~p>&+e_Roeq*lC7_88Xdk`})+vAQkQC=;)q`T|!>NwfGlo zKgcxq`-lO7NRhooQfJpAjfBb zeZa8{|HO_LG=$kw?Sp=8L7x-PPpBlB=C#S8zSxPQ1{l+z$5H6*(NV)xv_YH^prBEB zWS|Aa|Ni60Exo{rI(p3tJh%dn|9}-2v!u&l!&dN$lO3kkm&wQT8g~gxiY(3`wVf&ST}K9UDw3^ z>~;b|NS}rD_$%Z&?GtR2)bH*m9}~}U5TG0|W2VH{KN5WTI_8P@Zq+toHE&#W-Tkyd z(@dxUcfDQjm0uLtI~pawrvm5i#4w8)WViBltXY!E8W*?T3pIZad@Y1{6^bmUWsHjF zL}fKjr%-N$i+|)0wk+v}-9#wZ94+Fi3*aPJ|Lm=`EAZAyc>WJ_glTZd<(o5~TC>U$ zg(E9@?2HkmG@@sG6?Oa`*_`5ZQR#|NiMhMxspY}Tk$dBl9k0k8hT7FyZL#|Eg!tc7 zzmT#|9m!0!ym7M)Xk22RtYd!7@j;vD7eA@P%Ulj_Ol_lbig0VI>gtO6OVDFr1{f2= zk!B_cziEpH1ycbi@%52<{Tqr~;0V)$L@o=r2PdNa^?Hoht#W`15!G z$xC{%i-SoWXOMVE9Yh;UaxY!t98UM&d)LKLB=$k(Q55KK^X_nw6HxyzQg-4`fkhDO zv%kE*z4Z9<{<_Kj*J{GhU`HR~vj?_BAR6JitJ|*o+nqkA_c1B>5HgCOxN0B#PT?{S z^p1(ljAL&#XWNnA$vUJ%YhwYlNsAh2gsem#`qrIl$n-cv6}{j7544opa9<6Bmsw?O zN7c-FOOfg7%Oxv*+3e9;ZOcM>$dZXPK&H?&v9T5>h^1!kWR#VCF~vYdT;KsPhS{XV z{FMG57Z`dNAS=MpIIfjMs`^4>86X(2GKpS%Ws_PSq9P;Cj`TUUOD^5CjEPqq!P6Ps zBcbb8(r%fSkH=Vu3EmKJ_h)Z2y?9_~`AI??DuV}KQKhE=dODo)sdO@)oQ4g{!@sd% zPjS9CD_UO@mdN|-cvXMnsG|vfmKnAW2H#rP|5=Nn=%efnBcQe$(R*Vz-f)}(X$~S_ zEey~-k|_)dag0b4&I55+%%?6jD0sfY8DF5=zx$)ZWB~NhY22PX2UYVA-t#y8<@-wQ z!K~Z$v`)fo{wW9Y<51bK_vAFri3dCxHfaPZwJ6R2ez83jM9G@_uOk(Ug27G0^l{wb_kwB)pBHz ze^odJxTOOE4_&Ad{*X95w{I2}bVa4uF1Dy%8H!kWlw9Y@9os#QK~at$=e*c3Ax z(`FQJTo9%%P`?~=jxN)&nn5<{HPTS8l&g}&H~i#;q}hO|FoJU7{Oe=9AK%=+hNwR- zT4*7B8|4Fu+}YV`dQ6cj>7+Fsr?>8qV8yAG8|5}vsgp)|SFv7S#L-A=oB$g4vS&OY zPWkQvJ&R|&jmBci%R(a``(C7V{ON@rO6pp!!Lhe|uGJo+)G2Dz6QRgjwtxkDjHJf= z=UMqr)T0j8U*dMH#>WYnEDW|-Rc*si%n#dYm(!Oe$QYH+gLnkdR?neJ?G0RhEiETj zVGH{l6ZBO3?hhYU7@O3>?+mALtv_SdxtvDFf)3|G{(4%K?b?CJoR6YNKMXWtBM#=+AVCOvxhBu~3^=iERwZ*C>SHCXJTZ5jOSiQL zr}ot5@{8emCu7p@lw#W_j!k}u=h6n8WJ`yMk=0toobN>aHhF}|=g85(30W)r?P^Ht zTMO&JNMQO-XJJCm4?&tNfnK7(QuR_<+hwENgluE~bWW^fq<%E>Mm;vHfFZK;G zF!c#DFS_=0ml^fZu7&Pa6}3L?JIwj;vm=Fyh}*O8%#7nDJ72v`I&!@4{Iqct9E|rW7ANI^r6PKRaIh($RHWSgG_zv&) ztb++8RR#*F4u3IitU7(EA6;zX83T#&-zSSq|EjzkUl-fqM)Y=!M@8XMoB9n}qv~*X zYyc6KpN~G=cY9cJV`BunGtOpwv0wi zB^Ic~pzwKncN@);{1*{3LeYq^vjd^o6PtttU5t!r&*5Etfu%P}blNa6o4L+jHn2kV zl#v-N?#P1T6k?;g^-FISHl*-m#do^O_%oLEKG5eX4GoUxzLrgEDT>`TFQ;Bj5Pp6K z%-+npI6lc36>NR=cA~;4B`e@&Dye(p2oWFMO`Eb$-JV0kJYJt_Hrr-U34KUweT9h> zYOlKDz?c!dskqD^EhH`BN1Qz)t~XaoDL-6`mm{10A)oWdPjF-Lh>q(mLh;&4v&w! z{A9RMBlJ(d{xYy(mp)!(8{fqxo5SK)KB1_D<8MizS4mM-{Hd^R#j(mriC`-ah4u3pb3Zj%gG=R?2}+m#+bN7GrtZp4JoQ)0gK z)hu1R%X_6SUoC)@5TC?Pj_S#Ome85#*czzxjUO%iDA#5!7_1!^#Fu8OPzYL4>7Gf| zSRy(|^usXjEAuVUNWlNQJID4Lzrs$X6 zeX-$nel$L1rJBwd<8j~nprO1K;rvA8NKh&;-1>j^ZDJbG+0=v-@Ve7YU|6!Ei-8cQkNW^7 zQ=k4$y7Wgtp!D;dJLMPlzrwpgS0C;WNuT-&p1M1~UviJ%oiVOELFEgqXJdY!wIP5; z&$mhn?%Q7=Rx38hh0AYnFYMd%_9wjDv?}9=iY_u#aVuaw(~<@=c)8-|XSqbm9!MB2 zKTdI9oAWr+>JQa0k*d7R4!Mv+Wjt#)V_?IHy57*+dl3?mW{G8sAar)JJLYSBFPwxm zS@$j|2Q@EP$TK9Itxa?~40CH=nB~kUJl}xr{79K_+vznX1*OFb% zqgRLFkyCOk_rV7p3YqU2)BdTFLULru1h&92?CQFO8AZJ0cnHjbOgM^$D0UnOr0P>7 zIJ?ZD{W`RefcDVV1_d$yW^8{|q=;+)Urmqy>y)d|=k(F5UXr}P<6Ess1xA^$k0O7{ zg8G$G4LDga?ZnexrP6AYL3K}@(`Ogl`~!Y` zniw7=>@9JdyKPToKv?m!$89VkMYO|XG>4srW{ykHF{Gnvexe+BscdHJ)i~BT7woIY z(c=nho2rh(0UfDbqu*!a!1?q@6%-T4fS5|$VRpTbN#Wdq$)2!Ytr8<7<{oFe?DZZA z+gYPU7^U@$qBU2?wUaVu>^UL7J3X=pG@XyQ-OaA}5^8pVd|NF9n)|J>&$(_Mg+asW z7NVoR!xz{Zay(j2+Mj-AttO5k;~sjl9JaRx#8ZxL=*1xAI{Is#a*3Vg8zGHeb$+Fa zNj?d`B<(DRLF=?p(mdC3>o$0obN@`1Wg#JSV_mmUCLn9gIOPgm$!Md~hN85rj|VN? z{Ayo+`1re?VK=Wmq@&eZi*vOC*6u7{W5Cc_OO^#h!kpyw?Yqdw@<|Nrs#A@Tu`Feq zXZg|K$XB>s2IPoIZ0>2P!G(qCY1!q%+)rhbxl(`-owhT`g1Kevt{!L=pGFG0bUaA4;3Z>p~U4OTWr**Q*mY7*o7-ao4a|KM_UCrEs=n0=*P9S}o+D*+8FJIq!f z**=EK8j^l~!3!%VeW>gm@wG0`?8hm3^Y=vZ#~96~hzXw|{u*u=-O!&ZuOxLcXBjWU zVR~?^K%sFRoIRNPHK@KMLr)y2e@O<|`E|i~-e;o_LCInVJ?me`kD-u&6Xztv_q{a@ zV3G%%_Y;SFr6%65St|E0(`OU3a&u+2U&(xw%wSvGJ>mOh_;4yIfecI+>!{?+sP@vX zO13XevVL=rv|wzv+Qx$r{6sT*9v-UvvT?f}sG8^Hxdy8KpOMx2H7|yR(NgMDg*$o} z`Nah#ubd5*ohguAz13|h5uLS3WA1O>axK|e2Q~4F|J7bI3l)G=WfO>YTDT`n?g)(o zodh2QB4Tq4XU=a8{315rLR^Dj6el4KhWq?AbXAJkB-J9{z>Vk4U3j%*7tP)v_g~te zAN}3~_sZ1{x}d};f+x8IjdQ0tslm_`_nU~{Q>y9TaW8jRgZ^_?U!svXFn!p<3mjT~EpYQ5Ew`twM{LcT|IYI{WE<2T&5 zYjqbKt0qv8bPHuBZXWOCb|ilpADVi%^-8A`F?WC%mLZ^~&~28MVviP&EpwmLwnH;( zJCr{0_Etls-`O>iUEYhG*l6;|nL)_X&!V*2 z;MXS#kShH{)i6%v24=SV`5=;8qR)i4WJ5k{))p~l2$6b_nJx1aFs6YzC6P-=M#k}M1Ak9?oD$)ajeaHh|7Yy-z`m?*7mOP>AKUN`vQ+PH^FQ3mEOsM5CEp6XDb#+)dN?akDCMqt zT!(+3^;_X8quPa%;Q6W3MsJ7D+eKun+BZ*O+P72S=Dln{qtPBz(!~yky0rw8deoeZFO#RrsQGyx90FuF>w; z(z?;H62&+1TXaPe3RVt-B9z;@_Lz6l|C|Z6vkqa3=M1ZBe(U!i0m(>#sAs z8*!}uY7%A!F86o%3$;MQ*0w1VX~zCt2=$y&wowaHb#Ki`2yv&=QYv{c;_LV**7%ym zSu}0-^Uc@NA`9c)K5OBp_FD=%eNX@9Ee4<6;9Y7;*TeA^ z&bnz2;Z1UK>{cWQ&Eh&zrQWSlg@fA#oVzG0)p0{Pn@TGP$I}vjDzVGKK554c zRHNk}}_k2X>r<2wogmoS|kI$fPU&Wk4Hwu8F>kVGLnNi{pzT?&&VYfN_^k&J*+ss z@O?uSf;C#>hwES5m|H|I{L13&H%SW=#~2_eI3|&Rdh-axCG$@z92i5TPXT9WZYSU0 z5f7VFzR6#$*fF1nEI%E;rCim(Ck!l@B+B<#@+JPRO8Z{^Zlf=F-Gg7NN(6``e*t~2 zIu^S!MHSr6F#X{)JJfU8K8U6QOzKPhXZ#PkW|mO+D0^aa9msf3K1Bxr;hMYxyK}^syXOy_-#q z1jR5+>H1XTaXhwAx#v;xPh-?r&96d_and%|i-OgWx$M-J8k>34^hDXJkTgr!)fByv zBTrpFo#dW4I&>Zazu&J9#%UencZ@4n8)U&}qp45fI5{tjykeRJv{L z*Aa_+V7WXrGYh*#bCd+gAUZ&LO*wO6yu?_G$=4JN-=40hym}~9ylS}Tn*`I-C2w{> z0C6+5XKtmkczCt1lv|X9Q z@!KDd(lt$8!LeWlMu!_M`Wy!~$p6K`IKDC`3~>T~9Zvg}lWHscVziOuxy@h-EkzSJ zoej{yQ&I$&9ozQ4`$1$Fw0&J#*uYJw{kN| zC%dNB?P>|#X1cQ%B-kkNzde@Y2u{72`0Dn9^wI>YoXq>OCp9$kph+nB`cn~}kIlst z(98FNGGX^_WCGam?QzKUu#J!DUYdfAIUA1yG81XdMpkE6;ohTj8lLiBWT2(>iA$sv z>4vb&k=~7=g{iNCflK*79MUGeeR)-REFI7EBGB{r1cZb5eP_Wg{C(nA$IszjIo{U! z?@D@%FGBw|^Bdgt7peUJ^T`H~wYEN=D}oO5vhfKueT8VhOpTUpi>jBu!9 zXv44Xl+MwZ?f1Xu!cJTDd4O`gn&7eU_Fg6l#C9cfX}l@bA|WvrlZ|AQX&VsBi+^y@ zoa7%@oHTU2bnWQlBvD+DZ`2afcCd5r8R_6gTn8Xd z;zT)rhxM~^oi-0bAxg>hIKzV$LYSKvB4{_A-`m<6vJ+ZfUPc|Wn`d{i7Z#9cj|;b5 z%-{QU_d%-h$-hCE6PFsmjR@d|A8^^wMBfiBVYhkA*!cJBgf51AV7j-rS6cvg7l@e( z>Mu{Q4_8;~S=qNbE}|WE4%%%1{4T772gp$-W;>{1V z&R=bRRwtAhaui`3#qBwZj}iwL(mZ_IF)zqwrIPR^tEPatER@17^^@VA(GMWM|VctOF1f)C15_-0qG+^7xFF zZSh^J{?0KtORLUXq%a5#=c%8r9qCtgY_)K-&XGSpVW<8y)=AZKSg!p$xthr* zSgD#%EV!R;fd`>FSEu~yw5Ou8fh`%}AaBUfD z;UeZ(;Dy=tn#evU{YmV0TqDJf7Qcw0O-@NGc6@4anXu%!q-61ALLE--jZqIlca)Ml z`DpIA#=E!pXA0Hys+W(s-e}{dH$qv9$5|w+B|H9TG%$ZJc(k7y_1KeMZfj)EcJbC^ z!hPvQqg;t%cu1Yw?prnS45KUgswU=ZKM>TMi2zMv!jM^E%kt<7JNKphdXqRW27ATz z=4^h8oLUFtGoFb1_ahU@`5Jl5hupkEItY^_X$J&5AA7cixvK4mznx=~H=8;NGq8;2 zqn75_@Rrb#b~J80#p7$nkG9MQMeYC-XA zNqC1Q75=CAg7P;D|1$#^UjNdr;+tRRhmdP+4(7~_mx=r|#4s1K{!38-#M<;B?z^FT zAMgl*pZ!E*#8ORjy~N!hzXcQ(l7`7P$lC!JzsVSpLMC{&(6F0B!a{O zc;3%ck<@s7QO7R*F^ke^(rHjAkeU}(!6u#fKa-4aYgF-|+}Se&)Mpw@WOzR zG`Fdp9-hL3#hS_ay!{eXJ0dOQ%<@bbi;V`i?)bG-7t z9+W=DxRLd@5DsR#qUL~}QhIuLzkl>0!$Ihdx3p%~_sxan8mZdCqMFb8xf%m4*@`Q= zwI_zo-V=?tA1%2l1}2gr9FVWls|2-WDvg-mh{K~i4XD9 z)Pq^k2ZO{@I?|-NaWm|&H=_-R$_N(jL)}#6E37XE6?`v3C)?XtB4n5A@IgAi~&y(#r5mjR8a$!z+#x$lV6_a~~d1;k5l)#hoD& z8$zUj!Up)>uh)XvCJ+F5tYYUNj0A^;8y`P)}OH8(G%1Wp>l#sog{ z(jM317Xijyt38NdR({G`3(roM7aVb~`@+3s&!5Ft%%ijNr5dpP2eF|gA8J5b@t0mH z;8EM3!1*6S(f<=_jNk0Abs)p|tyNOIGCD3--%Fd-TQq?R+qo09dmbXb{u>>(C-55` zrXzU;c^=|F{|g;P^gpA+Qk^dWH10p6!;F5S!)iz-FF|_Nf3w5d06VP3;7c)VQIm(z zAlGQy+!#q9o04EwHDCJb0;Ff>f1rnzXde1f5fea2_c&JU)sSmZC?Yo z(``vlw52p>zYgiva)R9U>3o46A#u)lol?uCXGu=*Vl8*OZuwW`&{~u0lYB#Ucc!p0 zAYz?48szL(;mpsedn`S69?oUH{I7bd5WK!;H@Y$tGjt2$MApS_R@${&z zKe%!(j<}*0wfsML5la`v_)PkBmYd&u zHb!Ut|9N6(8T0>Zp4hK?9J|a^(2Fxgf=0T?jM;Lq$d1E#w7A=#^ABF{F^f58(usL6 z5Rg*?0r|x6|Birs6Yj%Pre!KN5{Hml6^8(kxzg(#V`~nHd#hZ0ISJEDhMySwO5YL# zrN>R0X3F7z8X4UHbc>;c;4CTJ+P*7W0XL?6AaX|6lgxh@3`L%&^icC3$$yRqy zHT6(GPSDzR?r}0e)ufDka)kgi0%ksaRu6r;CxyKG$37wYdW)izAU9;GvhzrmaD+Sy z4fc5~|4-Bkt(Us^pS-VkLbWr1NFVFI!N%RWV?H!A7Hvy0cs%u8G}dW)`P!Pb%gtSv zi=w!o-1OuUD2G5Y?s4O(Q1Mbed-)*pZ`z(u77(92^8pKe|IS|cDNY9#)!hH^okLo$ zg`c0}LRY}!UVH!^g_}Qp=U=Y_f5>kE`5#63nRVqqimLzN$YOt~*mzC`fFjNi8ghGv zdXT|0y1EoqD@Cc|fg|hjIiHG+0h^=I6U&wKF$gX(gLoJv_Ib37ojO0?P=`RY6}S$h zSuWtR!|>*+oSRp1f<_w+!w5t@Wc>I1QcnZDE<&Dx@~PjgYZoKW=MmoNF#qpMa5@Bz zeq~piSfiwC4j{U}N}?XZhd-2)W&F>qKwwkr6UefQkw#Ys#HeVPpSE2btJCmEE z!y$S8YNT4(Hg*$DOK|bd%I93bs#>3InVg&)o`pcdN;F$)BvyJkv;E5U2!bSg9Eib- zXbJ8iIli7opTbWBO4&OqRb{Si26!kP%(GWuo2#CJBo;*UI*m9ehJtp26rfEk@6ky6 zV#~8Po%V*-v^<6Fgg?f+XR<+>a*vxj7VN9P*e;=5zdaAr+9`j0BpCVUd|D(WZ6$9& zvZ=K`U>e}c;^)fJGACG|M_s4G0?<81L59Qo9(tDGq*iYqeIerXcqp5ami@}gHhzf% zyqNkN8i3%tCxh++q;@lJ($J07E~>2jlUOhA?<@9N(phxCs!HmH`Mogh93RAhU^iVt zoU$b;-a8MuLLY+_diPdiCV9%V?S5f1Ay3ljiJQOJ&PAWg#06Lj$t7^!)4Zf)(i#Ya zFc7^*fQ7sU_V#rCN$8^ZIZ)He*%n!v8wsnEC{y2?iOezaei*%!vFgt{5ZeUJ ziP`F_7AckW6mZXc6aCF8#ze;~^K$6zNg(5!Fm>IP@U52=?ej~6i!d=aMed4*62k4r!^te8pjWv)P@KbPx#Eo3iaFDlVG%BKnaea}&+ z$+Z`~Vbz}X4PHmj*W;#8V?zkp@vg(YR)|5^#_q=atea}-Z4(8nIYi1lSLW=L6_HuwU0ovd}j~k*3{s1X=GCx>Fq}Z1L)!YJLh0GV_ zA{vQy5G2pNb^$UFgs257or^$62fT1=LLfX-SGTE}EWs#U7%PI-e)$22eyW!^u7n~_ zN?-o&O;+9j;K~*PR-)doM%LW-;1Fz|s)$H!V-)!FiyVL+h8{(n)E0~h>A^>PlM-Ss zDQ+Bxx%wgR#4Auw*ae?_>%j;b-8SFPnBpWkLXrl$A*>XmV zZe(;k+3}!Y^P&GFnI1!96XTZ@ZsogW=klczihb-xTvSvH_p0|VV_+S$<|e4_jWVsc z0DGNc(x@MBloy@z8;+zX_i{Lf}og6aCLtK+J zww4v7YmAfb<*}CGRFeu^t8&4r}X^TX2)j5I~d$QWWOG>CV=~Y-(Q=$?9EoWA^eR1VJD&Kg1 zglZNxabZk2&wb$)Pw;9^@$pkKzSnFgqxA}MoJn7Ai;$#Gy<~$uoqP)A@(+FFT6gj~ z$Fo;X>aeRX&_1|Zmvz-l&pT!s-@#J+Tjt#w`&?NcM zPaEG=6BB5mr!p%sLd_xtCA71WQifLvRAsxN)zbdkdY|-o0@_2hcwP8y?y`0i= z>m8iasnuH05TYWeER7zix#1}8hJ#ea#%BZHo_f>08w#kwf z&^>&;8`rRVxU2tMb8J3K6$;-ulzfL%@p&*~MPa6|*i1E|@F*0s_pQn*&hzq5X7#4f zDR1YXwOSTMvEK2PmIvzUlWRP6j9PfMRg<4rwvLVjP4yovJI;RIX0Uii^aD9&_Xs}W zlfpo_TypgG2fIOel8Ees1D=R7fiSxyg`QzqrM;rcBm`D!q+^kG03ai;gDPLX3Dyt>zQsJwx?hr zOqF@Y^(bq!`qX@*WmKec4_hGRqOj+7f{j`GbR#Iho%EX#nAxLN2DGpF8GoT&}XyzA(!s|1&r1@A} zd74j6ciqd2z|~aKkQi7Nm?!J@r##gWFWb}*>hsm;PHHt%UzqPG!aD9rCms7L9qQoi zA2-1;;yzaP)=49fQQAy+vQMYJu5NgRsX}~_ag?dv1heVNwmWabmy_-kloxKtv42(P zFh}tEQ(oRB*w|{M7`*K=#uoJ$snPBmZJV8JoFAG?Mf`Eu-@F5ZGr*jnR!QoZ_zG&8V@|^&0|M42N_oEJZxM=n{t;B?A#C>#iUO3?{a>L!8&XQ@cn~tc zS2df24S_h*;U}l0#jig;Fv02mIdh*qFj2L67?5J)GB;Wa@Qjuv>^5a}5=hb{C1US4 zVS1i=Hsi@2-$qz6yK6I%_wP_S^W2-DTC5Jc*pKoJa?ZWjAJ&#`F~fZYk^(Xuu;!DO z8J~yRuNw{-pmNWfgxAd#gPGST4^=n(?5ar~%IKL6@Vy2~^TkUl^HTgPq-dvFa*gu4 zJw;{KIrsLv|vepT#b_kp8`pzlTf@S3&Wv&XH1aV5pB zCl0*3izU6lJscS~xq-YohJ!3bY1J#4!=cQ0oxRLQkm47>0j{sTpr3O2NV}`r+37A5 zo}&%C-*}eaNYFMn(Pq=!FXO5GU%%k>Vl{W{L9Nhn*F#lz?(R%N^|Bnhx@Kdd({>F~J>?gJ+N$x{ndB;ANddd z%o-A=W9M@%ji?)B-_`Ul^ko`R`0z@$F`?`YK_)w$)u@I*$s0Sc#0PjkhhQ5IE`#W{ zc{JKK(z*7FZI!#L>$Bh`oEC<{{i0LfjKB2HdlS%&S)^JoE{eB^{Gn0En63LgJLkZ<7SH1@c=Xh>O@H-0r9U5yGl)-Vf8wjh( zOjvs@F)%T=T9QnB78rMgqhMMC$6oiZB8@-#15<-jUbIrdwaKGcU8<`0N0M0f;p}bA;#ge&^2;l>?v% zxric-bF_fcma_}83joq9f;Iv>PM(n#6O1R)a5MZ#-OPI&(6DZ)0G=!CeNs1rZ1g(j zcarFC-OvHK1eh>=v;bEIT_yHvoU!Hs_WC4#QhiB4FAVcI*vf-l6YdV|B{tZeV%rULok?8uPO^?y$YZ0e9NN3089&TEwMQ z{0319AbnvvFE2*{cMAN7h$XIS$XM*AtP{Kj_w2^S1VBWyM zK!3AFx>XK+Y=X>-c+mgj$&s-a&YDhIohubIU4NPga`zCh@#M*{O}oBfkJU}aB7_4>^FIwY&Ok(MgK*E=V2w>8jx8;PLIlFkh#|`m9?v8LWr_mS%!6V zee=NRV+uOeSspHF!bt_N9bCbiAzr}i&vc%ACLuWNJl&tRABVb(+$`S`2{K9Fu*NpXIg_yx$b;lD(!nXm5YP;`}>&FMRpMA~R z=LVjK<2KQ;#C3zMSca8*ekPLUQGY!ahF$d#9|B8<_e*%ul%JMNbS9a6{jc#Jg{u1` zcGWhj%=noSu)sgg3KqHdv{s&?<*3&*Hf*8rfMZfQW*e*7u~XMmz zhAMPM57F^-J$>WE*i>wq-`yn>G%^5J z!{Q{`D38Qm74F>ZG?ms#@3BA7D9cA0Zm7k^trGWcJ?3f-E%V_4qn1+3w971S5_HxG z-TJ&JLAg9aW@&yQ?yA?9=3qrt^1RF?N{6SW7L1K)BIog2 zBsfqac3$PH0xpMp8(@vHk8-#IREm~G9ZI};Nx>d%tE&aoU2n4hus2zN^qT4=;OXWpMs{-ry&S9-}OW zrI<0PjRUCcDIrbe*2?jn(dYwLzv%#|KTp@k#kk@pX}hebjZ<@012zojF-yS-&4}sD z@J|@T?t%B<>Gn9yx*lI7=maF^<+UqKW_|2_Sf-foI*vWe9la7!ZuPwE&dmUo*X7FB zYA>a8#GJ2#50*s5n$yFcC`? zMH)D4R3P@rq6I3?w{tj29ARJVaF-yU6UQQx)X_UNHZhU5g7yAKZe_>d%}0+K$WBPw zal@6g5=`8$8;#!oF+)h^&a2{i)O;}OonnZbD$Dx(W1uyY!u?jn(;m8rCAIF&8}dDg zWujP_(%tm%c`f2F!KK8}Z`=WylER2)^3ZU#nfb8nP3=;u@~sB|@7d_>qDK^fKg@*Z z>=CglmY&D{swv7FD}H+o$LlttS_*bQGM6o<8ghs^GM-`LK*9#$k1?h1ljMnbsc6b3A|WfPYDp1#=m%@f?Tw&A3^f3 zo)mC4(wkUeIN!F}?~`q#t?Nx|gHvv;`PaLI&kY6r6NOfps@Sh&%E^==@@0b73>5+g&UiD`|40R%G1!idg?8w{@2!PBh;yC)Z)lv zZK79luE?!%Xd-7ep{Ql>=Hu`kLLvWe^0x;)3*QfEubES+r3%2EwXp-_kFXBIxoYey zcj3=L*bH_AbE(zc(pz!xM~BRlAa@MI9~VtrCGb`RA%nLHxKD-bRZE&*BS*U_qLu zmK%wr)baR3#34TPUG@VjjN(gE?agCg`B_PomX}(Ded8WyW0(QyUj^tBksY6g}FU$9Z_TuFG}K^?tv`bG%N7x|+hN6SOBF2s)*tD60uU z__x3-hzK7X>9bCA0KbmgE9yBx5J@xcg%`s`LI*)ikdo{*ZMP&0>Y6RGt*_o;wQ0P* z^3gS}eig+m`l$9uYZ6J-sI{hvP~Pr- z6I1FR#iQH~x8AUyAB^kB#D`L~_u~)*5R@UyLI_bt$Pz)Ev>~LBx*$0-lxo2y4M}}a z41oMzMHAsca;#+dP-uC+?5$xJgJEnZ4Mw(`Tkl(5`xzF`?q0!0v({0=BY2C+!fwRY zG_BikZMsdw9bQ{*>TPln64OHWx98)vx`LeyhEcaS1@Ca-uJaIh;?yoX@=ma54kNIM zUsE<#KN>cA289)!oJ_+Lz;;yh-J!w!wy6WKSl$)V?GD2-^JEldgL-w;t=MyLY*B{*k=1!sU6GXO( zvx-#N8kJ65<}ndv z@regpE$_ocWsFC$m{F2ru#Rv0<8++DAF%>NOx+z*)yy*7-DuYUhxY^!=NS8Ac|1rl z@Sj&xD}f09MV0V8Q@22H$;l~h8RMjz?9#P_Qb!$*s^iCm*lShSl_zCz=*vHctcUPJ ziV7BUILgqg$9qC#5}zzR-Lhgs@m)AsTK=)tPPD9|Zf3DN!GQ^{expD&0AWX_!pwZzb+om!Ghr9<0{^2xPS&R|!Un4o%=S&qh? zVaDghb6aXoH6dSHUh`ghK(TgZDF5lEHA7vR{d+13^JRT;#89t5`Y@?MkWvI>(s?5Q zyUfeWnblRw(cX5aVkNE4D)d7;;_SjEzn43imXg*veA4p#$QuDp@?UL-J}(S&FQImd zVb$`wNyEieL*eI6_bfklZ#o{Hbj&C*wpw8%Ms||o&emR_fy7AqJ@kq6tvPina$AmG z$3o8-yCv8SS)(xbRK&3K#Y}!(w?CS&IVqU0S642C+}zOH zebL?ehHkr8wX-~TfEBHjEs3CH?iLViarX~ZH%r0fw;j8U+C>DnT^nd?7syH;UBs`q z&hz!Ue;)0$9?N)L$;#D)WaHl3 zOIy2H4@iO@@jn*nI1HQ!2lP-YM^x{M+ndF)vrbo%!})Wn2q5WFl8F1)P`9!Xiy}}3 zLr9VH<}HhbT1X22WCV4@TXiUvg`3tm4U&@k&nYkem)f9CQb%_ZqWe)UDqihGh+S3k zg&^KqXHTBZ9>LS91klrT7D_p4Lce@wvQSU~!o%?Ev!aMHqlxj1v?>%TsKq8X9?Kx( z&axiy<6$BzXzTKo;lqP8?^#fS!jn(M3?GG{u-+F$uquOo!Jwvwv(FHGqf?dyQpdF= zi$6#{=o9SnsS|FYCkYymXs5Wb-u81Pbi5*a50}8jfHAUl0EGu-XNZuMyH*+KpF^Wi zLaNUYVi07yK3Fs;HQ%K;KP5=wU?H1iN@`9+JN>4XWod*pGiMhcQkS{AP~dF%^IWsu z;}(%QEl~b068v*@1WTn(=)!3G=wvJ z9pmYL;=b8uSS9vJ+Mx8iw1nTD^LBcN4Zo9F={WmG*VzG^QL9mm6dyUWpK4Lvo674K zYeWYN^)3jU@j%Y2%G%ZlHxP)pGlBc1>PD3Hqg3GRi}@mUPUT9XZ}deRdEn#Cv7mCZ z^>P(GHrpguDpXEHi1O3=hGv_Ha}yX*EYUfpEAg87e-U`L$_c|;lb0g`2ls|iB=j$g z>ju;+! z7Nve~jlD zTW$O37ke$qwA8`&g<0JMoiRy}%mTwq$TV)z*H(@jQH1lq?tgz)Yj|VDO$Bu>m5EK- zNanXKl_CQ>8q?jU&pO53L}xCqe5Q2;S5I?@{CSEMl(n{wv?bLJ7|d5s^#=dSo2k`?Q~rx1d~w%Jgi}dm(xGy!W2Lh@XZ1*KWM?Vr zR*p9t$g8N+!e4iZvbwS5<%O9N_xItH@e*L68Q|$Aq~>nXME>j9qJ&?_nr;gHrJS&9xtrKa{U{$( z)i1yKObB*O+Fxw32*1Rb0zsY5;tY$3%PmQ29L6dO*v{r&PROX(mRsB4+Z>2pDC=#j zwAPj>-pL4jh`r5-yEG`26uNlrsBxNv_U~BXuZ82kTw#B&0gxSbJ-@Oe5IjzTh3_$J zdtsgOE=I4WbQnugNoqA+CGRip@?T^J^i(lG>haRu%xOK7HDkJIxHXoM6T_r}}16n~s zC}~?OEk|kqhmgyh7N;DGED_wv#3HgJ_Pfq$Pg9`+aOn8e0TF z1`)b+7a~uRSkTxcC1#B-Z?(iXO-3OU+^5`dS#z*w^+d*<^UeY-U@^rRv|z^|YIzpf z=P27@ogf$trrMu@C4so*@1D}1=dKZ2ZApmkd*>jI3xIqdWO@sG@qa|3c8f>ML8NH&EI63oB-^;DnPj+p*lD_P4i{vC{ zS~KVR8!&VQV*F)!o0SyOWy?CIfV4Wr(!y7Q{7 zvV$*;_mNgkg56r_V{-LKM->C2HvxPod4Vz^?Gd#K7by&-=H~W5qCs`XI{Uck{h`|z ziAiiepmj{p=N9VKwXG(IY>fEuQD1C3eEtyV=7GhTAHxG189Y;Fers!Q=H;vh#Y)5t z1G7H%S(i8Z=P{$=J~ER}x!AkWa5v}tG*kIPW(3JI+PB=~%(26Ho8UR+j?hYP?C@N`0ihLkSp^hz%!tiIq6a(tVCY7&g|auP+ZNl5Mru27FA}pw_AJ^mhq3y%5IL% z7i zg#`ko4YADN77;D7`*H&NSJ~=V-AsvTZ_r1xaCOAHQZJBwyv8Ei7Mn5~Z!#_Rw8(SV z+G9|x&=24SY0%q#;hy#imT^h}{>RySSEDF`!Y_BL_AhOD8h1|GE27fH|4ie^8%6>A zv(8s&j294+43RhpNX$yc(hgc~UQ<<7Rn`MdTwO>ne4Otbi>7s-?gZ#ZOF3D5$qwo-3Qk8tJBgK~XYPZByCdHs^e)^4M`u`TWT?yPhYAy8vXpBs7VQk4<5J13n675 zw|`3Zq}mJ##-y%VwRa}*A0YNx&;KDtbv~yM|TeoWmL4ydoga>NONzA0_UT* z0RUp17BR23(rp(JpoK+v20%J1dwYA^YjXoNBiXNCzrMpI9kHH?Ri2{?l5f_NFL3B~ zsf>}NRccwJwBg8TbTVuMVtN>ts zLpxXZea9*@HVw60w_ht?Lfb=!!vhC9zqO*eHJ6Kgf#}TrMn+M0CYrgOmHT!Sk$;l+ z-q#gmVrF-KQhMPE1_}RykJ6VwzdFT<~590_Yf500SY_#?Jm%-q7uZGdkWeNnm4l;T|-sSRSqx z&CVwBuXg7W-97JV#`L}tb8;{^y~!iJgK&rb;y{yq1XanI=v{_%y6tMSx*`$pyLjsJ zd$af;y~26CN>n-{N~IY_+dP-8!5<2DBe|0OhX6$FC7;92p%grKcXoE>`(H0l)D=$T z%qZ2KW0dszx;oRbyR~e3nM0;y#d?~7*^e_$IQ@FL`R4HO@P=5K_}gc0bSa(1shR*S zc6fSudAYkQp~6%>-QC^2yi`!c+EgK=^|aXK<(|22n_ z%A@KewxP9EFJihA-{Q~!P;*dKFmUzkEW3+B`OI8T3LFl<>a(YaioR)afc@VDzUmEg zw72?8XrUdjlFoSg=;aDT&2*wE^u|JLPBwzWq7CH2fx;AZ*7QUabqMLLFi+2LIy2r^ z0iP5DZfO_{Yu&J{nW1<|QIl9O(fkI@wSf@bT=37L9^c}59osR}xA;=byv3ienU(B5 z560bhp<*Jo^>~$pW6uEkJb_cdjYa)nOQSdir+X@${-eM5x$s$L&xAJDY96E$OaFTd z>LipoEC%hYqKy&VtgE@KFfA^WYd~1d(>f4Xul)5Z;nSS_v_{v)d;-hYQN=y4(MwYX zS;CXN6eY1R3jh3L)C^l4Sk}e5Ki9|4NFH1F_%aIf66`w*wO15|y46G~?K3D}8G-b$hhk@qko|kP( zSLc)9e%}?)JzKBO%P;Pi7V|zH_n&F&2x}Xotzg(9N|O;W4_G#fC}60xH@fILC}x<> z)onFuU}Y)hFXcjknwFb%ZF5%)4kaZ=JmvIyxcIWJDDRl3V5k1Q_3!k#(v29x+peCU zc`tjMxp6VIOpxbgo>ti>P)m%W!r85d5HM zXR$O3ZYn+iQb;}iuV4je_Yh1|{X5x}xLiY9#ao=@IA=jO%5@DcD{ zfd*2pi>E_KO>-ukeO)gF%{ITGs>??^oA`PZl5F%EI7WQK7g*C@Ab}j03JI`T3LGrM zp`%09-wAb=*vEWaiPsUBA`OFJ^`*wOGIw#FqR&$IiTjh97t^*8+0 z^i>}b_=+j%oLdcTScMH~E3T1cu@F+*ckOQjcp{~y7(g^>_Vnb`NkB$riDE*b3yr^l z<06d<`=>uOGXreE)V&A@iE2MR$uZ-T2YkWH3t#H-lU8Gc;g1gfF6R;VLF# z=vYrov&r)h+#*#y*b6oD@!4ZeOTL~qPg>k9wX2BS^q=Gq<7KzR*?JEAQb$MUwCr40 zc>5FW<3jYT8n{JDIcowg2(bx#p?yF;RDgMErF z1<{$I+PQcOt~^%azW2ECysk=8jor%U+cF*DhBD6Q*oE+EV`7LrZ#L3K+^y^MU~!sk z3Hn~}hdkHf{cL3Gml-*g^QtaH**ZHCjf;W*SsQ(x`X;n@@PDC=suRWR8{hSnd|H`) zX{_hwjW@YHW5dppW~jCx+xz7=4ZN9hd|n@lqm{j(>a*U;J_=vjsRbE&|AfYVCZ+6+ zJXgE;-?zZn?rjx}uIIuG@l52cSUxG=k!qour2eZs>h~%~yx-v=NZ?_hnI;|(=(9hu ztE41e@D+wg7XvzDwb#%1*a z(K|lajnhcQr92kSaumbp`wYrz*3%+%1-q<9xJuoQWsK9I;7=`b}yL zQU6&dOQs@koIP04tb)bqm3W-28bis^IP^Q;NDZ&0EvMzIq4~ogsfGCmsQ|*aZI)kDf85$>fGvKKglH!K3=CRDHaZUwZ+1=gEEI+gD?~!1x zpF1NdxiXjH3;un-i<`{S>m-iZ9I(;3XokAlTA!Wuc>sd%pVM4u3Oaqa*2{hWyZ6Eq zZl!6wd_Y?5}u9Tmj%K%7j6GVt2-M^NhRC4(;5GCH}(T#{{g4Fn4kiDbO$lYwo!Ac$Va zLG=R_O*EI~4d;nt>LmDnt`wRugW)_^xj$TnC07IuM}LLkj#%u-^D6aiHJ0BAdq zb$^!pQh9$u+fyae2e`aDxZO{BHyNkyIo0%PwXN-|ADZ&u@!LeYX_m)gSXe1`2Y@L1 z=w(XERp0MPh%>+7;|!FeFo{v>te6pSE`dP5!UwN*5-S2Z7UF&*l9KPX*<;Op19OMn|o|l`uu(P~>Wlge^_Y0X@!i~|MvC#Gv)5q^{ z$^m#QGl%cHNPUDv?qc2Rs*sSbE*1w6b6(R-*ELb@AR|TJRife$9%94DT`JD%vACt1Q;Ui)9#1OR23o-O zDo5E8rUVw}*{{}tHueL8^YiVwWB2*ud{>)E;f@PW8#1^EVEOT(7tLh&d8&9$+E`W0 zq@_gObPsvnAA^cLkTm7h9KM5u$6zo$j90%W2x%kT^SJCZY4V8(TyAxiKfe6dx}$;T z``7KY+1VBhK7fLpPEJm1U%rsKEZcnUX)Bv`psTDMO{2~#UFv!WGza{H0>D}#0z$|a zh5r8RsK-sCjm3+`yXL7Z&clv(H-@5X^0&%ok}sv3ZmHcf(jWYYYEFaSor#Vf#jDXf zP+6nzCK2zbB?L-(G_-O+Ok5Lp?@suBwa>|2+RrP{|Mo5DG&n*K@?19fhS3=aBCo^E z0uVtLYJB%=b8`Xb8#t$j63Xz;L!DkDL+V*1DiMsQ4tnl2|d%l=@2p2>V zuX?$P>EC1%kx3owmV0ZZ;U~I##T465_RC$bLXZ_w?a8oPLj&0O-{%H!5`WEr429KI zuSuIaALIQ>OJTpzAX7hU3ope6v#q*h+x>ysyCagow@AC}UOMwU*gXm;)zrNLG zxkn-^l9>vedtDH zk6fNZ>70Zc*R-I{h2&`AIG~?L^j4oo;bv}WPNM!J*cndJx0hei9#Iy){l^o@8qq%@ zNqAHmWi9}TpKR$vH}>c~;ZGuh_X;Hk)MmmBkCxv&LagkW&L$VE;eNa&CLOd>;|7sJ z2R@rp&&6{b9axf|IC}MM%W=+0B~{cmr83|ojawdVy$t3&--i2c5CJ{T1dbF^brPWm zChhK1o(LHw9KEJ3ysXVYL*FYfCL(<3(*!j!yF{)wulx|;BqjaH4)Ju(;*Ohm7EaC& zmks6w^gOISMOXHq(}kdiZ}M(&nLdVPot<76feAtluu-slZ+>pMR7 zZT5-n6O>wN*O9e`Sgnp3$9b2YWC}MebrN!BrnIh`!;#%bijB7BViMy`h^HeCrRYRy zUT(kx6;pktyH6KVbwA`sT5>eTMCt2!3_H@z&yMVGj?s_7U}4zuYA3`Y%GRiu(1byp zYRlu8WRgOvTeT7$$HtaOQ$A*%U3hV@! zd|J(Z#dRIoD^pIqb@Igg4}rFPul|T%mnO_7i$yjVL2#Rucj^C}j{(WGE%)2q0<6!^ z7JJ%!RqF-sD@rLA!hyU+j|HWCxL2doD_H+VV*H?IrlD}Fp+xV%!`<4M0msTa9w?`| zPLZfpaJ92l&#qSMw{mf{5lpma)+R4aJge9332AMDD)AS@#`j+WAu#InuYndb!PBE1 zvgOk@qc15E)Z|M(E=gA9t!Ej(vg~=gk0}$Soy*a{uza);&En-Iy^A^5qFAjK--0JL72fNy6n6P}HV(L^{Sl&|v0rkA*L!ul!}GCGRv_#4;rnbLz`ZcMi-b zW+&fD{F*}O8*bwRXeSgMV5X>L+RoNeq7u!xi7GbC~0pKV3c#A2($oQAvP7v& zaUFpU8tXtEdLDQum;pj@pzulUd#UG52FV+^bq&{ut6N)jYlGd=5-Uohi!y*x>G_Ls#j^9ep_I5 z=mKY8yH#)?j(rhu+(BPnKunEjJ-GqfqOQkT`43OFNPA|3vQJ@hk$Oz#p9g@Zfya@G z&hoisES4Oyml0HJr;z`3_0AuM(8VDsB_)L~uA{$SYvGCYb+23CW7078{vcU2t)kNg zRhlLy6$(U9sKiwORrf?)_%1KZ&x1J$T`(U7Lg3DH(xMN~d3H&#fT>h7AG70Msn28* z>Pj7$wA`#6BIcD^VRR8s+nH9;heHeDds9o2RFyF|c&uf%%pxTva{)$P_CvEDVr0H< zEJHMrjjKiDvg8(kIgIhd8lG;`R*su>Iq zW_Twd_NZ?^8A5t}1QSw(kSV)3_t=n14ZcIE;mJ2tm*(1IIcy}xi_fc5=2pwLFSXm2 z9Ad!NBBwDOe0Ntzd3(F(vj8r&6xu!iI<2AX!rd~sbq7`e^soN9f*D&MPFviQc1}-E zcXWj9mvzi6?=OkUTtDhuIF?{ms;r-D3J;8@OR?>U1rV;aRbkoV0$;Qvq8KS~_;`PG zgLSN~srj}ttzcI>$B+g`pBQkJS%Z%{+K1J2)p>4Vy(A~b$19Rw;U2)&)|P>Rq1NY{ z$4##55+n2FPTn0dJe@Y%fWiTWhUUJdLB`^DNIb%TAK>HW_H|%_9U(X258tQn?t>XV-#rIU&&7FifR!zrJ#jy~INBxvuevsZ zVqZsduh))QwTkuE?2cHO=fq;N8j&Z^XRN<%&!yN@Jf>C$yD%DqGCSM_9|s?A?{Dk# z{aecuS}>D)VRc%+{Ei@M+u zi_Plk@qJE-+}uzfXaiohiwE68x;j?35CcF1Wy5nq?Lkhcyx-A;Wv+$F91>K((0Y1$ z;yO$}>zapAF;d4U$hRC@&-#h4yWNHhC~0T_@`T>~FUgydDXIJNAq#7H=^+64g{4hJ{@-d+gJ8#WxE7)(pP2Pq$9@VXtjXdrOno=SfrwG>v#C@ ztVJ_Ea|fIy{kfuRV#IcP&oUyLx`;P{IBh z26%77(OX>AfuRSB$<1WnXXi5dN>$pwta1CnXKUWeA~bc(aH5h3`Od2R__D{bG>FGQ z5UR(&-zQU8F+a%rteol@ag#e|C71$T;JLpk>B<+O^QlI3oR!e;Jwl^GDX)|Q8+xfP z2H7U`z|Q%dJ5QCBstt!a(uHCI9e_L@&XKpr#>Xgy(+a@uboivAJ;id9iISpGrc1>w zycDcKSAx2i(Yq#S2G?^$Ta{LqicOb&+~)|(ZSUHImoM>ZiJo^WoWb6R*+1qu6?J$U z;Np=-(|B(p(9Pm8?fV3x4u`{upk(d+>E*q~Dz*vTi@XCbSaiK_F?kvU`S$9}x7{rn z9{WgANZYb!sj#pxM~vLD>z%?UM4T{M7x|U2*a&nEsD^=&5eO)nTlf174GqB`O&y@m zNaX?b1SGFy3do!Ev5(^u6G3NywCQ)BG7yh{#^_xWZcG^$(&5v4SX33b)XC`?f)%;? zr=$_is{}d$LW9ynF80wcZo4c3V`TQ@Sv@ybC66angZbnZafbefM9|FS66b;&i7b-E zVhC+7Rs@r)2TN1j`)?a~Mpnuy0sq0k!?V5<64E>SYf|NZ;NU^ppnWm?yFryzTb81Y z`bHW3r7VFq;Qk(6$L5^;|DN+oqE7DI0M@E-xgkFe1C}TICKWhF@HDk zKo-zW-?5P6T$9X{pv5_O1XnaoOlkVNr6usA!iQul{?) z^psd#Fvk3fS}))>9-F(~hr=u~KZI9c-$5F`!4(pyOeWp$%E7R*DU%(WwA4ch>K6z; z$OlxjKb3f$)?1uKrl5EJw>+YLJDf*!@STR>!4047p>NE0d}z-|NwZ16dBUs%>C3Z> zhwi9unF~8vsCC|6K`y8&Y`)%FP(O`2KRm(*#ryN2(1g3f$yM_oLfXpimkSkM^{1)| zDNjM+*VuZ_b)v68ol-30C*VW#YFqxtbvp&FZ@hNwds;t)XQap0n6K#eYS~giEH6`4 zJVOGyU!f3e;^swJPpwX7`_P+}r}pe^dmcDFz0Ih;0s=92XS^k7wi5~7S7FBKm^d$4 zp{_9*{M4T_epL5n3q)Cj7NncA1(Wn`|Z z48KhMZCH?nto09EhqVJE29!kk6vzftn OT_7bn;Cx6MJ^X)iqk&Wa literal 0 HcmV?d00001 From 769ac0bd035e5fecba7782ad767122caba3ad39b Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Tue, 3 Mar 2015 15:07:32 +0900 Subject: [PATCH 6/6] Reformat C2 example in prototype/corfurl/docs/corfurl/notes/README.md --- prototype/corfurl/docs/corfurl/notes/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/prototype/corfurl/docs/corfurl/notes/README.md b/prototype/corfurl/docs/corfurl/notes/README.md index e5deb23..c9c1f8f 100644 --- a/prototype/corfurl/docs/corfurl/notes/README.md +++ b/prototype/corfurl/docs/corfurl/notes/README.md @@ -23,7 +23,15 @@ Chart (MSC) for a race found at commit 087c2605ab. Second attempt. This is almost exactly the trace that is generated by this failing test case at commit 087c2605ab: - C2 = [{1,2,1},{{[{set,{var,1},{call,corfurl_pulse,setup,[1,2,1,standard]}}],[[{set,{var,3},{call,corfurl_pulse,append,[{var,1},<<0>>]}}],[{set,{var,2},{call,corfurl_pulse,read_approx,[{var,1},6201864198]}},{set,{var,5},{call,corfurl_pulse,append,[{var,1},<<0>>]}}],[{set,{var,4},{call,corfurl_pulse,append,[{var,1},<<0>>]}},{set,{var,6},{call,corfurl_pulse,trim,[{var,1},510442857]}}]]},{25152,1387,78241}},[{events,[[{no_bad_reads,[]}]]}]]. + C2 = [{1,2,1}, + {{[{set,{var,1},{call,corfurl_pulse,setup,[1,2,1,standard]}}], + [[{set,{var,3},{call,corfurl_pulse,append,[{var,1},<<0>>]}}], + [{set,{var,2},{call,corfurl_pulse,read_approx,[{var,1},6201864198]}}, + {set,{var,5},{call,corfurl_pulse,append,[{var,1},<<0>>]}}], + [{set,{var,4},{call,corfurl_pulse,append,[{var,1},<<0>>]}}, + {set,{var,6},{call,corfurl_pulse,trim,[{var,1},510442857]}}]]}, + {25152,1387,78241}}, + [{events,[[{no_bad_reads,[]}]]}]] eqc:check(corfurl_pulse:prop_pulse(), C2). ## read-repair-race.2b.*