diff --git a/.git-rewrite/backup-refs b/.git-rewrite/backup-refs new file mode 100644 index 00000000..dca7282d --- /dev/null +++ b/.git-rewrite/backup-refs @@ -0,0 +1,22 @@ +14de7eae603c6810d63d40406e47db26d5c4182b commit refs/heads/backup/claude-ssa-fix +2bc7e993f7a58c259d38f5d3233326f8a69e17a2 commit refs/heads/clean-push +11947469a115c2e94819af69d2e87d274a8461e7 commit refs/heads/cranelift-dev +279d29af0efcdf978707a56f31afc8610129424c commit refs/heads/main +67a7e4741f9a2f0f0e8c65f5582bd48a93b53dae commit refs/heads/selfhosting-dev +0880022ad365e2647e013c43e0c5b1b21e9612d7 commit refs/heads/selfhosting-dev-backup-20250907-183125 +38857a2c3c44b316e1f59fe64674cc463e6932d0 commit refs/heads/test-chatgpt-fix +08de33cd202ee3c46884d07214fb999ed7323369 commit refs/remotes/origin/HEAD +e49af2f32dfb7814e57fa404584b5934310451a9 commit refs/remotes/origin/codex/mir +21e7c207ef98c4016ffdaed3c8e50e6c0045d8cf commit refs/remotes/origin/codex/mir-4q9jre +b7c3995901194c3049fe4aa67081e2e3cd9c61f5 commit refs/remotes/origin/continue/fix-26 +f895a91aa453dcf7ed1a92c28ec7a8f3d39b6b2e commit refs/remotes/origin/cranelift-dev +9b6ea67923cc3e9aa1272d6727999c71f1a55004 commit refs/remotes/origin/docs/submodule-private +d8fb3a59a8897b06007f8f6b831a0c3333095657 commit refs/remotes/origin/integration/core13-pure-ci +3ed8b4e6229a8260c2d67fc25f3320ae3bf9ec8d commit refs/remotes/origin/llvm-dev +55cf327d0e4bfbb0c3a8f6fa54dc2a1c3a3b5606 commit refs/remotes/origin/llvm-dev-local +08de33cd202ee3c46884d07214fb999ed7323369 commit refs/remotes/origin/main +38857a2c3c44b316e1f59fe64674cc463e6932d0 commit refs/remotes/origin/selfhosting-dev +9248f79fcdb3c33bcfcb4a69cdd875d5e559c8f2 commit refs/remotes/origin/vm-test-request +39f997e48d326dfa78e35af55def4f484723a796 commit refs/remotes/origin/wasm-claude +44736bf9a3e24bcb623abb990b5c45632d1d64fc commit refs/stash +bbd031517e074abfcc1f3eb7a91aa5851d931b4e tag refs/tags/v0.15-core13-stabilize diff --git a/.git-rewrite/commit b/.git-rewrite/commit new file mode 100644 index 00000000..1d9e8ba2 --- /dev/null +++ b/.git-rewrite/commit @@ -0,0 +1,8 @@ +tree 440b283e63d74f8a975171098fa6cf65bd316011 +parent 8913cd87e692e4e09091654f8934a214c194575b +author copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> 1755176865 +0000 +committer copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> 1755176865 +0000 + +Identified clone state sharing issue - different Arc data pointers + +Co-authored-by: moe-charm <217100418+moe-charm@users.noreply.github.com> diff --git a/.git-rewrite/heads b/.git-rewrite/heads new file mode 100644 index 00000000..492b9a6d --- /dev/null +++ b/.git-rewrite/heads @@ -0,0 +1,22 @@ +refs/heads/backup/claude-ssa-fix +refs/heads/clean-push +refs/heads/cranelift-dev +refs/heads/main +refs/heads/selfhosting-dev +refs/heads/selfhosting-dev-backup-20250907-183125 +refs/heads/test-chatgpt-fix +refs/remotes/origin/main +refs/remotes/origin/codex/mir +refs/remotes/origin/codex/mir-4q9jre +refs/remotes/origin/continue/fix-26 +refs/remotes/origin/cranelift-dev +refs/remotes/origin/docs/submodule-private +refs/remotes/origin/integration/core13-pure-ci +refs/remotes/origin/llvm-dev +refs/remotes/origin/llvm-dev-local +refs/remotes/origin/main +refs/remotes/origin/selfhosting-dev +refs/remotes/origin/vm-test-request +refs/remotes/origin/wasm-claude +refs/stash +refs/tags/v0.15-core13-stabilize diff --git a/.git-rewrite/index b/.git-rewrite/index new file mode 100644 index 00000000..29003458 Binary files /dev/null and b/.git-rewrite/index differ diff --git a/.git-rewrite/map/013f6b576144c18b2bf26914b6801589b6cdb014 b/.git-rewrite/map/013f6b576144c18b2bf26914b6801589b6cdb014 new file mode 100644 index 00000000..dcf23154 --- /dev/null +++ b/.git-rewrite/map/013f6b576144c18b2bf26914b6801589b6cdb014 @@ -0,0 +1 @@ +5cebf4c1f7f7b871846d9c77edeeb4203117b15b diff --git a/.git-rewrite/map/0147f074a96a64af5d3b41b266f4b1a29afa5997 b/.git-rewrite/map/0147f074a96a64af5d3b41b266f4b1a29afa5997 new file mode 100644 index 00000000..520a75ca --- /dev/null +++ b/.git-rewrite/map/0147f074a96a64af5d3b41b266f4b1a29afa5997 @@ -0,0 +1 @@ +b30bea1e7a365eed737a53c7ce50b47f3df304fa diff --git a/.git-rewrite/map/015a128f26a6c031b0c144e6db99276720db576e b/.git-rewrite/map/015a128f26a6c031b0c144e6db99276720db576e new file mode 100644 index 00000000..cd4e4584 --- /dev/null +++ b/.git-rewrite/map/015a128f26a6c031b0c144e6db99276720db576e @@ -0,0 +1 @@ +3513c4f977ab73cd0bc835eda6c6f0c9a225ec62 diff --git a/.git-rewrite/map/01be5f50a207d60d85bd834b42cde87a67a6d182 b/.git-rewrite/map/01be5f50a207d60d85bd834b42cde87a67a6d182 new file mode 100644 index 00000000..65baa8b9 --- /dev/null +++ b/.git-rewrite/map/01be5f50a207d60d85bd834b42cde87a67a6d182 @@ -0,0 +1 @@ +3876b83e265935d293eb8bd87d0d38088047408c diff --git a/.git-rewrite/map/02541eb80adf788bc812b8ae9b6c1e2e69989d37 b/.git-rewrite/map/02541eb80adf788bc812b8ae9b6c1e2e69989d37 new file mode 100644 index 00000000..04a05cde --- /dev/null +++ b/.git-rewrite/map/02541eb80adf788bc812b8ae9b6c1e2e69989d37 @@ -0,0 +1 @@ +e3d4b3cbd5279c3ca2429efb49a6c5a89a1c1024 diff --git a/.git-rewrite/map/03c0e2534b0648595a042c8b73fb6dec629cda38 b/.git-rewrite/map/03c0e2534b0648595a042c8b73fb6dec629cda38 new file mode 100644 index 00000000..a4de4f0b --- /dev/null +++ b/.git-rewrite/map/03c0e2534b0648595a042c8b73fb6dec629cda38 @@ -0,0 +1 @@ +56af6c612f6c8aac69d967d2c075a90b48d231e5 diff --git a/.git-rewrite/map/072bdfeabeed7903a9b4479db53684fd99365c84 b/.git-rewrite/map/072bdfeabeed7903a9b4479db53684fd99365c84 new file mode 100644 index 00000000..0d0e4073 --- /dev/null +++ b/.git-rewrite/map/072bdfeabeed7903a9b4479db53684fd99365c84 @@ -0,0 +1 @@ +0fd094dafbe79bf7fd850c08b59d44861ddb899d diff --git a/.git-rewrite/map/0750cb9b6528ec41896d72d0a92510c842057517 b/.git-rewrite/map/0750cb9b6528ec41896d72d0a92510c842057517 new file mode 100644 index 00000000..dbf0401c --- /dev/null +++ b/.git-rewrite/map/0750cb9b6528ec41896d72d0a92510c842057517 @@ -0,0 +1 @@ +cefac9051e72910ca3bb244e8b44097396e2ae19 diff --git a/.git-rewrite/map/07c02ae86c65eb17e9263382dfc6433012edb1fb b/.git-rewrite/map/07c02ae86c65eb17e9263382dfc6433012edb1fb new file mode 100644 index 00000000..6cfc9997 --- /dev/null +++ b/.git-rewrite/map/07c02ae86c65eb17e9263382dfc6433012edb1fb @@ -0,0 +1 @@ +8a7532a77ba937593de84a125153ab5f0c56fdb7 diff --git a/.git-rewrite/map/08acb6eec4af8a73caf06f336dc49612da46d979 b/.git-rewrite/map/08acb6eec4af8a73caf06f336dc49612da46d979 new file mode 100644 index 00000000..c30fee14 --- /dev/null +++ b/.git-rewrite/map/08acb6eec4af8a73caf06f336dc49612da46d979 @@ -0,0 +1 @@ +a25777a31ca4ed0ef1731b74b8ba47462c759379 diff --git a/.git-rewrite/map/0bed0c0271b9aaaf561bed939292bec6a35c7604 b/.git-rewrite/map/0bed0c0271b9aaaf561bed939292bec6a35c7604 new file mode 100644 index 00000000..c41ddc1c --- /dev/null +++ b/.git-rewrite/map/0bed0c0271b9aaaf561bed939292bec6a35c7604 @@ -0,0 +1 @@ +0bed0c0271b9aaaf561bed939292bec6a35c7604 diff --git a/.git-rewrite/map/0d6e756cd92955c289e3c5c4e6e661e229233b95 b/.git-rewrite/map/0d6e756cd92955c289e3c5c4e6e661e229233b95 new file mode 100644 index 00000000..d820aba9 --- /dev/null +++ b/.git-rewrite/map/0d6e756cd92955c289e3c5c4e6e661e229233b95 @@ -0,0 +1 @@ +8ec80a35c350366815f8a15c6ebd5132b992ea0e diff --git a/.git-rewrite/map/0dc33fc41493aaebca528bbea79f707ed803a957 b/.git-rewrite/map/0dc33fc41493aaebca528bbea79f707ed803a957 new file mode 100644 index 00000000..ddc206d7 --- /dev/null +++ b/.git-rewrite/map/0dc33fc41493aaebca528bbea79f707ed803a957 @@ -0,0 +1 @@ +b59f0ee419da01ea5b1cf422928de01f83cd04ed diff --git a/.git-rewrite/map/0e336fba0076760fa149084ede35fb24539adb08 b/.git-rewrite/map/0e336fba0076760fa149084ede35fb24539adb08 new file mode 100644 index 00000000..304861cd --- /dev/null +++ b/.git-rewrite/map/0e336fba0076760fa149084ede35fb24539adb08 @@ -0,0 +1 @@ +eaf97401c74d284ac14b08d5b2d052716fe25822 diff --git a/.git-rewrite/map/0e7426a761b53269114e292c453ce40f66bbf1fd b/.git-rewrite/map/0e7426a761b53269114e292c453ce40f66bbf1fd new file mode 100644 index 00000000..43924d48 --- /dev/null +++ b/.git-rewrite/map/0e7426a761b53269114e292c453ce40f66bbf1fd @@ -0,0 +1 @@ +65ce7a5f8c62eb26444aa3cc31de98db2fc39cef diff --git a/.git-rewrite/map/10c81f24036fcd4e38d412a70c5c29e1b713e383 b/.git-rewrite/map/10c81f24036fcd4e38d412a70c5c29e1b713e383 new file mode 100644 index 00000000..35c0824f --- /dev/null +++ b/.git-rewrite/map/10c81f24036fcd4e38d412a70c5c29e1b713e383 @@ -0,0 +1 @@ +0abdd9dbcf76bc3df2f2ed521ac408e7cc5ccfe7 diff --git a/.git-rewrite/map/1133322ea07965f965b93de0057e2b55b201d02d b/.git-rewrite/map/1133322ea07965f965b93de0057e2b55b201d02d new file mode 100644 index 00000000..75848262 --- /dev/null +++ b/.git-rewrite/map/1133322ea07965f965b93de0057e2b55b201d02d @@ -0,0 +1 @@ +bd1a3cb5703a54b90aff745cc9b1ada7f29f246b diff --git a/.git-rewrite/map/1180a1f15d03074668aebddbb9c88bb4818ecde5 b/.git-rewrite/map/1180a1f15d03074668aebddbb9c88bb4818ecde5 new file mode 100644 index 00000000..06a1e0fc --- /dev/null +++ b/.git-rewrite/map/1180a1f15d03074668aebddbb9c88bb4818ecde5 @@ -0,0 +1 @@ +5fe4891f19f3f966d9f692392209e66458128484 diff --git a/.git-rewrite/map/11bb20794ecfd9dd3594f04da9a8fe2e4f1e229d b/.git-rewrite/map/11bb20794ecfd9dd3594f04da9a8fe2e4f1e229d new file mode 100644 index 00000000..7b1ae0d0 --- /dev/null +++ b/.git-rewrite/map/11bb20794ecfd9dd3594f04da9a8fe2e4f1e229d @@ -0,0 +1 @@ +832b2e59537b8b38099d2cd869f11935b983d149 diff --git a/.git-rewrite/map/13159378e53b07dd42b16fa932726816baa91ebb b/.git-rewrite/map/13159378e53b07dd42b16fa932726816baa91ebb new file mode 100644 index 00000000..6abb802f --- /dev/null +++ b/.git-rewrite/map/13159378e53b07dd42b16fa932726816baa91ebb @@ -0,0 +1 @@ +7ca298058aa81517f5122ae50c2681efd36230c8 diff --git a/.git-rewrite/map/1331ff5ba8d16c98328d78a4b2b9170928bfb2ee b/.git-rewrite/map/1331ff5ba8d16c98328d78a4b2b9170928bfb2ee new file mode 100644 index 00000000..b17400ea --- /dev/null +++ b/.git-rewrite/map/1331ff5ba8d16c98328d78a4b2b9170928bfb2ee @@ -0,0 +1 @@ +621bf7cc3da29005354354c9038106cec44eb70b diff --git a/.git-rewrite/map/1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd b/.git-rewrite/map/1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd new file mode 100644 index 00000000..108925dd --- /dev/null +++ b/.git-rewrite/map/1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd @@ -0,0 +1 @@ +1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd diff --git a/.git-rewrite/map/155615f6aeb5ed7212359862c10943def877cfb5 b/.git-rewrite/map/155615f6aeb5ed7212359862c10943def877cfb5 new file mode 100644 index 00000000..3f06b66d --- /dev/null +++ b/.git-rewrite/map/155615f6aeb5ed7212359862c10943def877cfb5 @@ -0,0 +1 @@ +3ebb30221b7f7fca8fa177549b67ce560412a393 diff --git a/.git-rewrite/map/1631220b638900e746fbab075acf16074c33e581 b/.git-rewrite/map/1631220b638900e746fbab075acf16074c33e581 new file mode 100644 index 00000000..28c1327f --- /dev/null +++ b/.git-rewrite/map/1631220b638900e746fbab075acf16074c33e581 @@ -0,0 +1 @@ +c42e3560a207690798fbba353ccfa37a680f97ac diff --git a/.git-rewrite/map/163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 b/.git-rewrite/map/163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 new file mode 100644 index 00000000..8c595af0 --- /dev/null +++ b/.git-rewrite/map/163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 @@ -0,0 +1 @@ +3b040f158741931fdb9bcba60e329383dbd3d4be diff --git a/.git-rewrite/map/1743d9c08888c70c0f0daa6ce0a6049ede2a3098 b/.git-rewrite/map/1743d9c08888c70c0f0daa6ce0a6049ede2a3098 new file mode 100644 index 00000000..aa6b0647 --- /dev/null +++ b/.git-rewrite/map/1743d9c08888c70c0f0daa6ce0a6049ede2a3098 @@ -0,0 +1 @@ +19cfe70df94bae28aca27b334a2b175e65115794 diff --git a/.git-rewrite/map/1a8caeb7229830496ea94224811840be16af4786 b/.git-rewrite/map/1a8caeb7229830496ea94224811840be16af4786 new file mode 100644 index 00000000..db019d54 --- /dev/null +++ b/.git-rewrite/map/1a8caeb7229830496ea94224811840be16af4786 @@ -0,0 +1 @@ +0e1b3c2c31fcdf3b37a102ede342adccce950780 diff --git a/.git-rewrite/map/1bff2de6de48b5f82d39008c68a6e82d882ff8ec b/.git-rewrite/map/1bff2de6de48b5f82d39008c68a6e82d882ff8ec new file mode 100644 index 00000000..509b7114 --- /dev/null +++ b/.git-rewrite/map/1bff2de6de48b5f82d39008c68a6e82d882ff8ec @@ -0,0 +1 @@ +8754b92ed3a67bcee55044a30fcb8bf1a3f3b298 diff --git a/.git-rewrite/map/1e288a3ffd766c80e385c0cea3af9601d71d0c0e b/.git-rewrite/map/1e288a3ffd766c80e385c0cea3af9601d71d0c0e new file mode 100644 index 00000000..ab196abc --- /dev/null +++ b/.git-rewrite/map/1e288a3ffd766c80e385c0cea3af9601d71d0c0e @@ -0,0 +1 @@ +d5fae25dc905bf7e9ca2b8c0e063b44540e61925 diff --git a/.git-rewrite/map/1ea311c63cf2498df5ca8705a283e79c84a6013a b/.git-rewrite/map/1ea311c63cf2498df5ca8705a283e79c84a6013a new file mode 100644 index 00000000..49b146f6 --- /dev/null +++ b/.git-rewrite/map/1ea311c63cf2498df5ca8705a283e79c84a6013a @@ -0,0 +1 @@ +209146244130258ae0939ccf05ab2e3549f04586 diff --git a/.git-rewrite/map/1f1f8e8d5bb929087f80976490e5235d0867ccec b/.git-rewrite/map/1f1f8e8d5bb929087f80976490e5235d0867ccec new file mode 100644 index 00000000..6abb802f --- /dev/null +++ b/.git-rewrite/map/1f1f8e8d5bb929087f80976490e5235d0867ccec @@ -0,0 +1 @@ +7ca298058aa81517f5122ae50c2681efd36230c8 diff --git a/.git-rewrite/map/2084cba35cc5d4cf15a79a2e850c899003427ae1 b/.git-rewrite/map/2084cba35cc5d4cf15a79a2e850c899003427ae1 new file mode 100644 index 00000000..0d0e4073 --- /dev/null +++ b/.git-rewrite/map/2084cba35cc5d4cf15a79a2e850c899003427ae1 @@ -0,0 +1 @@ +0fd094dafbe79bf7fd850c08b59d44861ddb899d diff --git a/.git-rewrite/map/2192f3615d3b5bf35ff7c2f405fa55de10ac7f0f b/.git-rewrite/map/2192f3615d3b5bf35ff7c2f405fa55de10ac7f0f new file mode 100644 index 00000000..2e1f5283 --- /dev/null +++ b/.git-rewrite/map/2192f3615d3b5bf35ff7c2f405fa55de10ac7f0f @@ -0,0 +1 @@ +53a4c9adecbe3d5e779ab9baec63ff1206b3c6ae diff --git a/.git-rewrite/map/224a64479eb43dfd7c1e0fbe79ed0dbbf1304c00 b/.git-rewrite/map/224a64479eb43dfd7c1e0fbe79ed0dbbf1304c00 new file mode 100644 index 00000000..bd32ab4c --- /dev/null +++ b/.git-rewrite/map/224a64479eb43dfd7c1e0fbe79ed0dbbf1304c00 @@ -0,0 +1 @@ +7ecce091408f6a6d78f1fe0618a80cdea03f22f6 diff --git a/.git-rewrite/map/245f9b394d7c1cccd344297a87455583af08f49c b/.git-rewrite/map/245f9b394d7c1cccd344297a87455583af08f49c new file mode 100644 index 00000000..290684a2 --- /dev/null +++ b/.git-rewrite/map/245f9b394d7c1cccd344297a87455583af08f49c @@ -0,0 +1 @@ +cfe550ac014bab483a1b10412f94714c3c0b8dac diff --git a/.git-rewrite/map/2a58af0b49dfbe04e710c768bcbb437d6efbbae1 b/.git-rewrite/map/2a58af0b49dfbe04e710c768bcbb437d6efbbae1 new file mode 100644 index 00000000..17c46eaf --- /dev/null +++ b/.git-rewrite/map/2a58af0b49dfbe04e710c768bcbb437d6efbbae1 @@ -0,0 +1 @@ +73a12dfb56fd664df08af5ff73131d47879bace2 diff --git a/.git-rewrite/map/2b4eb4d1dfa4bf5f19f14069ee7c243225148299 b/.git-rewrite/map/2b4eb4d1dfa4bf5f19f14069ee7c243225148299 new file mode 100644 index 00000000..a5d8c144 --- /dev/null +++ b/.git-rewrite/map/2b4eb4d1dfa4bf5f19f14069ee7c243225148299 @@ -0,0 +1 @@ +721bea5068a14cc0617d8e6170850daf8ffb6a5c diff --git a/.git-rewrite/map/2b6147676f07b8aca5a1e92ade205e150f5ad874 b/.git-rewrite/map/2b6147676f07b8aca5a1e92ade205e150f5ad874 new file mode 100644 index 00000000..b2b01e01 --- /dev/null +++ b/.git-rewrite/map/2b6147676f07b8aca5a1e92ade205e150f5ad874 @@ -0,0 +1 @@ +f4f0473ccf255d1587110a6b0482b9b98bcd57c3 diff --git a/.git-rewrite/map/2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d b/.git-rewrite/map/2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d new file mode 100644 index 00000000..fa6e2022 --- /dev/null +++ b/.git-rewrite/map/2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d @@ -0,0 +1 @@ +2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d diff --git a/.git-rewrite/map/2ccb8aa04a1762b2bdb0bb04f1a09ba2355cd459 b/.git-rewrite/map/2ccb8aa04a1762b2bdb0bb04f1a09ba2355cd459 new file mode 100644 index 00000000..8594ea89 --- /dev/null +++ b/.git-rewrite/map/2ccb8aa04a1762b2bdb0bb04f1a09ba2355cd459 @@ -0,0 +1 @@ +7ceaae957a9d6f31c99e3759d0f8385f4309ef7c diff --git a/.git-rewrite/map/2d348a52b69e3e5521499b0e840e8cfc596d0139 b/.git-rewrite/map/2d348a52b69e3e5521499b0e840e8cfc596d0139 new file mode 100644 index 00000000..1b05ee06 --- /dev/null +++ b/.git-rewrite/map/2d348a52b69e3e5521499b0e840e8cfc596d0139 @@ -0,0 +1 @@ +df785daa79ec2ec62c9e1020a3cc76508ef280ee diff --git a/.git-rewrite/map/2d8066a06a68e57eb62255dd1ec526bbc6cd35ad b/.git-rewrite/map/2d8066a06a68e57eb62255dd1ec526bbc6cd35ad new file mode 100644 index 00000000..e4819198 --- /dev/null +++ b/.git-rewrite/map/2d8066a06a68e57eb62255dd1ec526bbc6cd35ad @@ -0,0 +1 @@ +1bcd425edba019608e25c26764af25ec43489474 diff --git a/.git-rewrite/map/2d8497612572689ed3ee7ddb4f7ea38d96aca39f b/.git-rewrite/map/2d8497612572689ed3ee7ddb4f7ea38d96aca39f new file mode 100644 index 00000000..140882d1 --- /dev/null +++ b/.git-rewrite/map/2d8497612572689ed3ee7ddb4f7ea38d96aca39f @@ -0,0 +1 @@ +9adb34ff5893664dd524b94b972b4a16bdba2b7f diff --git a/.git-rewrite/map/2e7bfb976752080319478ee29d170308a9a0d1c2 b/.git-rewrite/map/2e7bfb976752080319478ee29d170308a9a0d1c2 new file mode 100644 index 00000000..eeb5a672 --- /dev/null +++ b/.git-rewrite/map/2e7bfb976752080319478ee29d170308a9a0d1c2 @@ -0,0 +1 @@ +5820d02ef70730dfa6a31b44558cfe9f02bd17b1 diff --git a/.git-rewrite/map/31b19ade36889fa901af831ba3ee3e9763a26e92 b/.git-rewrite/map/31b19ade36889fa901af831ba3ee3e9763a26e92 new file mode 100644 index 00000000..932e2639 --- /dev/null +++ b/.git-rewrite/map/31b19ade36889fa901af831ba3ee3e9763a26e92 @@ -0,0 +1 @@ +e3be02db47fc9369855cb69ce5b73d31f30b5449 diff --git a/.git-rewrite/map/3272b5c5a771cd4b5a4eaf4c568edeab548b2cdd b/.git-rewrite/map/3272b5c5a771cd4b5a4eaf4c568edeab548b2cdd new file mode 100644 index 00000000..7c27b4a6 --- /dev/null +++ b/.git-rewrite/map/3272b5c5a771cd4b5a4eaf4c568edeab548b2cdd @@ -0,0 +1 @@ +525747d2b30efe72426dcd1c97dcc5053ae5c32c diff --git a/.git-rewrite/map/34a155e77e711c819497f243a3fdcb4e8980b257 b/.git-rewrite/map/34a155e77e711c819497f243a3fdcb4e8980b257 new file mode 100644 index 00000000..ea7b47b7 --- /dev/null +++ b/.git-rewrite/map/34a155e77e711c819497f243a3fdcb4e8980b257 @@ -0,0 +1 @@ +53b8dc878fae149bcb775b12abb999cdde07e98c diff --git a/.git-rewrite/map/36f7ff5dd5e08c3afa4cce7ef0c0fc65ee052cfa b/.git-rewrite/map/36f7ff5dd5e08c3afa4cce7ef0c0fc65ee052cfa new file mode 100644 index 00000000..4b9cb9bd --- /dev/null +++ b/.git-rewrite/map/36f7ff5dd5e08c3afa4cce7ef0c0fc65ee052cfa @@ -0,0 +1 @@ +794e5eca91a64afec1f7719279c9d06829bb6b18 diff --git a/.git-rewrite/map/3858fd3d2f912fbcacbc0e296b9191d7a76ea11c b/.git-rewrite/map/3858fd3d2f912fbcacbc0e296b9191d7a76ea11c new file mode 100644 index 00000000..a58f392e --- /dev/null +++ b/.git-rewrite/map/3858fd3d2f912fbcacbc0e296b9191d7a76ea11c @@ -0,0 +1 @@ +9b25330d94aeda86b3ebf2cd6ae3213c35851753 diff --git a/.git-rewrite/map/39045ddb7b7c6a36a86c64bbee61afd6a4f98479 b/.git-rewrite/map/39045ddb7b7c6a36a86c64bbee61afd6a4f98479 new file mode 100644 index 00000000..237892a2 --- /dev/null +++ b/.git-rewrite/map/39045ddb7b7c6a36a86c64bbee61afd6a4f98479 @@ -0,0 +1 @@ +4c7f000caee2fafa5e94f7744adab629eeffbdbb diff --git a/.git-rewrite/map/39d33e8d52919d533cc61683df41aebda9f0e9d7 b/.git-rewrite/map/39d33e8d52919d533cc61683df41aebda9f0e9d7 new file mode 100644 index 00000000..4e0c4f77 --- /dev/null +++ b/.git-rewrite/map/39d33e8d52919d533cc61683df41aebda9f0e9d7 @@ -0,0 +1 @@ +af3ad5e5e27dc81cc1537cec37cdc1b6bbd6bc0b diff --git a/.git-rewrite/map/3ab98e167ff6b02ae4986684f691f213605486c7 b/.git-rewrite/map/3ab98e167ff6b02ae4986684f691f213605486c7 new file mode 100644 index 00000000..092df69d --- /dev/null +++ b/.git-rewrite/map/3ab98e167ff6b02ae4986684f691f213605486c7 @@ -0,0 +1 @@ +4548d5acbd6fb1a5cee8c04e9b2316f17ee139fd diff --git a/.git-rewrite/map/3cb53057600e4b54bae176a9bfb0bb1debcafba8 b/.git-rewrite/map/3cb53057600e4b54bae176a9bfb0bb1debcafba8 new file mode 100644 index 00000000..2d88c83c --- /dev/null +++ b/.git-rewrite/map/3cb53057600e4b54bae176a9bfb0bb1debcafba8 @@ -0,0 +1 @@ +3d04c7766d1934dbe66260dc22af45e97eba5a08 diff --git a/.git-rewrite/map/3d0a59ef78f3931d78fd94ab021f40e88708bd65 b/.git-rewrite/map/3d0a59ef78f3931d78fd94ab021f40e88708bd65 new file mode 100644 index 00000000..7374d4a5 --- /dev/null +++ b/.git-rewrite/map/3d0a59ef78f3931d78fd94ab021f40e88708bd65 @@ -0,0 +1 @@ +db9bcd3b45619dfaf6a18a2d17a3103e449e6967 diff --git a/.git-rewrite/map/40e4eecc9781997e9d844cda96c7afce652355d1 b/.git-rewrite/map/40e4eecc9781997e9d844cda96c7afce652355d1 new file mode 100644 index 00000000..3ac71577 --- /dev/null +++ b/.git-rewrite/map/40e4eecc9781997e9d844cda96c7afce652355d1 @@ -0,0 +1 @@ +2d3b6adf0925bcc2666741697a1f28766d15207e diff --git a/.git-rewrite/map/4111324face5d6e8f0e3c880c9999b8a0e00a4ed b/.git-rewrite/map/4111324face5d6e8f0e3c880c9999b8a0e00a4ed new file mode 100644 index 00000000..d87e8b5e --- /dev/null +++ b/.git-rewrite/map/4111324face5d6e8f0e3c880c9999b8a0e00a4ed @@ -0,0 +1 @@ +535003118d63005c7462b2ac77e87951b0f75283 diff --git a/.git-rewrite/map/4347473b8bf57cab3ad359a07bd16173f27cfc7f b/.git-rewrite/map/4347473b8bf57cab3ad359a07bd16173f27cfc7f new file mode 100644 index 00000000..0d407530 --- /dev/null +++ b/.git-rewrite/map/4347473b8bf57cab3ad359a07bd16173f27cfc7f @@ -0,0 +1 @@ +ecda4da54a028040c6bdf652f8ea878fe57de101 diff --git a/.git-rewrite/map/4358a8419c78c6168e51d755a27153fefbbe6743 b/.git-rewrite/map/4358a8419c78c6168e51d755a27153fefbbe6743 new file mode 100644 index 00000000..45a8dbe4 --- /dev/null +++ b/.git-rewrite/map/4358a8419c78c6168e51d755a27153fefbbe6743 @@ -0,0 +1 @@ +697223c8cf60ad70d0551dd6b7c8685f24632b46 diff --git a/.git-rewrite/map/4452cd716894c1d7e9980a98a17f473cb1afb71b b/.git-rewrite/map/4452cd716894c1d7e9980a98a17f473cb1afb71b new file mode 100644 index 00000000..db054e11 --- /dev/null +++ b/.git-rewrite/map/4452cd716894c1d7e9980a98a17f473cb1afb71b @@ -0,0 +1 @@ +861201cab4d0055b5b482a5ccdf3764b1a153844 diff --git a/.git-rewrite/map/481002c30034ea2e6b9d48bc2a7652ee95687211 b/.git-rewrite/map/481002c30034ea2e6b9d48bc2a7652ee95687211 new file mode 100644 index 00000000..7595fcef --- /dev/null +++ b/.git-rewrite/map/481002c30034ea2e6b9d48bc2a7652ee95687211 @@ -0,0 +1 @@ +0f0edeeb9c26cf7c16a4d4cf5201b1abb18ba80d diff --git a/.git-rewrite/map/49940d046f7655cc468b474dd91cf084e9d6833d b/.git-rewrite/map/49940d046f7655cc468b474dd91cf084e9d6833d new file mode 100644 index 00000000..c9c5896b --- /dev/null +++ b/.git-rewrite/map/49940d046f7655cc468b474dd91cf084e9d6833d @@ -0,0 +1 @@ +bf51d3c71b27d72e586a049ae1c1ab49df72066b diff --git a/.git-rewrite/map/4be186ff751a2885a954ee0a8bd01383b2359f42 b/.git-rewrite/map/4be186ff751a2885a954ee0a8bd01383b2359f42 new file mode 100644 index 00000000..bf8ee0e6 --- /dev/null +++ b/.git-rewrite/map/4be186ff751a2885a954ee0a8bd01383b2359f42 @@ -0,0 +1 @@ +42379a3694ef5d4c5a79f236d9ef6799f05c87df diff --git a/.git-rewrite/map/4c5bf28cb47c6858c0b5c7e23b3c9b6e8976f245 b/.git-rewrite/map/4c5bf28cb47c6858c0b5c7e23b3c9b6e8976f245 new file mode 100644 index 00000000..58f7c910 --- /dev/null +++ b/.git-rewrite/map/4c5bf28cb47c6858c0b5c7e23b3c9b6e8976f245 @@ -0,0 +1 @@ +654e6692b0b629ef291efaeaf9c72d56fee006b8 diff --git a/.git-rewrite/map/4f54277ca087f9e45fce823269f55512c2cb085d b/.git-rewrite/map/4f54277ca087f9e45fce823269f55512c2cb085d new file mode 100644 index 00000000..2c3e44a1 --- /dev/null +++ b/.git-rewrite/map/4f54277ca087f9e45fce823269f55512c2cb085d @@ -0,0 +1 @@ +99858ecfaa387e22a362dfbebd718f9129c10c31 diff --git a/.git-rewrite/map/50a131f78bd97cf0720fd166549a018933c980c2 b/.git-rewrite/map/50a131f78bd97cf0720fd166549a018933c980c2 new file mode 100644 index 00000000..d4675a37 --- /dev/null +++ b/.git-rewrite/map/50a131f78bd97cf0720fd166549a018933c980c2 @@ -0,0 +1 @@ +80c911d3c81e4549c9e2a9b0790d245783ef38bc diff --git a/.git-rewrite/map/50ddf625f87f78ff2504b6c109081f21a031196f b/.git-rewrite/map/50ddf625f87f78ff2504b6c109081f21a031196f new file mode 100644 index 00000000..08a628f0 --- /dev/null +++ b/.git-rewrite/map/50ddf625f87f78ff2504b6c109081f21a031196f @@ -0,0 +1 @@ +f6bd6ef39b39e11c89feab787bb968973df2dc28 diff --git a/.git-rewrite/map/535ed8a7dde343f92c309203cdbee1f629f029c1 b/.git-rewrite/map/535ed8a7dde343f92c309203cdbee1f629f029c1 new file mode 100644 index 00000000..bf8ee0e6 --- /dev/null +++ b/.git-rewrite/map/535ed8a7dde343f92c309203cdbee1f629f029c1 @@ -0,0 +1 @@ +42379a3694ef5d4c5a79f236d9ef6799f05c87df diff --git a/.git-rewrite/map/5591ea8c209eb74952889fc39708df9fec00f4e9 b/.git-rewrite/map/5591ea8c209eb74952889fc39708df9fec00f4e9 new file mode 100644 index 00000000..38d707b1 --- /dev/null +++ b/.git-rewrite/map/5591ea8c209eb74952889fc39708df9fec00f4e9 @@ -0,0 +1 @@ +5591ea8c209eb74952889fc39708df9fec00f4e9 diff --git a/.git-rewrite/map/566bfe678537dec2572e6b68cf7684267ae20aed b/.git-rewrite/map/566bfe678537dec2572e6b68cf7684267ae20aed new file mode 100644 index 00000000..02596b0e --- /dev/null +++ b/.git-rewrite/map/566bfe678537dec2572e6b68cf7684267ae20aed @@ -0,0 +1 @@ +6abcf94d6f20976646999b85842a841aad9f653c diff --git a/.git-rewrite/map/5a1b93a244c8895bd63119df1626fe87b5aa5abd b/.git-rewrite/map/5a1b93a244c8895bd63119df1626fe87b5aa5abd new file mode 100644 index 00000000..35c0824f --- /dev/null +++ b/.git-rewrite/map/5a1b93a244c8895bd63119df1626fe87b5aa5abd @@ -0,0 +1 @@ +0abdd9dbcf76bc3df2f2ed521ac408e7cc5ccfe7 diff --git a/.git-rewrite/map/5b8b22869c263fa6c7c597bc273f36eb47cac013 b/.git-rewrite/map/5b8b22869c263fa6c7c597bc273f36eb47cac013 new file mode 100644 index 00000000..785047bb --- /dev/null +++ b/.git-rewrite/map/5b8b22869c263fa6c7c597bc273f36eb47cac013 @@ -0,0 +1 @@ +85a5ce053d1a9fa3221b7778c90786c89f5bf9db diff --git a/.git-rewrite/map/5ce21ddbdb850d9a590f6bef1d327f31055dcb8e b/.git-rewrite/map/5ce21ddbdb850d9a590f6bef1d327f31055dcb8e new file mode 100644 index 00000000..d9e6074a --- /dev/null +++ b/.git-rewrite/map/5ce21ddbdb850d9a590f6bef1d327f31055dcb8e @@ -0,0 +1 @@ +2f3b453fcb6bfb75021a418c6a001a1c002ff05f diff --git a/.git-rewrite/map/5d3441870b58f09f8c686fa1cc1be3145c95856b b/.git-rewrite/map/5d3441870b58f09f8c686fa1cc1be3145c95856b new file mode 100644 index 00000000..08a41a54 --- /dev/null +++ b/.git-rewrite/map/5d3441870b58f09f8c686fa1cc1be3145c95856b @@ -0,0 +1 @@ +8892b0c006a543fc8482829958eb63c7a9505b67 diff --git a/.git-rewrite/map/5d4bae2402bf312b8059491df8f39a652d67d879 b/.git-rewrite/map/5d4bae2402bf312b8059491df8f39a652d67d879 new file mode 100644 index 00000000..071a58cd --- /dev/null +++ b/.git-rewrite/map/5d4bae2402bf312b8059491df8f39a652d67d879 @@ -0,0 +1 @@ +5d4bae2402bf312b8059491df8f39a652d67d879 diff --git a/.git-rewrite/map/5d8e1575ea250a4b92a7c75dbc5b6cc99b60c3dc b/.git-rewrite/map/5d8e1575ea250a4b92a7c75dbc5b6cc99b60c3dc new file mode 100644 index 00000000..06ccbf78 --- /dev/null +++ b/.git-rewrite/map/5d8e1575ea250a4b92a7c75dbc5b6cc99b60c3dc @@ -0,0 +1 @@ +7d1cdb293525257040f3426605b16957c4db9338 diff --git a/.git-rewrite/map/5e5086faaa76717951ea3c0daf323975b1630b16 b/.git-rewrite/map/5e5086faaa76717951ea3c0daf323975b1630b16 new file mode 100644 index 00000000..489c003f --- /dev/null +++ b/.git-rewrite/map/5e5086faaa76717951ea3c0daf323975b1630b16 @@ -0,0 +1 @@ +0c786a8ac6930799f5d8761072dcde41a3595b15 diff --git a/.git-rewrite/map/5e7d6c1f1effc7c24c35b28230d0149a733da96a b/.git-rewrite/map/5e7d6c1f1effc7c24c35b28230d0149a733da96a new file mode 100644 index 00000000..a76b3c70 --- /dev/null +++ b/.git-rewrite/map/5e7d6c1f1effc7c24c35b28230d0149a733da96a @@ -0,0 +1 @@ +d1c82cfb281d92e76eee6c07194d5abb215789e1 diff --git a/.git-rewrite/map/5ec1d965dc1bc9bcd2b4e806365ee8d502af6da8 b/.git-rewrite/map/5ec1d965dc1bc9bcd2b4e806365ee8d502af6da8 new file mode 100644 index 00000000..1fbfe201 --- /dev/null +++ b/.git-rewrite/map/5ec1d965dc1bc9bcd2b4e806365ee8d502af6da8 @@ -0,0 +1 @@ +bbd444230aee3e479378b3ab0d0b3b8c34c121b0 diff --git a/.git-rewrite/map/6105ab72e26e1a45ac306f07083a575da7a409db b/.git-rewrite/map/6105ab72e26e1a45ac306f07083a575da7a409db new file mode 100644 index 00000000..628c4e56 --- /dev/null +++ b/.git-rewrite/map/6105ab72e26e1a45ac306f07083a575da7a409db @@ -0,0 +1 @@ +3082c77ecdada93e283b075b48f98f10c9f37a6c diff --git a/.git-rewrite/map/631819c1b4bc07b12733b7c93b6a50a1d581aceb b/.git-rewrite/map/631819c1b4bc07b12733b7c93b6a50a1d581aceb new file mode 100644 index 00000000..d006d8ba --- /dev/null +++ b/.git-rewrite/map/631819c1b4bc07b12733b7c93b6a50a1d581aceb @@ -0,0 +1 @@ +dd123cd3f94b18abde11f8549ed195945616689b diff --git a/.git-rewrite/map/6562400997d0513c5b904124c76585fd8bb0caa0 b/.git-rewrite/map/6562400997d0513c5b904124c76585fd8bb0caa0 new file mode 100644 index 00000000..142624a3 --- /dev/null +++ b/.git-rewrite/map/6562400997d0513c5b904124c76585fd8bb0caa0 @@ -0,0 +1 @@ +2c485c94441be73b258b54935d64054f1ad661b7 diff --git a/.git-rewrite/map/6592a445e102f682fad63683886dd9e4b6d0501d b/.git-rewrite/map/6592a445e102f682fad63683886dd9e4b6d0501d new file mode 100644 index 00000000..da87e1b4 --- /dev/null +++ b/.git-rewrite/map/6592a445e102f682fad63683886dd9e4b6d0501d @@ -0,0 +1 @@ +06694296a76b2f17bfdeb096f859da0660687101 diff --git a/.git-rewrite/map/68062f001d4a6e95a220e7bf4b67a9be64d536bf b/.git-rewrite/map/68062f001d4a6e95a220e7bf4b67a9be64d536bf new file mode 100644 index 00000000..7f7ae126 --- /dev/null +++ b/.git-rewrite/map/68062f001d4a6e95a220e7bf4b67a9be64d536bf @@ -0,0 +1 @@ +517088928597fe9f99cc4d7c970ca1ad351d6aa8 diff --git a/.git-rewrite/map/68b4bc3916353c2fd4ca245dfe843020ce70c36c b/.git-rewrite/map/68b4bc3916353c2fd4ca245dfe843020ce70c36c new file mode 100644 index 00000000..b80a74d8 --- /dev/null +++ b/.git-rewrite/map/68b4bc3916353c2fd4ca245dfe843020ce70c36c @@ -0,0 +1 @@ +430a09248455d3c66975b1593b151e0028020857 diff --git a/.git-rewrite/map/69bc787c6c181557be0a47b3cdcf98855bc796ac b/.git-rewrite/map/69bc787c6c181557be0a47b3cdcf98855bc796ac new file mode 100644 index 00000000..5420cd94 --- /dev/null +++ b/.git-rewrite/map/69bc787c6c181557be0a47b3cdcf98855bc796ac @@ -0,0 +1 @@ +19d4d0632fcd76b2b152a8b13f009a9c1b1253e8 diff --git a/.git-rewrite/map/6bf57dbfe70a05eb1bb24f160049e08987debf76 b/.git-rewrite/map/6bf57dbfe70a05eb1bb24f160049e08987debf76 new file mode 100644 index 00000000..d5f9772a --- /dev/null +++ b/.git-rewrite/map/6bf57dbfe70a05eb1bb24f160049e08987debf76 @@ -0,0 +1 @@ +83d8fecd91128e8eec1b956a2b6da080da3da415 diff --git a/.git-rewrite/map/6f916855c89182c901d4f40addc39cb3911113e9 b/.git-rewrite/map/6f916855c89182c901d4f40addc39cb3911113e9 new file mode 100644 index 00000000..eb67ea72 --- /dev/null +++ b/.git-rewrite/map/6f916855c89182c901d4f40addc39cb3911113e9 @@ -0,0 +1 @@ +6f916855c89182c901d4f40addc39cb3911113e9 diff --git a/.git-rewrite/map/7035cea225353c5cc7ff7a6eaad0bb4ec178d5ae b/.git-rewrite/map/7035cea225353c5cc7ff7a6eaad0bb4ec178d5ae new file mode 100644 index 00000000..2b4c5b8a --- /dev/null +++ b/.git-rewrite/map/7035cea225353c5cc7ff7a6eaad0bb4ec178d5ae @@ -0,0 +1 @@ +6a2a4fe24a45fc70fa6dfe829ece74761c68d85b diff --git a/.git-rewrite/map/706d7a23f7b30d22b1a7c1620c5539fd4adb57c3 b/.git-rewrite/map/706d7a23f7b30d22b1a7c1620c5539fd4adb57c3 new file mode 100644 index 00000000..4b54cf81 --- /dev/null +++ b/.git-rewrite/map/706d7a23f7b30d22b1a7c1620c5539fd4adb57c3 @@ -0,0 +1 @@ +57b3f13e90659f953801e3e8d73003afe276b753 diff --git a/.git-rewrite/map/7095c66f289d49bbc5fef707f313ecb933220c15 b/.git-rewrite/map/7095c66f289d49bbc5fef707f313ecb933220c15 new file mode 100644 index 00000000..520a75ca --- /dev/null +++ b/.git-rewrite/map/7095c66f289d49bbc5fef707f313ecb933220c15 @@ -0,0 +1 @@ +b30bea1e7a365eed737a53c7ce50b47f3df304fa diff --git a/.git-rewrite/map/70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 b/.git-rewrite/map/70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 new file mode 100644 index 00000000..cc8001f7 --- /dev/null +++ b/.git-rewrite/map/70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 @@ -0,0 +1 @@ +014fac2b9bf5ad8a2a9e713f1305802a800ceafe diff --git a/.git-rewrite/map/7154f15a8aaab8db0282ff246fe2b1b241503681 b/.git-rewrite/map/7154f15a8aaab8db0282ff246fe2b1b241503681 new file mode 100644 index 00000000..9a666758 --- /dev/null +++ b/.git-rewrite/map/7154f15a8aaab8db0282ff246fe2b1b241503681 @@ -0,0 +1 @@ +ba568f7dfbb544f1916093ad46cb8f58b0d36f65 diff --git a/.git-rewrite/map/7396e83628365c7dec8bca70fa373e722a202f82 b/.git-rewrite/map/7396e83628365c7dec8bca70fa373e722a202f82 new file mode 100644 index 00000000..034e406d --- /dev/null +++ b/.git-rewrite/map/7396e83628365c7dec8bca70fa373e722a202f82 @@ -0,0 +1 @@ +2c559c2a8cf89ef63cfa866dba94c7d219cd9caf diff --git a/.git-rewrite/map/73d9f634e6a32ad4f57c3e8d4b97b3645346f841 b/.git-rewrite/map/73d9f634e6a32ad4f57c3e8d4b97b3645346f841 new file mode 100644 index 00000000..d4675a37 --- /dev/null +++ b/.git-rewrite/map/73d9f634e6a32ad4f57c3e8d4b97b3645346f841 @@ -0,0 +1 @@ +80c911d3c81e4549c9e2a9b0790d245783ef38bc diff --git a/.git-rewrite/map/74a872c594e53ec133b496d4aeea58f5868b3ef3 b/.git-rewrite/map/74a872c594e53ec133b496d4aeea58f5868b3ef3 new file mode 100644 index 00000000..20d10e08 --- /dev/null +++ b/.git-rewrite/map/74a872c594e53ec133b496d4aeea58f5868b3ef3 @@ -0,0 +1 @@ +ee4228af5a452349f74100adff41cbe27d8551e6 diff --git a/.git-rewrite/map/751e4375ae5ebb0476cb8d1a85309335af9acc77 b/.git-rewrite/map/751e4375ae5ebb0476cb8d1a85309335af9acc77 new file mode 100644 index 00000000..0e98e502 --- /dev/null +++ b/.git-rewrite/map/751e4375ae5ebb0476cb8d1a85309335af9acc77 @@ -0,0 +1 @@ +9c66e1477920fe3696155ee33d92f7587dcfb4d7 diff --git a/.git-rewrite/map/7553ab6b9fabd12689f03a74a73b811f32cd81b7 b/.git-rewrite/map/7553ab6b9fabd12689f03a74a73b811f32cd81b7 new file mode 100644 index 00000000..78db4d36 --- /dev/null +++ b/.git-rewrite/map/7553ab6b9fabd12689f03a74a73b811f32cd81b7 @@ -0,0 +1 @@ +a515bbd7c745ff19aae85ee8179e7445e4d683ac diff --git a/.git-rewrite/map/762391df13a488dceeb76581acd0a573de8ce676 b/.git-rewrite/map/762391df13a488dceeb76581acd0a573de8ce676 new file mode 100644 index 00000000..9272bcd3 --- /dev/null +++ b/.git-rewrite/map/762391df13a488dceeb76581acd0a573de8ce676 @@ -0,0 +1 @@ +f3ab3d11c4c9d252644d30b5d3068de20ca57cc4 diff --git a/.git-rewrite/map/767b0e8d2cedbff14c147431e17fd86b84d415b7 b/.git-rewrite/map/767b0e8d2cedbff14c147431e17fd86b84d415b7 new file mode 100644 index 00000000..7f7ae126 --- /dev/null +++ b/.git-rewrite/map/767b0e8d2cedbff14c147431e17fd86b84d415b7 @@ -0,0 +1 @@ +517088928597fe9f99cc4d7c970ca1ad351d6aa8 diff --git a/.git-rewrite/map/76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 b/.git-rewrite/map/76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 new file mode 100644 index 00000000..06a1e0fc --- /dev/null +++ b/.git-rewrite/map/76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 @@ -0,0 +1 @@ +5fe4891f19f3f966d9f692392209e66458128484 diff --git a/.git-rewrite/map/77ce732f6094eef8a1a4e052c106e049c4038a2e b/.git-rewrite/map/77ce732f6094eef8a1a4e052c106e049c4038a2e new file mode 100644 index 00000000..391e2f84 --- /dev/null +++ b/.git-rewrite/map/77ce732f6094eef8a1a4e052c106e049c4038a2e @@ -0,0 +1 @@ +3335f26812b0ac7e7b643bb425cae11dbf02720b diff --git a/.git-rewrite/map/77d2fe9cb7ba0921561540547441f907c60b70ba b/.git-rewrite/map/77d2fe9cb7ba0921561540547441f907c60b70ba new file mode 100644 index 00000000..e930a6b5 --- /dev/null +++ b/.git-rewrite/map/77d2fe9cb7ba0921561540547441f907c60b70ba @@ -0,0 +1 @@ +502fcfdcffd8471ef6733e1ae654f72e394cf517 diff --git a/.git-rewrite/map/783f78a614b38a0abfd3344964530dd3f3bdd438 b/.git-rewrite/map/783f78a614b38a0abfd3344964530dd3f3bdd438 new file mode 100644 index 00000000..4604e596 --- /dev/null +++ b/.git-rewrite/map/783f78a614b38a0abfd3344964530dd3f3bdd438 @@ -0,0 +1 @@ +f5f85ef175ba983ccc353a959aab7b1124ddc381 diff --git a/.git-rewrite/map/7a2b65274512af10affe1483359d39047d100098 b/.git-rewrite/map/7a2b65274512af10affe1483359d39047d100098 new file mode 100644 index 00000000..cbaa0e75 --- /dev/null +++ b/.git-rewrite/map/7a2b65274512af10affe1483359d39047d100098 @@ -0,0 +1 @@ +699979b5b12873fabb4cda600310022f9ba56cb9 diff --git a/.git-rewrite/map/7ba88ea26dbf45e007ae51b68a733b006dee3129 b/.git-rewrite/map/7ba88ea26dbf45e007ae51b68a733b006dee3129 new file mode 100644 index 00000000..e930a6b5 --- /dev/null +++ b/.git-rewrite/map/7ba88ea26dbf45e007ae51b68a733b006dee3129 @@ -0,0 +1 @@ +502fcfdcffd8471ef6733e1ae654f72e394cf517 diff --git a/.git-rewrite/map/7c0397decb84d7b744196c3910354654810ce650 b/.git-rewrite/map/7c0397decb84d7b744196c3910354654810ce650 new file mode 100644 index 00000000..c1bc36aa --- /dev/null +++ b/.git-rewrite/map/7c0397decb84d7b744196c3910354654810ce650 @@ -0,0 +1 @@ +494f413ddf76ffe7fec16d7fbe3815c4e7a91eda diff --git a/.git-rewrite/map/7cf894ffdbe500b0b004aa8056990ca9950831ad b/.git-rewrite/map/7cf894ffdbe500b0b004aa8056990ca9950831ad new file mode 100644 index 00000000..04141a3b --- /dev/null +++ b/.git-rewrite/map/7cf894ffdbe500b0b004aa8056990ca9950831ad @@ -0,0 +1 @@ +2e9b5daadf33c26a2ce698a22bdba17aa7e119f8 diff --git a/.git-rewrite/map/7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 b/.git-rewrite/map/7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 new file mode 100644 index 00000000..df1aaa85 --- /dev/null +++ b/.git-rewrite/map/7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 @@ -0,0 +1 @@ +f6d3669c689e07388bc11ebc0af549b2602ff593 diff --git a/.git-rewrite/map/7eb175c96e1dc08841f4208a21a9e6d6381e1864 b/.git-rewrite/map/7eb175c96e1dc08841f4208a21a9e6d6381e1864 new file mode 100644 index 00000000..516e6f5a --- /dev/null +++ b/.git-rewrite/map/7eb175c96e1dc08841f4208a21a9e6d6381e1864 @@ -0,0 +1 @@ +ede4fcfe969c6a0aee20772e4f4a1e319b394698 diff --git a/.git-rewrite/map/801e4f32929fb52088ab2502be971ef9777d68d0 b/.git-rewrite/map/801e4f32929fb52088ab2502be971ef9777d68d0 new file mode 100644 index 00000000..0f23a30f --- /dev/null +++ b/.git-rewrite/map/801e4f32929fb52088ab2502be971ef9777d68d0 @@ -0,0 +1 @@ +d3a85b2305553af8c2bf4ae9b10ca6261330b81b diff --git a/.git-rewrite/map/81ec9606f5290a5183f5cfaef8687fa9f27caaf1 b/.git-rewrite/map/81ec9606f5290a5183f5cfaef8687fa9f27caaf1 new file mode 100644 index 00000000..0db02163 --- /dev/null +++ b/.git-rewrite/map/81ec9606f5290a5183f5cfaef8687fa9f27caaf1 @@ -0,0 +1 @@ +b8bc41120ebf7a921294ca802a32bd0fee4c30d0 diff --git a/.git-rewrite/map/8508237bd2428a399b1ee4385f8157b2561afaa5 b/.git-rewrite/map/8508237bd2428a399b1ee4385f8157b2561afaa5 new file mode 100644 index 00000000..70db510a --- /dev/null +++ b/.git-rewrite/map/8508237bd2428a399b1ee4385f8157b2561afaa5 @@ -0,0 +1 @@ +edcf4bf0a7d33808795a993c64ba370c92d3bf5c diff --git a/.git-rewrite/map/85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 b/.git-rewrite/map/85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 new file mode 100644 index 00000000..b379bd1d --- /dev/null +++ b/.git-rewrite/map/85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 @@ -0,0 +1 @@ +85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 diff --git a/.git-rewrite/map/8629caeb4646276d98ef92afa15b93436b4a37f0 b/.git-rewrite/map/8629caeb4646276d98ef92afa15b93436b4a37f0 new file mode 100644 index 00000000..9e0be1bc --- /dev/null +++ b/.git-rewrite/map/8629caeb4646276d98ef92afa15b93436b4a37f0 @@ -0,0 +1 @@ +80f0d2dcb31a1e084a7e4a383f8a4525b5f80851 diff --git a/.git-rewrite/map/886dcd60f9daca22777b914e8ca050299544ad96 b/.git-rewrite/map/886dcd60f9daca22777b914e8ca050299544ad96 new file mode 100644 index 00000000..a01b4f06 --- /dev/null +++ b/.git-rewrite/map/886dcd60f9daca22777b914e8ca050299544ad96 @@ -0,0 +1 @@ +bb1771169ccb51c5ede52844711132c127d72286 diff --git a/.git-rewrite/map/8913cd87e692e4e09091654f8934a214c194575b b/.git-rewrite/map/8913cd87e692e4e09091654f8934a214c194575b new file mode 100644 index 00000000..56063058 --- /dev/null +++ b/.git-rewrite/map/8913cd87e692e4e09091654f8934a214c194575b @@ -0,0 +1 @@ +56ce5da24d132086245a9a962f57c821869baf34 diff --git a/.git-rewrite/map/89551c8b88b9d793d5f11884d55f595fe8c6f6e6 b/.git-rewrite/map/89551c8b88b9d793d5f11884d55f595fe8c6f6e6 new file mode 100644 index 00000000..474c8c06 --- /dev/null +++ b/.git-rewrite/map/89551c8b88b9d793d5f11884d55f595fe8c6f6e6 @@ -0,0 +1 @@ +448638e67ae9eae01389aed21139b133b24240cc diff --git a/.git-rewrite/map/89afc38024ea7d1685974822961b9bfc847b203d b/.git-rewrite/map/89afc38024ea7d1685974822961b9bfc847b203d new file mode 100644 index 00000000..ba4f87ed --- /dev/null +++ b/.git-rewrite/map/89afc38024ea7d1685974822961b9bfc847b203d @@ -0,0 +1 @@ +738a0264666081816ddd01c2bb51a6e04a6fe126 diff --git a/.git-rewrite/map/8b53f41b28601d2e6d84bd9d11f36db2f2f37a17 b/.git-rewrite/map/8b53f41b28601d2e6d84bd9d11f36db2f2f37a17 new file mode 100644 index 00000000..b379bd1d --- /dev/null +++ b/.git-rewrite/map/8b53f41b28601d2e6d84bd9d11f36db2f2f37a17 @@ -0,0 +1 @@ +85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 diff --git a/.git-rewrite/map/8d37c0496cb13c9b70c4b9d7338e02af5065f959 b/.git-rewrite/map/8d37c0496cb13c9b70c4b9d7338e02af5065f959 new file mode 100644 index 00000000..192490ca --- /dev/null +++ b/.git-rewrite/map/8d37c0496cb13c9b70c4b9d7338e02af5065f959 @@ -0,0 +1 @@ +676cf21419cd09ca7208cffe88c99ff7b4785750 diff --git a/.git-rewrite/map/8e5012a25881a98906acd0f340e276691b32b5ce b/.git-rewrite/map/8e5012a25881a98906acd0f340e276691b32b5ce new file mode 100644 index 00000000..134226be --- /dev/null +++ b/.git-rewrite/map/8e5012a25881a98906acd0f340e276691b32b5ce @@ -0,0 +1 @@ +50fc4ca1ce6ce4798770c5287ce7c077fb5a55aa diff --git a/.git-rewrite/map/8f4c11e8a4a8d9c81391e6559429ede40da1ac5c b/.git-rewrite/map/8f4c11e8a4a8d9c81391e6559429ede40da1ac5c new file mode 100644 index 00000000..2d88c83c --- /dev/null +++ b/.git-rewrite/map/8f4c11e8a4a8d9c81391e6559429ede40da1ac5c @@ -0,0 +1 @@ +3d04c7766d1934dbe66260dc22af45e97eba5a08 diff --git a/.git-rewrite/map/902c34e293a4a6501976fb6cea600bdfdd221f3a b/.git-rewrite/map/902c34e293a4a6501976fb6cea600bdfdd221f3a new file mode 100644 index 00000000..aea1e89c --- /dev/null +++ b/.git-rewrite/map/902c34e293a4a6501976fb6cea600bdfdd221f3a @@ -0,0 +1 @@ +a2c8f84de555435566ca8b13a5662dd4bfbe58ca diff --git a/.git-rewrite/map/92a8e6cf1138ac46f653f1cc11fc8a3fcd4bb48c b/.git-rewrite/map/92a8e6cf1138ac46f653f1cc11fc8a3fcd4bb48c new file mode 100644 index 00000000..04141a3b --- /dev/null +++ b/.git-rewrite/map/92a8e6cf1138ac46f653f1cc11fc8a3fcd4bb48c @@ -0,0 +1 @@ +2e9b5daadf33c26a2ce698a22bdba17aa7e119f8 diff --git a/.git-rewrite/map/92afb46a026e88a76c4620f1b7e390edd67fc1bb b/.git-rewrite/map/92afb46a026e88a76c4620f1b7e390edd67fc1bb new file mode 100644 index 00000000..1a0a09cc --- /dev/null +++ b/.git-rewrite/map/92afb46a026e88a76c4620f1b7e390edd67fc1bb @@ -0,0 +1 @@ +750543be7c0beda62394fd7667d3e8a770835063 diff --git a/.git-rewrite/map/93aa6127873b16dd44739ea5e5e44af7d62d6e9b b/.git-rewrite/map/93aa6127873b16dd44739ea5e5e44af7d62d6e9b new file mode 100644 index 00000000..99b253e3 --- /dev/null +++ b/.git-rewrite/map/93aa6127873b16dd44739ea5e5e44af7d62d6e9b @@ -0,0 +1 @@ +2eba31143aa3598ce052fbb31f42ab5040dbb725 diff --git a/.git-rewrite/map/940fb0f3508dd0cdd7356d3945d413479d7bde8a b/.git-rewrite/map/940fb0f3508dd0cdd7356d3945d413479d7bde8a new file mode 100644 index 00000000..9a0ab5bb --- /dev/null +++ b/.git-rewrite/map/940fb0f3508dd0cdd7356d3945d413479d7bde8a @@ -0,0 +1 @@ +87918b0b3e7a62675f5749a180302315a1423e10 diff --git a/.git-rewrite/map/95d644fd799e68191fa7d66fa51822d606581c4d b/.git-rewrite/map/95d644fd799e68191fa7d66fa51822d606581c4d new file mode 100644 index 00000000..43924d48 --- /dev/null +++ b/.git-rewrite/map/95d644fd799e68191fa7d66fa51822d606581c4d @@ -0,0 +1 @@ +65ce7a5f8c62eb26444aa3cc31de98db2fc39cef diff --git a/.git-rewrite/map/96e6a32187432a94c4eb3eeeebeb30962e61eab6 b/.git-rewrite/map/96e6a32187432a94c4eb3eeeebeb30962e61eab6 new file mode 100644 index 00000000..2dc7e204 --- /dev/null +++ b/.git-rewrite/map/96e6a32187432a94c4eb3eeeebeb30962e61eab6 @@ -0,0 +1 @@ +7aa257872fb4d56b8296ac8b0b29533f5c83f010 diff --git a/.git-rewrite/map/977b36b408e00e1a9fd928a2a1a2f944f6694835 b/.git-rewrite/map/977b36b408e00e1a9fd928a2a1a2f944f6694835 new file mode 100644 index 00000000..c1df6b3e --- /dev/null +++ b/.git-rewrite/map/977b36b408e00e1a9fd928a2a1a2f944f6694835 @@ -0,0 +1 @@ +9826c7992b457714a59731344ba450bb2f937baf diff --git a/.git-rewrite/map/9a84601cf8a0ac8820f03333a2ff0f6cedf36d38 b/.git-rewrite/map/9a84601cf8a0ac8820f03333a2ff0f6cedf36d38 new file mode 100644 index 00000000..698d2ec8 --- /dev/null +++ b/.git-rewrite/map/9a84601cf8a0ac8820f03333a2ff0f6cedf36d38 @@ -0,0 +1 @@ +c5e784ca3874b195e08dc70778bb2c6ee67036be diff --git a/.git-rewrite/map/9c92233fb3adb85438ccefb8c0984a9138d4c64e b/.git-rewrite/map/9c92233fb3adb85438ccefb8c0984a9138d4c64e new file mode 100644 index 00000000..a39f77e8 --- /dev/null +++ b/.git-rewrite/map/9c92233fb3adb85438ccefb8c0984a9138d4c64e @@ -0,0 +1 @@ +7fa681643de722683c385a558914bb38cfadf1fc diff --git a/.git-rewrite/map/9e1423d3d481f09620d92697d291ae64309d94a7 b/.git-rewrite/map/9e1423d3d481f09620d92697d291ae64309d94a7 new file mode 100644 index 00000000..8f179b42 --- /dev/null +++ b/.git-rewrite/map/9e1423d3d481f09620d92697d291ae64309d94a7 @@ -0,0 +1 @@ +c1ae84ce61ebb8a84de297d0b3bfdc668f459692 diff --git a/.git-rewrite/map/9e8f77f69dc855ae9e6c217b2692d56fa44b88f3 b/.git-rewrite/map/9e8f77f69dc855ae9e6c217b2692d56fa44b88f3 new file mode 100644 index 00000000..9c10e0f0 --- /dev/null +++ b/.git-rewrite/map/9e8f77f69dc855ae9e6c217b2692d56fa44b88f3 @@ -0,0 +1 @@ +cdeb4818a79571f841adc7270f8ea7daf6a80c2c diff --git a/.git-rewrite/map/a03544d926395adabb9545f0995022f6e62aa0a2 b/.git-rewrite/map/a03544d926395adabb9545f0995022f6e62aa0a2 new file mode 100644 index 00000000..3a49e270 --- /dev/null +++ b/.git-rewrite/map/a03544d926395adabb9545f0995022f6e62aa0a2 @@ -0,0 +1 @@ +d3de8bdcde5a576c77365b7b5b922177bc7ddee7 diff --git a/.git-rewrite/map/a1aa7323b893489ade8a44223613be8ee70ffc38 b/.git-rewrite/map/a1aa7323b893489ade8a44223613be8ee70ffc38 new file mode 100644 index 00000000..e78876f7 --- /dev/null +++ b/.git-rewrite/map/a1aa7323b893489ade8a44223613be8ee70ffc38 @@ -0,0 +1 @@ +a0a97620b81bf27ed7f29210bcd7aa3a3b1f4000 diff --git a/.git-rewrite/map/a2363ccab928063aafd2de327483623ab0a6ebd0 b/.git-rewrite/map/a2363ccab928063aafd2de327483623ab0a6ebd0 new file mode 100644 index 00000000..27fdf5b3 --- /dev/null +++ b/.git-rewrite/map/a2363ccab928063aafd2de327483623ab0a6ebd0 @@ -0,0 +1 @@ +d26b3657913bee122723d36e9257874bdf4fbaa4 diff --git a/.git-rewrite/map/a427139ba8b4fa6edc3229189df4679d6baa9508 b/.git-rewrite/map/a427139ba8b4fa6edc3229189df4679d6baa9508 new file mode 100644 index 00000000..8c595af0 --- /dev/null +++ b/.git-rewrite/map/a427139ba8b4fa6edc3229189df4679d6baa9508 @@ -0,0 +1 @@ +3b040f158741931fdb9bcba60e329383dbd3d4be diff --git a/.git-rewrite/map/a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 b/.git-rewrite/map/a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 new file mode 100644 index 00000000..59ff6276 --- /dev/null +++ b/.git-rewrite/map/a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 @@ -0,0 +1 @@ +a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 diff --git a/.git-rewrite/map/a4f05e2458892f7192f6ecd74fae94311f4ce2ec b/.git-rewrite/map/a4f05e2458892f7192f6ecd74fae94311f4ce2ec new file mode 100644 index 00000000..1fcf2e61 --- /dev/null +++ b/.git-rewrite/map/a4f05e2458892f7192f6ecd74fae94311f4ce2ec @@ -0,0 +1 @@ +a5bcf95bddd1761a4facac40ec56f1e0d250c4b7 diff --git a/.git-rewrite/map/a4f8158860b8fc0b0559a4f88d57dc268fb162f5 b/.git-rewrite/map/a4f8158860b8fc0b0559a4f88d57dc268fb162f5 new file mode 100644 index 00000000..304861cd --- /dev/null +++ b/.git-rewrite/map/a4f8158860b8fc0b0559a4f88d57dc268fb162f5 @@ -0,0 +1 @@ +eaf97401c74d284ac14b08d5b2d052716fe25822 diff --git a/.git-rewrite/map/a5e2aec01a3a2847450c0b71120f18c90552455d b/.git-rewrite/map/a5e2aec01a3a2847450c0b71120f18c90552455d new file mode 100644 index 00000000..61967cdf --- /dev/null +++ b/.git-rewrite/map/a5e2aec01a3a2847450c0b71120f18c90552455d @@ -0,0 +1 @@ +20c95dd9972112812675ed512a8b66fd5b163484 diff --git a/.git-rewrite/map/a679248882620e01bc535ff160c755458c8be380 b/.git-rewrite/map/a679248882620e01bc535ff160c755458c8be380 new file mode 100644 index 00000000..df1aaa85 --- /dev/null +++ b/.git-rewrite/map/a679248882620e01bc535ff160c755458c8be380 @@ -0,0 +1 @@ +f6d3669c689e07388bc11ebc0af549b2602ff593 diff --git a/.git-rewrite/map/a7326d0b58534629df72acecfa6ca0927ce11c5b b/.git-rewrite/map/a7326d0b58534629df72acecfa6ca0927ce11c5b new file mode 100644 index 00000000..ea400122 --- /dev/null +++ b/.git-rewrite/map/a7326d0b58534629df72acecfa6ca0927ce11c5b @@ -0,0 +1 @@ +21eceed32440e007add3d9810328b44f60ccb25f diff --git a/.git-rewrite/map/a83b7834b35777bd6294757314417b3bacc7f340 b/.git-rewrite/map/a83b7834b35777bd6294757314417b3bacc7f340 new file mode 100644 index 00000000..d006d8ba --- /dev/null +++ b/.git-rewrite/map/a83b7834b35777bd6294757314417b3bacc7f340 @@ -0,0 +1 @@ +dd123cd3f94b18abde11f8549ed195945616689b diff --git a/.git-rewrite/map/aac31a74f9486d42dd791d9996be2a7ec5497788 b/.git-rewrite/map/aac31a74f9486d42dd791d9996be2a7ec5497788 new file mode 100644 index 00000000..a58f392e --- /dev/null +++ b/.git-rewrite/map/aac31a74f9486d42dd791d9996be2a7ec5497788 @@ -0,0 +1 @@ +9b25330d94aeda86b3ebf2cd6ae3213c35851753 diff --git a/.git-rewrite/map/ad8cce9ccedd3483ef6d9e7343d850827b02d152 b/.git-rewrite/map/ad8cce9ccedd3483ef6d9e7343d850827b02d152 new file mode 100644 index 00000000..a0c963b2 --- /dev/null +++ b/.git-rewrite/map/ad8cce9ccedd3483ef6d9e7343d850827b02d152 @@ -0,0 +1 @@ +84436353806698fb619b52f8e42796f3e7d5360a diff --git a/.git-rewrite/map/b1be0f09da209fa5c21855272b108120df42b139 b/.git-rewrite/map/b1be0f09da209fa5c21855272b108120df42b139 new file mode 100644 index 00000000..f1e3ca86 --- /dev/null +++ b/.git-rewrite/map/b1be0f09da209fa5c21855272b108120df42b139 @@ -0,0 +1 @@ +004b6b79533be845bfa3075582af6e81a1acf5fc diff --git a/.git-rewrite/map/b2911ee56e0a732d709c9195e860d13b6b6d4f3c b/.git-rewrite/map/b2911ee56e0a732d709c9195e860d13b6b6d4f3c new file mode 100644 index 00000000..8b671f85 --- /dev/null +++ b/.git-rewrite/map/b2911ee56e0a732d709c9195e860d13b6b6d4f3c @@ -0,0 +1 @@ +93cad22d311c85ee878e332e45076e6f8d5e082c diff --git a/.git-rewrite/map/b355b5f7355dd057c1c05271bc01aa296977d89c b/.git-rewrite/map/b355b5f7355dd057c1c05271bc01aa296977d89c new file mode 100644 index 00000000..6a4f8c48 --- /dev/null +++ b/.git-rewrite/map/b355b5f7355dd057c1c05271bc01aa296977d89c @@ -0,0 +1 @@ +c6a135193d623ce21469c5fd2c5ca1d572d54d83 diff --git a/.git-rewrite/map/b60ebba7d48cf87a9cd7680a1b3299731b42dca0 b/.git-rewrite/map/b60ebba7d48cf87a9cd7680a1b3299731b42dca0 new file mode 100644 index 00000000..8eb5c539 --- /dev/null +++ b/.git-rewrite/map/b60ebba7d48cf87a9cd7680a1b3299731b42dca0 @@ -0,0 +1 @@ +16cd53d1256a931a1d6fec373ae580cc6aa1634e diff --git a/.git-rewrite/map/b6a4b5871aa9f6b314e7361f79630421157ad6ac b/.git-rewrite/map/b6a4b5871aa9f6b314e7361f79630421157ad6ac new file mode 100644 index 00000000..25f6d468 --- /dev/null +++ b/.git-rewrite/map/b6a4b5871aa9f6b314e7361f79630421157ad6ac @@ -0,0 +1 @@ +16eaadfdd267cdba2ca763cd9a81846e706dec9c diff --git a/.git-rewrite/map/b6d8a4970ed9688b97638f54bbd7ee40263fce37 b/.git-rewrite/map/b6d8a4970ed9688b97638f54bbd7ee40263fce37 new file mode 100644 index 00000000..fa18119f --- /dev/null +++ b/.git-rewrite/map/b6d8a4970ed9688b97638f54bbd7ee40263fce37 @@ -0,0 +1 @@ +339f7df6177e0d8a50f7aa1211a49807756e5224 diff --git a/.git-rewrite/map/b7c3995901194c3049fe4aa67081e2e3cd9c61f5 b/.git-rewrite/map/b7c3995901194c3049fe4aa67081e2e3cd9c61f5 new file mode 100644 index 00000000..b827acf3 --- /dev/null +++ b/.git-rewrite/map/b7c3995901194c3049fe4aa67081e2e3cd9c61f5 @@ -0,0 +1 @@ +c6f76505b501b28c24cfae12655a0b71ee1b766c diff --git a/.git-rewrite/map/bb9f59ecc0b664897c5c0de41afa3cd7a2ac88b6 b/.git-rewrite/map/bb9f59ecc0b664897c5c0de41afa3cd7a2ac88b6 new file mode 100644 index 00000000..3f06b66d --- /dev/null +++ b/.git-rewrite/map/bb9f59ecc0b664897c5c0de41afa3cd7a2ac88b6 @@ -0,0 +1 @@ +3ebb30221b7f7fca8fa177549b67ce560412a393 diff --git a/.git-rewrite/map/bf53175d6828493ed6f1035a096e29e887c4d453 b/.git-rewrite/map/bf53175d6828493ed6f1035a096e29e887c4d453 new file mode 100644 index 00000000..d8b27996 --- /dev/null +++ b/.git-rewrite/map/bf53175d6828493ed6f1035a096e29e887c4d453 @@ -0,0 +1 @@ +d04f7606e6409c9ac47f960f7228c391fa2d086e diff --git a/.git-rewrite/map/c183dd2bbfa14939cceae0a135383c535eddf40c b/.git-rewrite/map/c183dd2bbfa14939cceae0a135383c535eddf40c new file mode 100644 index 00000000..cd8bdfbf --- /dev/null +++ b/.git-rewrite/map/c183dd2bbfa14939cceae0a135383c535eddf40c @@ -0,0 +1 @@ +dcafdad2311432434a3d64a0670481eada9fea60 diff --git a/.git-rewrite/map/c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c b/.git-rewrite/map/c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c new file mode 100644 index 00000000..a0c963b2 --- /dev/null +++ b/.git-rewrite/map/c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c @@ -0,0 +1 @@ +84436353806698fb619b52f8e42796f3e7d5360a diff --git a/.git-rewrite/map/c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a b/.git-rewrite/map/c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a new file mode 100644 index 00000000..56063058 --- /dev/null +++ b/.git-rewrite/map/c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a @@ -0,0 +1 @@ +56ce5da24d132086245a9a962f57c821869baf34 diff --git a/.git-rewrite/map/c64ed9d9bfb9e2948cf9ed26b1afe99b0b8e70a4 b/.git-rewrite/map/c64ed9d9bfb9e2948cf9ed26b1afe99b0b8e70a4 new file mode 100644 index 00000000..73a94b32 --- /dev/null +++ b/.git-rewrite/map/c64ed9d9bfb9e2948cf9ed26b1afe99b0b8e70a4 @@ -0,0 +1 @@ +c3fa8027dd9311e992bce21025bc2fb62f05412f diff --git a/.git-rewrite/map/c7cdbf69eb1824fc9274cb52719f0b77db8084ed b/.git-rewrite/map/c7cdbf69eb1824fc9274cb52719f0b77db8084ed new file mode 100644 index 00000000..72c4ec0c --- /dev/null +++ b/.git-rewrite/map/c7cdbf69eb1824fc9274cb52719f0b77db8084ed @@ -0,0 +1 @@ +ca8939b05f23114778cad51cf776b4e67ae6a942 diff --git a/.git-rewrite/map/c809b721dc137b73bcdf82b2de74a96b1572aea4 b/.git-rewrite/map/c809b721dc137b73bcdf82b2de74a96b1572aea4 new file mode 100644 index 00000000..78db4d36 --- /dev/null +++ b/.git-rewrite/map/c809b721dc137b73bcdf82b2de74a96b1572aea4 @@ -0,0 +1 @@ +a515bbd7c745ff19aae85ee8179e7445e4d683ac diff --git a/.git-rewrite/map/c857f191998c9a21ebe208ac5836ddb9d8ad2dff b/.git-rewrite/map/c857f191998c9a21ebe208ac5836ddb9d8ad2dff new file mode 100644 index 00000000..64165655 --- /dev/null +++ b/.git-rewrite/map/c857f191998c9a21ebe208ac5836ddb9d8ad2dff @@ -0,0 +1 @@ +9572d0f32144f7490061203512944826dc4ccd34 diff --git a/.git-rewrite/map/c8b77514e148c24a460e661ac522091b9b6aee43 b/.git-rewrite/map/c8b77514e148c24a460e661ac522091b9b6aee43 new file mode 100644 index 00000000..4dc4a386 --- /dev/null +++ b/.git-rewrite/map/c8b77514e148c24a460e661ac522091b9b6aee43 @@ -0,0 +1 @@ +b745f5ffa2b998903aec460438fcd3223bd1a953 diff --git a/.git-rewrite/map/c93bbd9d70b386d96f6ea95f872d8d83cde7d6d4 b/.git-rewrite/map/c93bbd9d70b386d96f6ea95f872d8d83cde7d6d4 new file mode 100644 index 00000000..75f9b9a3 --- /dev/null +++ b/.git-rewrite/map/c93bbd9d70b386d96f6ea95f872d8d83cde7d6d4 @@ -0,0 +1 @@ +626572a01270279e51e6cab935403d3edc51c519 diff --git a/.git-rewrite/map/cb61b9d52e17246c037caa9481f8c29b27c17bd7 b/.git-rewrite/map/cb61b9d52e17246c037caa9481f8c29b27c17bd7 new file mode 100644 index 00000000..e8d8a5cf --- /dev/null +++ b/.git-rewrite/map/cb61b9d52e17246c037caa9481f8c29b27c17bd7 @@ -0,0 +1 @@ +dadb5afcffddddc744c27b741487ecc6fe365e2d diff --git a/.git-rewrite/map/cbee14809d9250be44a8ba4893806ade94a3809f b/.git-rewrite/map/cbee14809d9250be44a8ba4893806ade94a3809f new file mode 100644 index 00000000..12814cfc --- /dev/null +++ b/.git-rewrite/map/cbee14809d9250be44a8ba4893806ade94a3809f @@ -0,0 +1 @@ +cbee14809d9250be44a8ba4893806ade94a3809f diff --git a/.git-rewrite/map/ccb3204a35210c4454d52996511036a9a0dff55c b/.git-rewrite/map/ccb3204a35210c4454d52996511036a9a0dff55c new file mode 100644 index 00000000..79023a7d --- /dev/null +++ b/.git-rewrite/map/ccb3204a35210c4454d52996511036a9a0dff55c @@ -0,0 +1 @@ +ccb3204a35210c4454d52996511036a9a0dff55c diff --git a/.git-rewrite/map/ccc8b66559831ca9a82a2b970dfc53a783ff8016 b/.git-rewrite/map/ccc8b66559831ca9a82a2b970dfc53a783ff8016 new file mode 100644 index 00000000..6a320979 --- /dev/null +++ b/.git-rewrite/map/ccc8b66559831ca9a82a2b970dfc53a783ff8016 @@ -0,0 +1 @@ +5ada387c73317389fb8dd9cca4050f52b210c826 diff --git a/.git-rewrite/map/ce971b5770e06f221254727c4d7b4bed7ec8f7b9 b/.git-rewrite/map/ce971b5770e06f221254727c4d7b4bed7ec8f7b9 new file mode 100644 index 00000000..2a7b2b17 --- /dev/null +++ b/.git-rewrite/map/ce971b5770e06f221254727c4d7b4bed7ec8f7b9 @@ -0,0 +1 @@ +2d3abcbfc04553e407f1120e7f4ba5e23a12b56f diff --git a/.git-rewrite/map/d23d2cf02b39dbb84f14a056cd716d91aee485ab b/.git-rewrite/map/d23d2cf02b39dbb84f14a056cd716d91aee485ab new file mode 100644 index 00000000..b2b01e01 --- /dev/null +++ b/.git-rewrite/map/d23d2cf02b39dbb84f14a056cd716d91aee485ab @@ -0,0 +1 @@ +f4f0473ccf255d1587110a6b0482b9b98bcd57c3 diff --git a/.git-rewrite/map/d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 b/.git-rewrite/map/d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 new file mode 100644 index 00000000..c30fee14 --- /dev/null +++ b/.git-rewrite/map/d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 @@ -0,0 +1 @@ +a25777a31ca4ed0ef1731b74b8ba47462c759379 diff --git a/.git-rewrite/map/d357b75948401eaf176da72e1afc447eacfc552d b/.git-rewrite/map/d357b75948401eaf176da72e1afc447eacfc552d new file mode 100644 index 00000000..2e1f5283 --- /dev/null +++ b/.git-rewrite/map/d357b75948401eaf176da72e1afc447eacfc552d @@ -0,0 +1 @@ +53a4c9adecbe3d5e779ab9baec63ff1206b3c6ae diff --git a/.git-rewrite/map/d455b093c5c080b50115962889a07382162f3a86 b/.git-rewrite/map/d455b093c5c080b50115962889a07382162f3a86 new file mode 100644 index 00000000..3a49e270 --- /dev/null +++ b/.git-rewrite/map/d455b093c5c080b50115962889a07382162f3a86 @@ -0,0 +1 @@ +d3de8bdcde5a576c77365b7b5b922177bc7ddee7 diff --git a/.git-rewrite/map/d4595b3665a2c0b8e4ed878e8b48bd2d7788279d b/.git-rewrite/map/d4595b3665a2c0b8e4ed878e8b48bd2d7788279d new file mode 100644 index 00000000..0579ca96 --- /dev/null +++ b/.git-rewrite/map/d4595b3665a2c0b8e4ed878e8b48bd2d7788279d @@ -0,0 +1 @@ +15b2d230ab27a3885dd14d73dfc21a41efdd11c5 diff --git a/.git-rewrite/map/d60c3dae519d88aed07b22f5f5759a40ab6238a1 b/.git-rewrite/map/d60c3dae519d88aed07b22f5f5759a40ab6238a1 new file mode 100644 index 00000000..a76b3c70 --- /dev/null +++ b/.git-rewrite/map/d60c3dae519d88aed07b22f5f5759a40ab6238a1 @@ -0,0 +1 @@ +d1c82cfb281d92e76eee6c07194d5abb215789e1 diff --git a/.git-rewrite/map/d75f4a04f8fba7c0c437566517e8074f8cd64e6e b/.git-rewrite/map/d75f4a04f8fba7c0c437566517e8074f8cd64e6e new file mode 100644 index 00000000..34e44ab1 --- /dev/null +++ b/.git-rewrite/map/d75f4a04f8fba7c0c437566517e8074f8cd64e6e @@ -0,0 +1 @@ +bbd9499b0e22b8df346c69c3fce65197e345ff1c diff --git a/.git-rewrite/map/d764cc30813334f51a73552c5b7ba46255a164ef b/.git-rewrite/map/d764cc30813334f51a73552c5b7ba46255a164ef new file mode 100644 index 00000000..20d10e08 --- /dev/null +++ b/.git-rewrite/map/d764cc30813334f51a73552c5b7ba46255a164ef @@ -0,0 +1 @@ +ee4228af5a452349f74100adff41cbe27d8551e6 diff --git a/.git-rewrite/map/d788f7a2d66f98cefdba9d32b6755da16fb8f6fc b/.git-rewrite/map/d788f7a2d66f98cefdba9d32b6755da16fb8f6fc new file mode 100644 index 00000000..6de30e64 --- /dev/null +++ b/.git-rewrite/map/d788f7a2d66f98cefdba9d32b6755da16fb8f6fc @@ -0,0 +1 @@ +19011dc3892283a6e64203cd46b4bcafcf7fb40a diff --git a/.git-rewrite/map/d8a4bbf2a1befe997c8e1dd261a7f8e38b2aa45b b/.git-rewrite/map/d8a4bbf2a1befe997c8e1dd261a7f8e38b2aa45b new file mode 100644 index 00000000..b3681a9b --- /dev/null +++ b/.git-rewrite/map/d8a4bbf2a1befe997c8e1dd261a7f8e38b2aa45b @@ -0,0 +1 @@ +5730d2fa0f93b6f156a462e5e27571612c2a34b0 diff --git a/.git-rewrite/map/d9191e9dce970e70c6c3b4e7a23d012268fc91bc b/.git-rewrite/map/d9191e9dce970e70c6c3b4e7a23d012268fc91bc new file mode 100644 index 00000000..309408fa --- /dev/null +++ b/.git-rewrite/map/d9191e9dce970e70c6c3b4e7a23d012268fc91bc @@ -0,0 +1 @@ +384ef54adf490a5ec3000df32f49d3295c0103d7 diff --git a/.git-rewrite/map/da22ed155e58d4f9c37c9cabde3ae8d2ee0b8836 b/.git-rewrite/map/da22ed155e58d4f9c37c9cabde3ae8d2ee0b8836 new file mode 100644 index 00000000..bf35b650 --- /dev/null +++ b/.git-rewrite/map/da22ed155e58d4f9c37c9cabde3ae8d2ee0b8836 @@ -0,0 +1 @@ +7941c4ed6a04b757ce595996afae970e34b8b3ae diff --git a/.git-rewrite/map/db8fa186119b40e7dbb7570299534b7e2cf45da5 b/.git-rewrite/map/db8fa186119b40e7dbb7570299534b7e2cf45da5 new file mode 100644 index 00000000..389d440a --- /dev/null +++ b/.git-rewrite/map/db8fa186119b40e7dbb7570299534b7e2cf45da5 @@ -0,0 +1 @@ +c7365d3dc9c01b5f0ccc646e08d42b10cd9ebfc9 diff --git a/.git-rewrite/map/dc36cade617a6a23550f944819b8f252038c5a4a b/.git-rewrite/map/dc36cade617a6a23550f944819b8f252038c5a4a new file mode 100644 index 00000000..4e1dd121 --- /dev/null +++ b/.git-rewrite/map/dc36cade617a6a23550f944819b8f252038c5a4a @@ -0,0 +1 @@ +84d2aac8dac6aa37baf91c1ebadb6a82a7b1c8e8 diff --git a/.git-rewrite/map/dc5bd6a5a4ec08a5b74e441862e20013834406f2 b/.git-rewrite/map/dc5bd6a5a4ec08a5b74e441862e20013834406f2 new file mode 100644 index 00000000..4dcdc451 --- /dev/null +++ b/.git-rewrite/map/dc5bd6a5a4ec08a5b74e441862e20013834406f2 @@ -0,0 +1 @@ +a70f68527443a2ba5aebd9c318007dbc16f896a2 diff --git a/.git-rewrite/map/dd93de5c671cecb77468f5186d4ea62dde6ef8b9 b/.git-rewrite/map/dd93de5c671cecb77468f5186d4ea62dde6ef8b9 new file mode 100644 index 00000000..7256536a --- /dev/null +++ b/.git-rewrite/map/dd93de5c671cecb77468f5186d4ea62dde6ef8b9 @@ -0,0 +1 @@ +890b58a19e11c3cdc19e100f626300c57ab99152 diff --git a/.git-rewrite/map/de30cae90accfb956ac2bee55810213c1f31f334 b/.git-rewrite/map/de30cae90accfb956ac2bee55810213c1f31f334 new file mode 100644 index 00000000..942876a2 --- /dev/null +++ b/.git-rewrite/map/de30cae90accfb956ac2bee55810213c1f31f334 @@ -0,0 +1 @@ +d9ff77fd375002babadb8dba026570d389b2d932 diff --git a/.git-rewrite/map/e0535e681fb0f61ff53ff173afd66744491d7e1b b/.git-rewrite/map/e0535e681fb0f61ff53ff173afd66744491d7e1b new file mode 100644 index 00000000..f75ad31a --- /dev/null +++ b/.git-rewrite/map/e0535e681fb0f61ff53ff173afd66744491d7e1b @@ -0,0 +1 @@ +cd0039e08334650cc5d05be269d1b002752c240f diff --git a/.git-rewrite/map/e0764556b67052145b71368946f908c0e88fa426 b/.git-rewrite/map/e0764556b67052145b71368946f908c0e88fa426 new file mode 100644 index 00000000..4dcdc451 --- /dev/null +++ b/.git-rewrite/map/e0764556b67052145b71368946f908c0e88fa426 @@ -0,0 +1 @@ +a70f68527443a2ba5aebd9c318007dbc16f896a2 diff --git a/.git-rewrite/map/e0b4ceefb397721d6039c79c0355ecac17afb986 b/.git-rewrite/map/e0b4ceefb397721d6039c79c0355ecac17afb986 new file mode 100644 index 00000000..6e015926 --- /dev/null +++ b/.git-rewrite/map/e0b4ceefb397721d6039c79c0355ecac17afb986 @@ -0,0 +1 @@ +28070ea2f2cefc336cab72009a8614ce2322f6a5 diff --git a/.git-rewrite/map/e16ccd68dfb1e88cbe37630ce1928fdfd8187451 b/.git-rewrite/map/e16ccd68dfb1e88cbe37630ce1928fdfd8187451 new file mode 100644 index 00000000..aea1e89c --- /dev/null +++ b/.git-rewrite/map/e16ccd68dfb1e88cbe37630ce1928fdfd8187451 @@ -0,0 +1 @@ +a2c8f84de555435566ca8b13a5662dd4bfbe58ca diff --git a/.git-rewrite/map/e17ace294354740f6b0c0d80688761132efac811 b/.git-rewrite/map/e17ace294354740f6b0c0d80688761132efac811 new file mode 100644 index 00000000..d44690ce --- /dev/null +++ b/.git-rewrite/map/e17ace294354740f6b0c0d80688761132efac811 @@ -0,0 +1 @@ +312ba73b4b6ff982fc8fe50961f89f6d0d48eb72 diff --git a/.git-rewrite/map/e1857c696d721badb8614fb50969cb8cd8c46776 b/.git-rewrite/map/e1857c696d721badb8614fb50969cb8cd8c46776 new file mode 100644 index 00000000..0ac61506 --- /dev/null +++ b/.git-rewrite/map/e1857c696d721badb8614fb50969cb8cd8c46776 @@ -0,0 +1 @@ +5080967ed37a4821ad9522037ef773715062216f diff --git a/.git-rewrite/map/e1c9f7046ad6ca4a86f70a985d86f48903a40198 b/.git-rewrite/map/e1c9f7046ad6ca4a86f70a985d86f48903a40198 new file mode 100644 index 00000000..c544d0de --- /dev/null +++ b/.git-rewrite/map/e1c9f7046ad6ca4a86f70a985d86f48903a40198 @@ -0,0 +1 @@ +774e0bb2411ca7a86ee583ef689f4b3674948b2c diff --git a/.git-rewrite/map/e2a58a9efd988277050825c55122da850d3d69c9 b/.git-rewrite/map/e2a58a9efd988277050825c55122da850d3d69c9 new file mode 100644 index 00000000..e4819198 --- /dev/null +++ b/.git-rewrite/map/e2a58a9efd988277050825c55122da850d3d69c9 @@ -0,0 +1 @@ +1bcd425edba019608e25c26764af25ec43489474 diff --git a/.git-rewrite/map/e2ab8572913e12ae019ce0b1d798c135694718ee b/.git-rewrite/map/e2ab8572913e12ae019ce0b1d798c135694718ee new file mode 100644 index 00000000..5e52da4b --- /dev/null +++ b/.git-rewrite/map/e2ab8572913e12ae019ce0b1d798c135694718ee @@ -0,0 +1 @@ +dff165db8d7ff1f9764230dd2242f7ac57f14150 diff --git a/.git-rewrite/map/e5659a6180053e8fd5d9e7457a4cbc642ac564a5 b/.git-rewrite/map/e5659a6180053e8fd5d9e7457a4cbc642ac564a5 new file mode 100644 index 00000000..73234d8a --- /dev/null +++ b/.git-rewrite/map/e5659a6180053e8fd5d9e7457a4cbc642ac564a5 @@ -0,0 +1 @@ +212b46825f5bf5a3b7c535c1a99d3eb9cf741330 diff --git a/.git-rewrite/map/e7efac20790b9c413b78a1c8b1d06225b9f2c491 b/.git-rewrite/map/e7efac20790b9c413b78a1c8b1d06225b9f2c491 new file mode 100644 index 00000000..55b4e534 --- /dev/null +++ b/.git-rewrite/map/e7efac20790b9c413b78a1c8b1d06225b9f2c491 @@ -0,0 +1 @@ +44049835d1cb0d97b6ce2f365845e5bf662cec49 diff --git a/.git-rewrite/map/e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 b/.git-rewrite/map/e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 new file mode 100644 index 00000000..231d90f8 --- /dev/null +++ b/.git-rewrite/map/e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 @@ -0,0 +1 @@ +e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 diff --git a/.git-rewrite/map/e8ca4b21d98bea9bc1e053fabfbcecfc198daf31 b/.git-rewrite/map/e8ca4b21d98bea9bc1e053fabfbcecfc198daf31 new file mode 100644 index 00000000..528718cb --- /dev/null +++ b/.git-rewrite/map/e8ca4b21d98bea9bc1e053fabfbcecfc198daf31 @@ -0,0 +1 @@ +67e30315f3c11a3cef17054ac07a1363ee03a54b diff --git a/.git-rewrite/map/eb8d268ed002d3f1b17581067299b821897a762b b/.git-rewrite/map/eb8d268ed002d3f1b17581067299b821897a762b new file mode 100644 index 00000000..cd4e4584 --- /dev/null +++ b/.git-rewrite/map/eb8d268ed002d3f1b17581067299b821897a762b @@ -0,0 +1 @@ +3513c4f977ab73cd0bc835eda6c6f0c9a225ec62 diff --git a/.git-rewrite/map/ec749c80cc4d1e1393b5895584e8915bc79cf36c b/.git-rewrite/map/ec749c80cc4d1e1393b5895584e8915bc79cf36c new file mode 100644 index 00000000..7e2b3c34 --- /dev/null +++ b/.git-rewrite/map/ec749c80cc4d1e1393b5895584e8915bc79cf36c @@ -0,0 +1 @@ +e6e36ccfb03839f97c91b602ad37edaefa6ebcb2 diff --git a/.git-rewrite/map/ec822ad31f3ce94db299e6af117d67915e72732d b/.git-rewrite/map/ec822ad31f3ce94db299e6af117d67915e72732d new file mode 100644 index 00000000..0579ca96 --- /dev/null +++ b/.git-rewrite/map/ec822ad31f3ce94db299e6af117d67915e72732d @@ -0,0 +1 @@ +15b2d230ab27a3885dd14d73dfc21a41efdd11c5 diff --git a/.git-rewrite/map/edf92f6eea5538a40081dda5afad1e8e6e7c7c8e b/.git-rewrite/map/edf92f6eea5538a40081dda5afad1e8e6e7c7c8e new file mode 100644 index 00000000..ee07d10e --- /dev/null +++ b/.git-rewrite/map/edf92f6eea5538a40081dda5afad1e8e6e7c7c8e @@ -0,0 +1 @@ +6df09fa86bf01bdc16c2f18f4b51940664661c70 diff --git a/.git-rewrite/map/edfb67bb98a12946542fedef32cf6541e339a912 b/.git-rewrite/map/edfb67bb98a12946542fedef32cf6541e339a912 new file mode 100644 index 00000000..de0a4189 --- /dev/null +++ b/.git-rewrite/map/edfb67bb98a12946542fedef32cf6541e339a912 @@ -0,0 +1 @@ +079a095f5c9dc0cfdaf9d89c8505072a6472b747 diff --git a/.git-rewrite/map/ee59c4ee60a547929eed2e841ae6cb59e5937c28 b/.git-rewrite/map/ee59c4ee60a547929eed2e841ae6cb59e5937c28 new file mode 100644 index 00000000..871a59f5 --- /dev/null +++ b/.git-rewrite/map/ee59c4ee60a547929eed2e841ae6cb59e5937c28 @@ -0,0 +1 @@ +ee59c4ee60a547929eed2e841ae6cb59e5937c28 diff --git a/.git-rewrite/map/ef75e294a161064b7f7b8d0e799239a2768fad36 b/.git-rewrite/map/ef75e294a161064b7f7b8d0e799239a2768fad36 new file mode 100644 index 00000000..dc735b8c --- /dev/null +++ b/.git-rewrite/map/ef75e294a161064b7f7b8d0e799239a2768fad36 @@ -0,0 +1 @@ +97389210ab753f8243207b72c8f8c4c287131e33 diff --git a/.git-rewrite/map/f111532a8ded15738df7de43d7b8a382af899a8c b/.git-rewrite/map/f111532a8ded15738df7de43d7b8a382af899a8c new file mode 100644 index 00000000..aa6b0647 --- /dev/null +++ b/.git-rewrite/map/f111532a8ded15738df7de43d7b8a382af899a8c @@ -0,0 +1 @@ +19cfe70df94bae28aca27b334a2b175e65115794 diff --git a/.git-rewrite/map/f67cdbcd4c03003d2190ded6ac88c1f90a9861ad b/.git-rewrite/map/f67cdbcd4c03003d2190ded6ac88c1f90a9861ad new file mode 100644 index 00000000..4776d103 --- /dev/null +++ b/.git-rewrite/map/f67cdbcd4c03003d2190ded6ac88c1f90a9861ad @@ -0,0 +1 @@ +e75e3e15e89bebc1fb865ce2f5a5e83364bcac49 diff --git a/.git-rewrite/map/f698ed481d2eecb94b3f374003e790d05ba96969 b/.git-rewrite/map/f698ed481d2eecb94b3f374003e790d05ba96969 new file mode 100644 index 00000000..142624a3 --- /dev/null +++ b/.git-rewrite/map/f698ed481d2eecb94b3f374003e790d05ba96969 @@ -0,0 +1 @@ +2c485c94441be73b258b54935d64054f1ad661b7 diff --git a/.git-rewrite/map/f703538d2c5001dc602d694613a4a18b7e67c726 b/.git-rewrite/map/f703538d2c5001dc602d694613a4a18b7e67c726 new file mode 100644 index 00000000..f36ace97 --- /dev/null +++ b/.git-rewrite/map/f703538d2c5001dc602d694613a4a18b7e67c726 @@ -0,0 +1 @@ +8276eeeb644c1cc4d4b4bd81a9dc095b6fdf4777 diff --git a/.git-rewrite/map/f849db4b40345adf594b9d0fd49ff0a541d48da0 b/.git-rewrite/map/f849db4b40345adf594b9d0fd49ff0a541d48da0 new file mode 100644 index 00000000..f5517850 --- /dev/null +++ b/.git-rewrite/map/f849db4b40345adf594b9d0fd49ff0a541d48da0 @@ -0,0 +1 @@ +fbc3cd98764e0e7320a6ba697ce5d61324bb2719 diff --git a/.git-rewrite/map/f88c910229a0fe4707a0c65ad188d5a5ba85e77a b/.git-rewrite/map/f88c910229a0fe4707a0c65ad188d5a5ba85e77a new file mode 100644 index 00000000..a426bb6e --- /dev/null +++ b/.git-rewrite/map/f88c910229a0fe4707a0c65ad188d5a5ba85e77a @@ -0,0 +1 @@ +045a01a6a117a59c9fa89989fd8d18f588e806ce diff --git a/.git-rewrite/map/f8e0f1857cd2010888f2c2c4ca64d0a52393f5a4 b/.git-rewrite/map/f8e0f1857cd2010888f2c2c4ca64d0a52393f5a4 new file mode 100644 index 00000000..c230a923 --- /dev/null +++ b/.git-rewrite/map/f8e0f1857cd2010888f2c2c4ca64d0a52393f5a4 @@ -0,0 +1 @@ +f6e6e5bae40e3b2314eea8f5d879abfdf87daeb5 diff --git a/.git-rewrite/map/f95a9838bf59b3267fbbefc5935b60e576fc85f6 b/.git-rewrite/map/f95a9838bf59b3267fbbefc5935b60e576fc85f6 new file mode 100644 index 00000000..3f09d86d --- /dev/null +++ b/.git-rewrite/map/f95a9838bf59b3267fbbefc5935b60e576fc85f6 @@ -0,0 +1 @@ +2464e555ddef9c65414d59e425695f362e999c5c diff --git a/.git-rewrite/map/fc3c68414b15bf64f8b0e211077521f893974bff b/.git-rewrite/map/fc3c68414b15bf64f8b0e211077521f893974bff new file mode 100644 index 00000000..08a628f0 --- /dev/null +++ b/.git-rewrite/map/fc3c68414b15bf64f8b0e211077521f893974bff @@ -0,0 +1 @@ +f6bd6ef39b39e11c89feab787bb968973df2dc28 diff --git a/.git-rewrite/map/fd0035043bf407d0b6741e0ae5a34f4f38835210 b/.git-rewrite/map/fd0035043bf407d0b6741e0ae5a34f4f38835210 new file mode 100644 index 00000000..33a4a4e5 --- /dev/null +++ b/.git-rewrite/map/fd0035043bf407d0b6741e0ae5a34f4f38835210 @@ -0,0 +1 @@ +26ee840f88fad5633fbf50eb5f257aa089aefc95 diff --git a/.git-rewrite/map/fe8cf039232eb484f4156c94a30aec26bafa2ab0 b/.git-rewrite/map/fe8cf039232eb484f4156c94a30aec26bafa2ab0 new file mode 100644 index 00000000..84b8cad0 --- /dev/null +++ b/.git-rewrite/map/fe8cf039232eb484f4156c94a30aec26bafa2ab0 @@ -0,0 +1 @@ +8d513a186fc7c3fc2e13e4b96e1f4a6af6990093 diff --git a/.git-rewrite/map/ffb50cb5889b7dedacf7ca8f1563a08a960d8e6e b/.git-rewrite/map/ffb50cb5889b7dedacf7ca8f1563a08a960d8e6e new file mode 100644 index 00000000..07a779aa --- /dev/null +++ b/.git-rewrite/map/ffb50cb5889b7dedacf7ca8f1563a08a960d8e6e @@ -0,0 +1 @@ +5cbd8a7f82233f44b71cbce267fe47e0eb2fca2f diff --git a/.git-rewrite/message b/.git-rewrite/message new file mode 100644 index 00000000..e448bab5 --- /dev/null +++ b/.git-rewrite/message @@ -0,0 +1,3 @@ +Identified clone state sharing issue - different Arc data pointers + +Co-authored-by: moe-charm <217100418+moe-charm@users.noreply.github.com> diff --git a/.git-rewrite/parse b/.git-rewrite/parse new file mode 100644 index 00000000..2d813421 --- /dev/null +++ b/.git-rewrite/parse @@ -0,0 +1,22 @@ +14de7eae603c6810d63d40406e47db26d5c4182b +2bc7e993f7a58c259d38f5d3233326f8a69e17a2 +11947469a115c2e94819af69d2e87d274a8461e7 +279d29af0efcdf978707a56f31afc8610129424c +67a7e4741f9a2f0f0e8c65f5582bd48a93b53dae +0880022ad365e2647e013c43e0c5b1b21e9612d7 +38857a2c3c44b316e1f59fe64674cc463e6932d0 +08de33cd202ee3c46884d07214fb999ed7323369 +e49af2f32dfb7814e57fa404584b5934310451a9 +21e7c207ef98c4016ffdaed3c8e50e6c0045d8cf +b7c3995901194c3049fe4aa67081e2e3cd9c61f5 +f895a91aa453dcf7ed1a92c28ec7a8f3d39b6b2e +9b6ea67923cc3e9aa1272d6727999c71f1a55004 +d8fb3a59a8897b06007f8f6b831a0c3333095657 +3ed8b4e6229a8260c2d67fc25f3320ae3bf9ec8d +55cf327d0e4bfbb0c3a8f6fa54dc2a1c3a3b5606 +08de33cd202ee3c46884d07214fb999ed7323369 +38857a2c3c44b316e1f59fe64674cc463e6932d0 +9248f79fcdb3c33bcfcb4a69cdd875d5e559c8f2 +39f997e48d326dfa78e35af55def4f484723a796 +44736bf9a3e24bcb623abb990b5c45632d1d64fc +bbd031517e074abfcc1f3eb7a91aa5851d931b4e diff --git a/.git-rewrite/raw-refs b/.git-rewrite/raw-refs new file mode 100644 index 00000000..492b9a6d --- /dev/null +++ b/.git-rewrite/raw-refs @@ -0,0 +1,22 @@ +refs/heads/backup/claude-ssa-fix +refs/heads/clean-push +refs/heads/cranelift-dev +refs/heads/main +refs/heads/selfhosting-dev +refs/heads/selfhosting-dev-backup-20250907-183125 +refs/heads/test-chatgpt-fix +refs/remotes/origin/main +refs/remotes/origin/codex/mir +refs/remotes/origin/codex/mir-4q9jre +refs/remotes/origin/continue/fix-26 +refs/remotes/origin/cranelift-dev +refs/remotes/origin/docs/submodule-private +refs/remotes/origin/integration/core13-pure-ci +refs/remotes/origin/llvm-dev +refs/remotes/origin/llvm-dev-local +refs/remotes/origin/main +refs/remotes/origin/selfhosting-dev +refs/remotes/origin/vm-test-request +refs/remotes/origin/wasm-claude +refs/stash +refs/tags/v0.15-core13-stabilize diff --git a/.git-rewrite/revs b/.git-rewrite/revs new file mode 100644 index 00000000..0b49b961 --- /dev/null +++ b/.git-rewrite/revs @@ -0,0 +1,722 @@ +0bed0c0271b9aaaf561bed939292bec6a35c7604 +5591ea8c209eb74952889fc39708df9fec00f4e9 0bed0c0271b9aaaf561bed939292bec6a35c7604 +ee59c4ee60a547929eed2e841ae6cb59e5937c28 5591ea8c209eb74952889fc39708df9fec00f4e9 +1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd ee59c4ee60a547929eed2e841ae6cb59e5937c28 +5d4bae2402bf312b8059491df8f39a652d67d879 1473c7dd52dcd59ae48dfb3e02e93079f0cf5cdd +2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d 5d4bae2402bf312b8059491df8f39a652d67d879 +a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 2c5fc374da3d5bff4fce5b5dab14c4e4acf5ed2d +e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 a4d32b3c572cd9f1a6be09765b8c238cb50d40b1 +ccb3204a35210c4454d52996511036a9a0dff55c e7f66669178c6f1ac6daaafa3c5cd1da521a6eb8 +6f916855c89182c901d4f40addc39cb3911113e9 ccb3204a35210c4454d52996511036a9a0dff55c +85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 6f916855c89182c901d4f40addc39cb3911113e9 +cbee14809d9250be44a8ba4893806ade94a3809f 85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 +8b53f41b28601d2e6d84bd9d11f36db2f2f37a17 85a8c7f2d7e70bd021a6a374002b19ebf8e42bf5 +ec749c80cc4d1e1393b5895584e8915bc79cf36c 8b53f41b28601d2e6d84bd9d11f36db2f2f37a17 +c8b77514e148c24a460e661ac522091b9b6aee43 ec749c80cc4d1e1393b5895584e8915bc79cf36c +92afb46a026e88a76c4620f1b7e390edd67fc1bb c8b77514e148c24a460e661ac522091b9b6aee43 +e7efac20790b9c413b78a1c8b1d06225b9f2c491 92afb46a026e88a76c4620f1b7e390edd67fc1bb +34a155e77e711c819497f243a3fdcb4e8980b257 e7efac20790b9c413b78a1c8b1d06225b9f2c491 +e2ab8572913e12ae019ce0b1d798c135694718ee cbee14809d9250be44a8ba4893806ade94a3809f 34a155e77e711c819497f243a3fdcb4e8980b257 +5e5086faaa76717951ea3c0daf323975b1630b16 e2ab8572913e12ae019ce0b1d798c135694718ee +fd0035043bf407d0b6741e0ae5a34f4f38835210 5e5086faaa76717951ea3c0daf323975b1630b16 +11bb20794ecfd9dd3594f04da9a8fe2e4f1e229d fd0035043bf407d0b6741e0ae5a34f4f38835210 +a7326d0b58534629df72acecfa6ca0927ce11c5b 11bb20794ecfd9dd3594f04da9a8fe2e4f1e229d +7396e83628365c7dec8bca70fa373e722a202f82 a7326d0b58534629df72acecfa6ca0927ce11c5b +02541eb80adf788bc812b8ae9b6c1e2e69989d37 7396e83628365c7dec8bca70fa373e722a202f82 +8e5012a25881a98906acd0f340e276691b32b5ce 02541eb80adf788bc812b8ae9b6c1e2e69989d37 +f88c910229a0fe4707a0c65ad188d5a5ba85e77a 8e5012a25881a98906acd0f340e276691b32b5ce +a5e2aec01a3a2847450c0b71120f18c90552455d f88c910229a0fe4707a0c65ad188d5a5ba85e77a +d75f4a04f8fba7c0c437566517e8074f8cd64e6e a5e2aec01a3a2847450c0b71120f18c90552455d +2a58af0b49dfbe04e710c768bcbb437d6efbbae1 d75f4a04f8fba7c0c437566517e8074f8cd64e6e +8508237bd2428a399b1ee4385f8157b2561afaa5 2a58af0b49dfbe04e710c768bcbb437d6efbbae1 +5d3441870b58f09f8c686fa1cc1be3145c95856b 8508237bd2428a399b1ee4385f8157b2561afaa5 +c7cdbf69eb1824fc9274cb52719f0b77db8084ed 5d3441870b58f09f8c686fa1cc1be3145c95856b +f95a9838bf59b3267fbbefc5935b60e576fc85f6 c7cdbf69eb1824fc9274cb52719f0b77db8084ed +e17ace294354740f6b0c0d80688761132efac811 f95a9838bf59b3267fbbefc5935b60e576fc85f6 +01be5f50a207d60d85bd834b42cde87a67a6d182 e17ace294354740f6b0c0d80688761132efac811 +1743d9c08888c70c0f0daa6ce0a6049ede2a3098 01be5f50a207d60d85bd834b42cde87a67a6d182 +f111532a8ded15738df7de43d7b8a382af899a8c 1743d9c08888c70c0f0daa6ce0a6049ede2a3098 +b2911ee56e0a732d709c9195e860d13b6b6d4f3c f111532a8ded15738df7de43d7b8a382af899a8c +9c92233fb3adb85438ccefb8c0984a9138d4c64e b2911ee56e0a732d709c9195e860d13b6b6d4f3c +751e4375ae5ebb0476cb8d1a85309335af9acc77 9c92233fb3adb85438ccefb8c0984a9138d4c64e +8629caeb4646276d98ef92afa15b93436b4a37f0 1743d9c08888c70c0f0daa6ce0a6049ede2a3098 751e4375ae5ebb0476cb8d1a85309335af9acc77 +5a1b93a244c8895bd63119df1626fe87b5aa5abd 8629caeb4646276d98ef92afa15b93436b4a37f0 +10c81f24036fcd4e38d412a70c5c29e1b713e383 5a1b93a244c8895bd63119df1626fe87b5aa5abd +89afc38024ea7d1685974822961b9bfc847b203d 10c81f24036fcd4e38d412a70c5c29e1b713e383 +40e4eecc9781997e9d844cda96c7afce652355d1 89afc38024ea7d1685974822961b9bfc847b203d +4111324face5d6e8f0e3c880c9999b8a0e00a4ed 40e4eecc9781997e9d844cda96c7afce652355d1 +0147f074a96a64af5d3b41b266f4b1a29afa5997 5a1b93a244c8895bd63119df1626fe87b5aa5abd 4111324face5d6e8f0e3c880c9999b8a0e00a4ed +7095c66f289d49bbc5fef707f313ecb933220c15 0147f074a96a64af5d3b41b266f4b1a29afa5997 +36f7ff5dd5e08c3afa4cce7ef0c0fc65ee052cfa 7095c66f289d49bbc5fef707f313ecb933220c15 +ef75e294a161064b7f7b8d0e799239a2768fad36 0147f074a96a64af5d3b41b266f4b1a29afa5997 36f7ff5dd5e08c3afa4cce7ef0c0fc65ee052cfa +e1857c696d721badb8614fb50969cb8cd8c46776 ef75e294a161064b7f7b8d0e799239a2768fad36 +ec822ad31f3ce94db299e6af117d67915e72732d e1857c696d721badb8614fb50969cb8cd8c46776 +d4595b3665a2c0b8e4ed878e8b48bd2d7788279d ec822ad31f3ce94db299e6af117d67915e72732d +4452cd716894c1d7e9980a98a17f473cb1afb71b d4595b3665a2c0b8e4ed878e8b48bd2d7788279d +7c0397decb84d7b744196c3910354654810ce650 4452cd716894c1d7e9980a98a17f473cb1afb71b +e16ccd68dfb1e88cbe37630ce1928fdfd8187451 ec822ad31f3ce94db299e6af117d67915e72732d 7c0397decb84d7b744196c3910354654810ce650 +902c34e293a4a6501976fb6cea600bdfdd221f3a e16ccd68dfb1e88cbe37630ce1928fdfd8187451 +cb61b9d52e17246c037caa9481f8c29b27c17bd7 902c34e293a4a6501976fb6cea600bdfdd221f3a +96e6a32187432a94c4eb3eeeebeb30962e61eab6 cb61b9d52e17246c037caa9481f8c29b27c17bd7 +566bfe678537dec2572e6b68cf7684267ae20aed 96e6a32187432a94c4eb3eeeebeb30962e61eab6 +c64ed9d9bfb9e2948cf9ed26b1afe99b0b8e70a4 566bfe678537dec2572e6b68cf7684267ae20aed +015a128f26a6c031b0c144e6db99276720db576e e16ccd68dfb1e88cbe37630ce1928fdfd8187451 c64ed9d9bfb9e2948cf9ed26b1afe99b0b8e70a4 +eb8d268ed002d3f1b17581067299b821897a762b 015a128f26a6c031b0c144e6db99276720db576e +b6a4b5871aa9f6b314e7361f79630421157ad6ac eb8d268ed002d3f1b17581067299b821897a762b +c809b721dc137b73bcdf82b2de74a96b1572aea4 015a128f26a6c031b0c144e6db99276720db576e b6a4b5871aa9f6b314e7361f79630421157ad6ac +7553ab6b9fabd12689f03a74a73b811f32cd81b7 c809b721dc137b73bcdf82b2de74a96b1572aea4 +e1c9f7046ad6ca4a86f70a985d86f48903a40198 7553ab6b9fabd12689f03a74a73b811f32cd81b7 +8d37c0496cb13c9b70c4b9d7338e02af5065f959 e1c9f7046ad6ca4a86f70a985d86f48903a40198 +7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 c809b721dc137b73bcdf82b2de74a96b1572aea4 8d37c0496cb13c9b70c4b9d7338e02af5065f959 +a679248882620e01bc535ff160c755458c8be380 7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 +481002c30034ea2e6b9d48bc2a7652ee95687211 a679248882620e01bc535ff160c755458c8be380 +03c0e2534b0648595a042c8b73fb6dec629cda38 481002c30034ea2e6b9d48bc2a7652ee95687211 +b6d8a4970ed9688b97638f54bbd7ee40263fce37 03c0e2534b0648595a042c8b73fb6dec629cda38 +d357b75948401eaf176da72e1afc447eacfc552d 7d506b1d3b2f6101ae4abf68b6f44cf83495cf89 b6d8a4970ed9688b97638f54bbd7ee40263fce37 +2192f3615d3b5bf35ff7c2f405fa55de10ac7f0f d357b75948401eaf176da72e1afc447eacfc552d +2d348a52b69e3e5521499b0e840e8cfc596d0139 2192f3615d3b5bf35ff7c2f405fa55de10ac7f0f +e8ca4b21d98bea9bc1e053fabfbcecfc198daf31 2d348a52b69e3e5521499b0e840e8cfc596d0139 +2e7bfb976752080319478ee29d170308a9a0d1c2 e8ca4b21d98bea9bc1e053fabfbcecfc198daf31 +89551c8b88b9d793d5f11884d55f595fe8c6f6e6 2e7bfb976752080319478ee29d170308a9a0d1c2 +76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 d357b75948401eaf176da72e1afc447eacfc552d 89551c8b88b9d793d5f11884d55f595fe8c6f6e6 +1180a1f15d03074668aebddbb9c88bb4818ecde5 76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 +b355b5f7355dd057c1c05271bc01aa296977d89c 1180a1f15d03074668aebddbb9c88bb4818ecde5 +977b36b408e00e1a9fd928a2a1a2f944f6694835 b355b5f7355dd057c1c05271bc01aa296977d89c +d455b093c5c080b50115962889a07382162f3a86 76a91a7dcf32026d3c4aee7a9786fc02f9277dd9 977b36b408e00e1a9fd928a2a1a2f944f6694835 +a03544d926395adabb9545f0995022f6e62aa0a2 d455b093c5c080b50115962889a07382162f3a86 +245f9b394d7c1cccd344297a87455583af08f49c a03544d926395adabb9545f0995022f6e62aa0a2 +b60ebba7d48cf87a9cd7680a1b3299731b42dca0 245f9b394d7c1cccd344297a87455583af08f49c +dc5bd6a5a4ec08a5b74e441862e20013834406f2 d455b093c5c080b50115962889a07382162f3a86 b60ebba7d48cf87a9cd7680a1b3299731b42dca0 +e0764556b67052145b71368946f908c0e88fa426 dc5bd6a5a4ec08a5b74e441862e20013834406f2 +70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 e0764556b67052145b71368946f908c0e88fa426 +224a64479eb43dfd7c1e0fbe79ed0dbbf1304c00 dc5bd6a5a4ec08a5b74e441862e20013834406f2 70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 +b7c3995901194c3049fe4aa67081e2e3cd9c61f5 70d6cd50585b8c250a3c6653aa1b7c3cd1cc64e1 +93aa6127873b16dd44739ea5e5e44af7d62d6e9b b7c3995901194c3049fe4aa67081e2e3cd9c61f5 +50ddf625f87f78ff2504b6c109081f21a031196f 224a64479eb43dfd7c1e0fbe79ed0dbbf1304c00 93aa6127873b16dd44739ea5e5e44af7d62d6e9b +fc3c68414b15bf64f8b0e211077521f893974bff 50ddf625f87f78ff2504b6c109081f21a031196f +edfb67bb98a12946542fedef32cf6541e339a912 fc3c68414b15bf64f8b0e211077521f893974bff +39045ddb7b7c6a36a86c64bbee61afd6a4f98479 edfb67bb98a12946542fedef32cf6541e339a912 +767b0e8d2cedbff14c147431e17fd86b84d415b7 50ddf625f87f78ff2504b6c109081f21a031196f 39045ddb7b7c6a36a86c64bbee61afd6a4f98479 +68062f001d4a6e95a220e7bf4b67a9be64d536bf 767b0e8d2cedbff14c147431e17fd86b84d415b7 +5ce21ddbdb850d9a590f6bef1d327f31055dcb8e 68062f001d4a6e95a220e7bf4b67a9be64d536bf +7cf894ffdbe500b0b004aa8056990ca9950831ad 767b0e8d2cedbff14c147431e17fd86b84d415b7 5ce21ddbdb850d9a590f6bef1d327f31055dcb8e +92a8e6cf1138ac46f653f1cc11fc8a3fcd4bb48c 7cf894ffdbe500b0b004aa8056990ca9950831ad +801e4f32929fb52088ab2502be971ef9777d68d0 92a8e6cf1138ac46f653f1cc11fc8a3fcd4bb48c +edf92f6eea5538a40081dda5afad1e8e6e7c7c8e 801e4f32929fb52088ab2502be971ef9777d68d0 +d9191e9dce970e70c6c3b4e7a23d012268fc91bc 7cf894ffdbe500b0b004aa8056990ca9950831ad edf92f6eea5538a40081dda5afad1e8e6e7c7c8e +163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 d9191e9dce970e70c6c3b4e7a23d012268fc91bc +a427139ba8b4fa6edc3229189df4679d6baa9508 163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 +7154f15a8aaab8db0282ff246fe2b1b241503681 a427139ba8b4fa6edc3229189df4679d6baa9508 +f67cdbcd4c03003d2190ded6ac88c1f90a9861ad 7154f15a8aaab8db0282ff246fe2b1b241503681 +631819c1b4bc07b12733b7c93b6a50a1d581aceb 163b397e2a4eb8d3e8e895f4f094ed61226e6cd8 f67cdbcd4c03003d2190ded6ac88c1f90a9861ad +7035cea225353c5cc7ff7a6eaad0bb4ec178d5ae 631819c1b4bc07b12733b7c93b6a50a1d581aceb +4347473b8bf57cab3ad359a07bd16173f27cfc7f 7035cea225353c5cc7ff7a6eaad0bb4ec178d5ae +a83b7834b35777bd6294757314417b3bacc7f340 631819c1b4bc07b12733b7c93b6a50a1d581aceb +2b4eb4d1dfa4bf5f19f14069ee7c243225148299 a83b7834b35777bd6294757314417b3bacc7f340 +6105ab72e26e1a45ac306f07083a575da7a409db 2b4eb4d1dfa4bf5f19f14069ee7c243225148299 +e0535e681fb0f61ff53ff173afd66744491d7e1b 6105ab72e26e1a45ac306f07083a575da7a409db +1bff2de6de48b5f82d39008c68a6e82d882ff8ec 4347473b8bf57cab3ad359a07bd16173f27cfc7f e0535e681fb0f61ff53ff173afd66744491d7e1b +95d644fd799e68191fa7d66fa51822d606581c4d 1bff2de6de48b5f82d39008c68a6e82d882ff8ec +0e7426a761b53269114e292c453ce40f66bbf1fd 95d644fd799e68191fa7d66fa51822d606581c4d +dc36cade617a6a23550f944819b8f252038c5a4a 0e7426a761b53269114e292c453ce40f66bbf1fd +7a2b65274512af10affe1483359d39047d100098 dc36cade617a6a23550f944819b8f252038c5a4a +77d2fe9cb7ba0921561540547441f907c60b70ba 95d644fd799e68191fa7d66fa51822d606581c4d 7a2b65274512af10affe1483359d39047d100098 +da22ed155e58d4f9c37c9cabde3ae8d2ee0b8836 77d2fe9cb7ba0921561540547441f907c60b70ba +1331ff5ba8d16c98328d78a4b2b9170928bfb2ee da22ed155e58d4f9c37c9cabde3ae8d2ee0b8836 +f849db4b40345adf594b9d0fd49ff0a541d48da0 1331ff5ba8d16c98328d78a4b2b9170928bfb2ee +ffb50cb5889b7dedacf7ca8f1563a08a960d8e6e f849db4b40345adf594b9d0fd49ff0a541d48da0 +9a84601cf8a0ac8820f03333a2ff0f6cedf36d38 ffb50cb5889b7dedacf7ca8f1563a08a960d8e6e +7ba88ea26dbf45e007ae51b68a733b006dee3129 77d2fe9cb7ba0921561540547441f907c60b70ba +5ec1d965dc1bc9bcd2b4e806365ee8d502af6da8 7ba88ea26dbf45e007ae51b68a733b006dee3129 +39d33e8d52919d533cc61683df41aebda9f0e9d7 5ec1d965dc1bc9bcd2b4e806365ee8d502af6da8 +2d8497612572689ed3ee7ddb4f7ea38d96aca39f 39d33e8d52919d533cc61683df41aebda9f0e9d7 +155615f6aeb5ed7212359862c10943def877cfb5 77d2fe9cb7ba0921561540547441f907c60b70ba 2d8497612572689ed3ee7ddb4f7ea38d96aca39f +7eb175c96e1dc08841f4208a21a9e6d6381e1864 9a84601cf8a0ac8820f03333a2ff0f6cedf36d38 155615f6aeb5ed7212359862c10943def877cfb5 +886dcd60f9daca22777b914e8ca050299544ad96 7eb175c96e1dc08841f4208a21a9e6d6381e1864 +bb9f59ecc0b664897c5c0de41afa3cd7a2ac88b6 155615f6aeb5ed7212359862c10943def877cfb5 +0dc33fc41493aaebca528bbea79f707ed803a957 bb9f59ecc0b664897c5c0de41afa3cd7a2ac88b6 +f8e0f1857cd2010888f2c2c4ca64d0a52393f5a4 0dc33fc41493aaebca528bbea79f707ed803a957 +0750cb9b6528ec41896d72d0a92510c842057517 f8e0f1857cd2010888f2c2c4ca64d0a52393f5a4 +1133322ea07965f965b93de0057e2b55b201d02d 155615f6aeb5ed7212359862c10943def877cfb5 0750cb9b6528ec41896d72d0a92510c842057517 +706d7a23f7b30d22b1a7c1620c5539fd4adb57c3 886dcd60f9daca22777b914e8ca050299544ad96 1133322ea07965f965b93de0057e2b55b201d02d +535ed8a7dde343f92c309203cdbee1f629f029c1 706d7a23f7b30d22b1a7c1620c5539fd4adb57c3 +4be186ff751a2885a954ee0a8bd01383b2359f42 535ed8a7dde343f92c309203cdbee1f629f029c1 +e0b4ceefb397721d6039c79c0355ecac17afb986 4be186ff751a2885a954ee0a8bd01383b2359f42 +d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 535ed8a7dde343f92c309203cdbee1f629f029c1 e0b4ceefb397721d6039c79c0355ecac17afb986 +08acb6eec4af8a73caf06f336dc49612da46d979 d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 +f703538d2c5001dc602d694613a4a18b7e67c726 08acb6eec4af8a73caf06f336dc49612da46d979 +77ce732f6094eef8a1a4e052c106e049c4038a2e f703538d2c5001dc602d694613a4a18b7e67c726 +07c02ae86c65eb17e9263382dfc6433012edb1fb 77ce732f6094eef8a1a4e052c106e049c4038a2e +1631220b638900e746fbab075acf16074c33e581 d2d9155197dbc78bf5cac8d939e7d12e3f4ee150 07c02ae86c65eb17e9263382dfc6433012edb1fb +4358a8419c78c6168e51d755a27153fefbbe6743 1631220b638900e746fbab075acf16074c33e581 +6562400997d0513c5b904124c76585fd8bb0caa0 4358a8419c78c6168e51d755a27153fefbbe6743 +0d6e756cd92955c289e3c5c4e6e661e229233b95 6562400997d0513c5b904124c76585fd8bb0caa0 +f698ed481d2eecb94b3f374003e790d05ba96969 6562400997d0513c5b904124c76585fd8bb0caa0 +a1aa7323b893489ade8a44223613be8ee70ffc38 f698ed481d2eecb94b3f374003e790d05ba96969 +a4f8158860b8fc0b0559a4f88d57dc268fb162f5 6562400997d0513c5b904124c76585fd8bb0caa0 a1aa7323b893489ade8a44223613be8ee70ffc38 +db8fa186119b40e7dbb7570299534b7e2cf45da5 0d6e756cd92955c289e3c5c4e6e661e229233b95 a4f8158860b8fc0b0559a4f88d57dc268fb162f5 +0e336fba0076760fa149084ede35fb24539adb08 a4f8158860b8fc0b0559a4f88d57dc268fb162f5 +9e8f77f69dc855ae9e6c217b2692d56fa44b88f3 0e336fba0076760fa149084ede35fb24539adb08 +d788f7a2d66f98cefdba9d32b6755da16fb8f6fc 9e8f77f69dc855ae9e6c217b2692d56fa44b88f3 +762391df13a488dceeb76581acd0a573de8ce676 a4f8158860b8fc0b0559a4f88d57dc268fb162f5 d788f7a2d66f98cefdba9d32b6755da16fb8f6fc +5d8e1575ea250a4b92a7c75dbc5b6cc99b60c3dc db8fa186119b40e7dbb7570299534b7e2cf45da5 762391df13a488dceeb76581acd0a573de8ce676 +d764cc30813334f51a73552c5b7ba46255a164ef 5d8e1575ea250a4b92a7c75dbc5b6cc99b60c3dc +74a872c594e53ec133b496d4aeea58f5868b3ef3 d764cc30813334f51a73552c5b7ba46255a164ef +3272b5c5a771cd4b5a4eaf4c568edeab548b2cdd 74a872c594e53ec133b496d4aeea58f5868b3ef3 +783f78a614b38a0abfd3344964530dd3f3bdd438 3272b5c5a771cd4b5a4eaf4c568edeab548b2cdd +8f4c11e8a4a8d9c81391e6559429ede40da1ac5c d764cc30813334f51a73552c5b7ba46255a164ef 783f78a614b38a0abfd3344964530dd3f3bdd438 +3cb53057600e4b54bae176a9bfb0bb1debcafba8 8f4c11e8a4a8d9c81391e6559429ede40da1ac5c +a2363ccab928063aafd2de327483623ab0a6ebd0 3cb53057600e4b54bae176a9bfb0bb1debcafba8 +49940d046f7655cc468b474dd91cf084e9d6833d a2363ccab928063aafd2de327483623ab0a6ebd0 +940fb0f3508dd0cdd7356d3945d413479d7bde8a 49940d046f7655cc468b474dd91cf084e9d6833d +1a8caeb7229830496ea94224811840be16af4786 8f4c11e8a4a8d9c81391e6559429ede40da1ac5c 940fb0f3508dd0cdd7356d3945d413479d7bde8a +dd93de5c671cecb77468f5186d4ea62dde6ef8b9 1a8caeb7229830496ea94224811840be16af4786 +c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c dd93de5c671cecb77468f5186d4ea62dde6ef8b9 +ad8cce9ccedd3483ef6d9e7343d850827b02d152 c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c +3d0a59ef78f3931d78fd94ab021f40e88708bd65 ad8cce9ccedd3483ef6d9e7343d850827b02d152 +a4f05e2458892f7192f6ecd74fae94311f4ce2ec 3d0a59ef78f3931d78fd94ab021f40e88708bd65 +072bdfeabeed7903a9b4479db53684fd99365c84 c1bc5460d828a9aff8eccff2c0d7d3cd3380ec5c a4f05e2458892f7192f6ecd74fae94311f4ce2ec +2084cba35cc5d4cf15a79a2e850c899003427ae1 072bdfeabeed7903a9b4479db53684fd99365c84 +9e1423d3d481f09620d92697d291ae64309d94a7 2084cba35cc5d4cf15a79a2e850c899003427ae1 +c93bbd9d70b386d96f6ea95f872d8d83cde7d6d4 9e1423d3d481f09620d92697d291ae64309d94a7 +2b6147676f07b8aca5a1e92ade205e150f5ad874 072bdfeabeed7903a9b4479db53684fd99365c84 c93bbd9d70b386d96f6ea95f872d8d83cde7d6d4 +d23d2cf02b39dbb84f14a056cd716d91aee485ab 2b6147676f07b8aca5a1e92ade205e150f5ad874 +69bc787c6c181557be0a47b3cdcf98855bc796ac d23d2cf02b39dbb84f14a056cd716d91aee485ab +e5659a6180053e8fd5d9e7457a4cbc642ac564a5 69bc787c6c181557be0a47b3cdcf98855bc796ac +b1be0f09da209fa5c21855272b108120df42b139 e5659a6180053e8fd5d9e7457a4cbc642ac564a5 +ce971b5770e06f221254727c4d7b4bed7ec8f7b9 b1be0f09da209fa5c21855272b108120df42b139 +d60c3dae519d88aed07b22f5f5759a40ab6238a1 2b6147676f07b8aca5a1e92ade205e150f5ad874 ce971b5770e06f221254727c4d7b4bed7ec8f7b9 +5e7d6c1f1effc7c24c35b28230d0149a733da96a d60c3dae519d88aed07b22f5f5759a40ab6238a1 +5b8b22869c263fa6c7c597bc273f36eb47cac013 5e7d6c1f1effc7c24c35b28230d0149a733da96a +4f54277ca087f9e45fce823269f55512c2cb085d 5b8b22869c263fa6c7c597bc273f36eb47cac013 +2d8066a06a68e57eb62255dd1ec526bbc6cd35ad d60c3dae519d88aed07b22f5f5759a40ab6238a1 4f54277ca087f9e45fce823269f55512c2cb085d +e2a58a9efd988277050825c55122da850d3d69c9 2d8066a06a68e57eb62255dd1ec526bbc6cd35ad +d8a4bbf2a1befe997c8e1dd261a7f8e38b2aa45b e2a58a9efd988277050825c55122da850d3d69c9 +31b19ade36889fa901af831ba3ee3e9763a26e92 d8a4bbf2a1befe997c8e1dd261a7f8e38b2aa45b +3ab98e167ff6b02ae4986684f691f213605486c7 31b19ade36889fa901af831ba3ee3e9763a26e92 +1e288a3ffd766c80e385c0cea3af9601d71d0c0e 3ab98e167ff6b02ae4986684f691f213605486c7 +013f6b576144c18b2bf26914b6801589b6cdb014 2d8066a06a68e57eb62255dd1ec526bbc6cd35ad 1e288a3ffd766c80e385c0cea3af9601d71d0c0e +3858fd3d2f912fbcacbc0e296b9191d7a76ea11c 013f6b576144c18b2bf26914b6801589b6cdb014 +aac31a74f9486d42dd791d9996be2a7ec5497788 3858fd3d2f912fbcacbc0e296b9191d7a76ea11c +1ea311c63cf2498df5ca8705a283e79c84a6013a aac31a74f9486d42dd791d9996be2a7ec5497788 +81ec9606f5290a5183f5cfaef8687fa9f27caaf1 1ea311c63cf2498df5ca8705a283e79c84a6013a +1f1f8e8d5bb929087f80976490e5235d0867ccec 3858fd3d2f912fbcacbc0e296b9191d7a76ea11c 81ec9606f5290a5183f5cfaef8687fa9f27caaf1 +13159378e53b07dd42b16fa932726816baa91ebb 1f1f8e8d5bb929087f80976490e5235d0867ccec +6bf57dbfe70a05eb1bb24f160049e08987debf76 13159378e53b07dd42b16fa932726816baa91ebb +4c5bf28cb47c6858c0b5c7e23b3c9b6e8976f245 6bf57dbfe70a05eb1bb24f160049e08987debf76 +c857f191998c9a21ebe208ac5836ddb9d8ad2dff 4c5bf28cb47c6858c0b5c7e23b3c9b6e8976f245 +fe8cf039232eb484f4156c94a30aec26bafa2ab0 c857f191998c9a21ebe208ac5836ddb9d8ad2dff +c183dd2bbfa14939cceae0a135383c535eddf40c fe8cf039232eb484f4156c94a30aec26bafa2ab0 +2ccb8aa04a1762b2bdb0bb04f1a09ba2355cd459 1f1f8e8d5bb929087f80976490e5235d0867ccec c183dd2bbfa14939cceae0a135383c535eddf40c +73d9f634e6a32ad4f57c3e8d4b97b3645346f841 2ccb8aa04a1762b2bdb0bb04f1a09ba2355cd459 +bf53175d6828493ed6f1035a096e29e887c4d453 73d9f634e6a32ad4f57c3e8d4b97b3645346f841 +50a131f78bd97cf0720fd166549a018933c980c2 73d9f634e6a32ad4f57c3e8d4b97b3645346f841 +6592a445e102f682fad63683886dd9e4b6d0501d 50a131f78bd97cf0720fd166549a018933c980c2 +ccc8b66559831ca9a82a2b970dfc53a783ff8016 6592a445e102f682fad63683886dd9e4b6d0501d +68b4bc3916353c2fd4ca245dfe843020ce70c36c bf53175d6828493ed6f1035a096e29e887c4d453 ccc8b66559831ca9a82a2b970dfc53a783ff8016 +c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a 68b4bc3916353c2fd4ca245dfe843020ce70c36c +de30cae90accfb956ac2bee55810213c1f31f334 c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a +8913cd87e692e4e09091654f8934a214c194575b c3a5196f17b3aacffdd754d1bc2bc0bc09fc6a2a +af8d8fe258455ec182f359975b01b5659827e044 8913cd87e692e4e09091654f8934a214c194575b +894d63ed095517d0391560a4f0fcbe1eac3c30cf af8d8fe258455ec182f359975b01b5659827e044 +862e23e85313f3fd15cddcab6b340e68c6d64567 de30cae90accfb956ac2bee55810213c1f31f334 894d63ed095517d0391560a4f0fcbe1eac3c30cf +102e47f761c3e787770bd9956cb3f284526cdb60 862e23e85313f3fd15cddcab6b340e68c6d64567 +8d5d4edac52645fd4aaefc087fe46425f7573218 de30cae90accfb956ac2bee55810213c1f31f334 +a9cedfd5ecba3fcc41fef90dc9795e24de90d937 8d5d4edac52645fd4aaefc087fe46425f7573218 +c7af6ffd5f65c6be18067eea24f1cfd5846c3d2c a9cedfd5ecba3fcc41fef90dc9795e24de90d937 +efef65b05bf00b4fd8b10c9f06fbab718fb2cd54 c7af6ffd5f65c6be18067eea24f1cfd5846c3d2c +b9c6a199a4106b0fb1a52d1ddd4315a637507b4e 862e23e85313f3fd15cddcab6b340e68c6d64567 efef65b05bf00b4fd8b10c9f06fbab718fb2cd54 +ff9c52c2291c630a9be5caa6cf06d4e78be6536d 102e47f761c3e787770bd9956cb3f284526cdb60 b9c6a199a4106b0fb1a52d1ddd4315a637507b4e +e1fcff1ef390945536ad68d7533cf3799f73e100 ff9c52c2291c630a9be5caa6cf06d4e78be6536d +3612b82a351d19d5bbc0c55cf92f3fd0fdd4473c ff9c52c2291c630a9be5caa6cf06d4e78be6536d +84bab359b6d205149be3737648abd653435ccc37 3612b82a351d19d5bbc0c55cf92f3fd0fdd4473c +86f17a350efede5eb363dfaec09cf7fbd7089224 84bab359b6d205149be3737648abd653435ccc37 +e9c451833d785482dc4600f26f9a0803e92c41f8 e1fcff1ef390945536ad68d7533cf3799f73e100 86f17a350efede5eb363dfaec09cf7fbd7089224 +988969dabd279bcb52bb57706a0a91234ad3a25e e9c451833d785482dc4600f26f9a0803e92c41f8 +65b1040debb2f2fa0bf18d764de519b1f0aa4b9f 988969dabd279bcb52bb57706a0a91234ad3a25e +6d3af421ff1e1b97db8546108405936e3a0bdb4a 65b1040debb2f2fa0bf18d764de519b1f0aa4b9f +d401961ae04b3af0cc9ae62b26b8eab7abc26e05 6d3af421ff1e1b97db8546108405936e3a0bdb4a +cc65f9ea9f08cd0e7efbdb518469121914223b04 d401961ae04b3af0cc9ae62b26b8eab7abc26e05 +71aae3a219b6fa8a6c1cb8ec68b15c9491744463 65b1040debb2f2fa0bf18d764de519b1f0aa4b9f cc65f9ea9f08cd0e7efbdb518469121914223b04 +7cbbfed2108ced24130049e905d7a158e2178729 71aae3a219b6fa8a6c1cb8ec68b15c9491744463 +dfc92f43c2aefc934c01a3db34eb4f36c3743205 7cbbfed2108ced24130049e905d7a158e2178729 +86c70c7ec1a3ec84a7c7f7ecc91f6e12e09432d9 dfc92f43c2aefc934c01a3db34eb4f36c3743205 +c062c79335c58753a4b3b55c57014330cd2272b0 7cbbfed2108ced24130049e905d7a158e2178729 +adab16a28cab1f78b5d6e9b98c20e070d3df5e39 c062c79335c58753a4b3b55c57014330cd2272b0 +8b27a66d58f0d195d6a13ab9c419754fab5d3c1a adab16a28cab1f78b5d6e9b98c20e070d3df5e39 +cd92ff2e306fb39afe02167c7698e726c48456b2 8b27a66d58f0d195d6a13ab9c419754fab5d3c1a +6e2e2985f8b8792d24d541cb4d2523e79a054970 dfc92f43c2aefc934c01a3db34eb4f36c3743205 cd92ff2e306fb39afe02167c7698e726c48456b2 +61a59b24d8bfb992bc6de9b28cab5990973efd12 86c70c7ec1a3ec84a7c7f7ecc91f6e12e09432d9 6e2e2985f8b8792d24d541cb4d2523e79a054970 +c38296f49d5a44b1c9a922a50c6eed20d0e4f9dc 6e2e2985f8b8792d24d541cb4d2523e79a054970 +c0f2c7cee8f6db9b2312ee2adf5f95846082c3c5 c38296f49d5a44b1c9a922a50c6eed20d0e4f9dc +f68607663144cc9d5b7d6b66646d219d2e1a7301 6e2e2985f8b8792d24d541cb4d2523e79a054970 c0f2c7cee8f6db9b2312ee2adf5f95846082c3c5 +ece764c62a78b8a2ee6ddbc2494035bf360eb08b 61a59b24d8bfb992bc6de9b28cab5990973efd12 f68607663144cc9d5b7d6b66646d219d2e1a7301 +17452328ca8397a0f7e8ec72ae852d22a77235a2 ece764c62a78b8a2ee6ddbc2494035bf360eb08b +bf58ea7837b07a065f7fd5137b892e62dfb3b3ff 17452328ca8397a0f7e8ec72ae852d22a77235a2 +5af07a42f203265383d6d64102c6f391e2a52926 bf58ea7837b07a065f7fd5137b892e62dfb3b3ff +d08403e9c43046b109c7058ac6f7513ad8e70138 17452328ca8397a0f7e8ec72ae852d22a77235a2 5af07a42f203265383d6d64102c6f391e2a52926 +3703c70b3b71495c3e403f1aade0ce2c6bdaac2e d08403e9c43046b109c7058ac6f7513ad8e70138 +ed72c3c58ca45a99a4c8d2b89ac855a599934641 3703c70b3b71495c3e403f1aade0ce2c6bdaac2e +2d1737405c7704b673dcd228c19901299de6cba1 ed72c3c58ca45a99a4c8d2b89ac855a599934641 +72dbd9f0ad0581d370a520d883b3cb4c305c3878 2d1737405c7704b673dcd228c19901299de6cba1 +3f344f2f6eb1279e4e4d14671f99cf6ecf059a8d 72dbd9f0ad0581d370a520d883b3cb4c305c3878 +fb1a9163d6f1be2f169fd13a51bc25409a3b145b 3f344f2f6eb1279e4e4d14671f99cf6ecf059a8d +d68cadae094d4288c34941e3a895b24a2e519a03 fb1a9163d6f1be2f169fd13a51bc25409a3b145b +7ea52a882908151e52371cf597607717ccf706cd d68cadae094d4288c34941e3a895b24a2e519a03 +df24b03441c0ff14d1310c110a6135f3df8f2f55 3703c70b3b71495c3e403f1aade0ce2c6bdaac2e 7ea52a882908151e52371cf597607717ccf706cd +7268f60abe6cd3e7479de4c671e1a0ae0cf8b760 df24b03441c0ff14d1310c110a6135f3df8f2f55 +1f9af26abb6542ab2c907fa5069ac1b180b06174 7268f60abe6cd3e7479de4c671e1a0ae0cf8b760 +cf8aa119d57a77416f7b2a7463fe89a2b2c63e0e 1f9af26abb6542ab2c907fa5069ac1b180b06174 +dde4f18f1690be4184cb43722e9a151b839877c8 cf8aa119d57a77416f7b2a7463fe89a2b2c63e0e +54403c9ecad86164ca2251cd32ef84d8d860ec52 dde4f18f1690be4184cb43722e9a151b839877c8 +39ef4afd165ed51d23a2dae5c4eca0f1c05b9819 54403c9ecad86164ca2251cd32ef84d8d860ec52 +9e3e3973b6629a4299c6d20349a78d1541cc7e9f cf8aa119d57a77416f7b2a7463fe89a2b2c63e0e 39ef4afd165ed51d23a2dae5c4eca0f1c05b9819 +3403b7f499a8e1b33f1ad13bd8deb244c9ee2c47 9e3e3973b6629a4299c6d20349a78d1541cc7e9f +87e249f0078f95873d8b5b48d13b753ffd6f0ad5 3403b7f499a8e1b33f1ad13bd8deb244c9ee2c47 +ba23a7ff5e4829e0acf3b9314326e320627b99a6 87e249f0078f95873d8b5b48d13b753ffd6f0ad5 +41beaa1ba3ff32c9fb4ee8ea66f228aece64fb77 ba23a7ff5e4829e0acf3b9314326e320627b99a6 +890b9d80975c372288fa5d10ae81646448cf8f12 41beaa1ba3ff32c9fb4ee8ea66f228aece64fb77 +86c7eef360162cfc0cab79ccc09b7807f6225d8b 87e249f0078f95873d8b5b48d13b753ffd6f0ad5 890b9d80975c372288fa5d10ae81646448cf8f12 +988a7e231e920a34a03b3422d0456179c5d6257c 86c7eef360162cfc0cab79ccc09b7807f6225d8b +cbfe8a34cdf33a37649028b2819aee8e9b5a8b10 988a7e231e920a34a03b3422d0456179c5d6257c +5b1495ac9400aa9ab2d91943022ad485a4aeb1c7 cbfe8a34cdf33a37649028b2819aee8e9b5a8b10 +05fa47e2f9c691beeabcd26c8aaaa8d8edea8369 5b1495ac9400aa9ab2d91943022ad485a4aeb1c7 +7b66a564741358211552296404d525acde327bd6 988a7e231e920a34a03b3422d0456179c5d6257c 05fa47e2f9c691beeabcd26c8aaaa8d8edea8369 +2c89dfbbe12f7778bd7470c10b060490f0ba5c37 7b66a564741358211552296404d525acde327bd6 +dca69883c9f0de578bca9f5bec9b1c13e66e8f81 2c89dfbbe12f7778bd7470c10b060490f0ba5c37 +a7e18d3c16c99c965d10ed5a975b79746dff4e54 dca69883c9f0de578bca9f5bec9b1c13e66e8f81 +7431df97d1b26ecd9d5d963a5be72ccbba9456fe a7e18d3c16c99c965d10ed5a975b79746dff4e54 +42318160a7025c994de1e0cf582de61e57cafbcc 2c89dfbbe12f7778bd7470c10b060490f0ba5c37 7431df97d1b26ecd9d5d963a5be72ccbba9456fe +340dd3183ccce0be1f3b0271fcac50849349f8eb 42318160a7025c994de1e0cf582de61e57cafbcc +73a6dacb20f69631264f20721bb2c2a29aabbea2 340dd3183ccce0be1f3b0271fcac50849349f8eb +e9fa8b4ec916543cb5191d58717f9f95da214a29 73a6dacb20f69631264f20721bb2c2a29aabbea2 +5c6a51c2739d7e9483dac1bd23d7f3c89660bce6 e9fa8b4ec916543cb5191d58717f9f95da214a29 +f083935344ab3e879dd472f230d71684194c7454 5c6a51c2739d7e9483dac1bd23d7f3c89660bce6 +fde4cab851744e70527c708522cfbe0c425e7174 f083935344ab3e879dd472f230d71684194c7454 +8117124b5fe53a2528266b56d6012ef5f8d70a96 fde4cab851744e70527c708522cfbe0c425e7174 +824b988b16d97a1cbb860b41fbf0c64e60cb79f8 8117124b5fe53a2528266b56d6012ef5f8d70a96 +3bf044ef35e102d128abe45e62a333e43c53b10c 824b988b16d97a1cbb860b41fbf0c64e60cb79f8 +6c74a0fae9a793ac115fc2c07e5cf85846c15542 3bf044ef35e102d128abe45e62a333e43c53b10c +b5c53d501c88ed486f401694aceed58c8054ece3 6c74a0fae9a793ac115fc2c07e5cf85846c15542 +17f1e38e59dae7bb0f4b4d14cde6c6e5f570db41 b5c53d501c88ed486f401694aceed58c8054ece3 +6507a7d891f62421d9fd63872c5079d07fcaff51 17f1e38e59dae7bb0f4b4d14cde6c6e5f570db41 +437167a46827c16cdc21de681674d9ca85f3a9eb 6507a7d891f62421d9fd63872c5079d07fcaff51 +bef43bec399c981d91091ba68f1ed421c69b849a 437167a46827c16cdc21de681674d9ca85f3a9eb +6b88ceb440c760c8a808cece74116d8d7473fe2f bef43bec399c981d91091ba68f1ed421c69b849a +aba203698f0145303324db59148726689ee29730 6b88ceb440c760c8a808cece74116d8d7473fe2f +99be2b21770f903e531c7b649f174bf4fbd510ab aba203698f0145303324db59148726689ee29730 +260ab4bae97705a3f03b7ebfe06f61a99341ed3c 99be2b21770f903e531c7b649f174bf4fbd510ab +b88347eec1e536b5b964f52473a6e551aa6893ef 260ab4bae97705a3f03b7ebfe06f61a99341ed3c +d0fac4aa908772f90de4bf09c55a324a155741dd b88347eec1e536b5b964f52473a6e551aa6893ef +3f7d71f79b1d762a9bcf6b9978d7e844ae8b4dd9 d0fac4aa908772f90de4bf09c55a324a155741dd +d9cbc7f7fe9ac399b58643c13b70538810e2fc56 3f7d71f79b1d762a9bcf6b9978d7e844ae8b4dd9 +f9913c1f77908a1f876b188e560af9eeb9e94f7d d9cbc7f7fe9ac399b58643c13b70538810e2fc56 +70e59823fa46029be22939b153c34cb347c0f161 f9913c1f77908a1f876b188e560af9eeb9e94f7d +9f9f054d1ac052d29f84a1664620913e8f1bb4f2 70e59823fa46029be22939b153c34cb347c0f161 +70074f30fe2909e8e1124bb7c85c43fc62b8b79c 9f9f054d1ac052d29f84a1664620913e8f1bb4f2 +7517b1758d382be537083c17b8c9fb6abf5f20b0 70074f30fe2909e8e1124bb7c85c43fc62b8b79c +1f8a18070866f977fba8e822da538bf1ab54c702 7517b1758d382be537083c17b8c9fb6abf5f20b0 +e01195967bdcc895e58175a31956d2be35c3c37a 1f8a18070866f977fba8e822da538bf1ab54c702 +60d6e5b2531e2900321ac7e47ecb76003998fabc e01195967bdcc895e58175a31956d2be35c3c37a +178b2d6a53436766b5b7eadf697902d2d3531704 60d6e5b2531e2900321ac7e47ecb76003998fabc +03866a8fa47d115f783ed924748c2e2f6c0197b3 178b2d6a53436766b5b7eadf697902d2d3531704 +9e4ba479ad85d9804f5a6a98ab93a28c7dc5a183 03866a8fa47d115f783ed924748c2e2f6c0197b3 +62f6ab409eb957176aa98127f33b5979e52993b9 9e4ba479ad85d9804f5a6a98ab93a28c7dc5a183 +4eebcffaacbf4242e27088d56a75c80c9e114657 62f6ab409eb957176aa98127f33b5979e52993b9 +e17a3684595599b2cf431800bd43b156b770f3a7 4eebcffaacbf4242e27088d56a75c80c9e114657 +adc35b9bd035ed2a79addf3c3dec2f310301bfa1 e17a3684595599b2cf431800bd43b156b770f3a7 +d988253e8b72f1880b39da5c71dd0b47d9c647a8 adc35b9bd035ed2a79addf3c3dec2f310301bfa1 +0b6b8a16f4e7abab0937255ecadeb1b272f985d0 d988253e8b72f1880b39da5c71dd0b47d9c647a8 +52c3e16ec59650dd749f2a166538051ca39f6291 0b6b8a16f4e7abab0937255ecadeb1b272f985d0 +d8c4d8839f52accd6f86839422fe08af2a9842b8 52c3e16ec59650dd749f2a166538051ca39f6291 +112a10fa9910b4988c4e5b618997c4751e0e6135 d8c4d8839f52accd6f86839422fe08af2a9842b8 +176364bf3288dcfc985f0be10e3b8fe6a7bc2fba 112a10fa9910b4988c4e5b618997c4751e0e6135 +18b98305a5df659f3561f254a088da9559078476 176364bf3288dcfc985f0be10e3b8fe6a7bc2fba +5a06c0b9e628adc799952075bd0fb5c1f842453e 18b98305a5df659f3561f254a088da9559078476 +8e38247a81ef0dfc0269f926f8d1384da3ce9945 5a06c0b9e628adc799952075bd0fb5c1f842453e +77bb48bdcde509d177c5f02049f1524e44dc1781 8e38247a81ef0dfc0269f926f8d1384da3ce9945 +c4c9bfe0a4b9b04813fb16638e19df42fa125a35 77bb48bdcde509d177c5f02049f1524e44dc1781 +14640926f770abd3c63bd58983ae3f67942982df c4c9bfe0a4b9b04813fb16638e19df42fa125a35 +b54ecc83c989142893e202043fbf7a2bb3752652 14640926f770abd3c63bd58983ae3f67942982df +7ae697c88f12ce8ea4bb5f2629724bb969b2ebef b54ecc83c989142893e202043fbf7a2bb3752652 +e5be540473fd2198a41f84c000d1451631964fa8 7ae697c88f12ce8ea4bb5f2629724bb969b2ebef +7b6a1ba0c83dd093a638d8b6277bdc0d42cee092 e5be540473fd2198a41f84c000d1451631964fa8 +3cbf82750a063521addc6f6084bdf113e32104a9 7b6a1ba0c83dd093a638d8b6277bdc0d42cee092 +2f5ee86d748b4ea6587430284c77bdec5b059cf8 3cbf82750a063521addc6f6084bdf113e32104a9 +f660e56dc10a0843bd0fe94908e2c8a298ca7430 2f5ee86d748b4ea6587430284c77bdec5b059cf8 +3bc50253cf6693bf16805d5495e5b98f76d58e7b f660e56dc10a0843bd0fe94908e2c8a298ca7430 +74751db61e1f3e4ac0719b6759dfb8745d8a13d5 3bc50253cf6693bf16805d5495e5b98f76d58e7b +7246990a4fab68dec2ca52eaa44813be956a6477 74751db61e1f3e4ac0719b6759dfb8745d8a13d5 +76aa08271f475cef48b95fa9056322748202d405 7246990a4fab68dec2ca52eaa44813be956a6477 +7086f5c63cf3b110fa1fcb93b4eb9b7a112ae1e9 76aa08271f475cef48b95fa9056322748202d405 +cfa4906cda3ecc8c8910fb2b4c7e57037485016c 7086f5c63cf3b110fa1fcb93b4eb9b7a112ae1e9 +b4855889af1cdc2231d5a3d227198f0655c7fbd2 cfa4906cda3ecc8c8910fb2b4c7e57037485016c +87a23e814b72a1a7812a27c5648dfd67a56c4965 b4855889af1cdc2231d5a3d227198f0655c7fbd2 +1fcf7069f493e1dfd1046f4bc99c8bd5af04c0de 87a23e814b72a1a7812a27c5648dfd67a56c4965 +055ecfe62a721aa823af5528b54f76f540389876 cfa4906cda3ecc8c8910fb2b4c7e57037485016c 1fcf7069f493e1dfd1046f4bc99c8bd5af04c0de +3c1abe164573561f7ecfd3c0139ee6472c5d7229 055ecfe62a721aa823af5528b54f76f540389876 +9eac3e64263ad5fb1796d09ff63b78c181c9d707 3c1abe164573561f7ecfd3c0139ee6472c5d7229 +da8654e654e5b9f6a66d19571acf73fafeddb672 9eac3e64263ad5fb1796d09ff63b78c181c9d707 +033b45f8f02b870d6bf31061a7406ce2afd63f39 da8654e654e5b9f6a66d19571acf73fafeddb672 +ad9e609a0aad4c10622526e2cd6c1ce0275bdb4f 033b45f8f02b870d6bf31061a7406ce2afd63f39 +50e058906afaa9e38b81e997092416ea52e657d5 3c1abe164573561f7ecfd3c0139ee6472c5d7229 ad9e609a0aad4c10622526e2cd6c1ce0275bdb4f +282650ad3984d87ba001b11fc49ecaca51184c87 50e058906afaa9e38b81e997092416ea52e657d5 +508a93efce99069fd93131e2474eda19b715f354 282650ad3984d87ba001b11fc49ecaca51184c87 +48334d1f8218404b17a2a934d9e33130b6e45d6d 508a93efce99069fd93131e2474eda19b715f354 +6a3ab615b1037140852126692f5d473d930e8bdf 48334d1f8218404b17a2a934d9e33130b6e45d6d +e1f10b7000b570479738bbb437120264dcca1bb1 6a3ab615b1037140852126692f5d473d930e8bdf +d5060cd307a2b2c382d0b31fbda39922563d6d1e e1f10b7000b570479738bbb437120264dcca1bb1 +568026e4e6ac38cdd0750d988a52c13a94b0fb74 d5060cd307a2b2c382d0b31fbda39922563d6d1e +c407e57b351240de82e5385f3ac5dfda5bdb4dfe 6a3ab615b1037140852126692f5d473d930e8bdf +95b68a4d9986cacd046ba33cd3e2b68e159fa3bd c407e57b351240de82e5385f3ac5dfda5bdb4dfe +1988f2487c9b8073606b66ee5d69ffe02e814723 e1f10b7000b570479738bbb437120264dcca1bb1 95b68a4d9986cacd046ba33cd3e2b68e159fa3bd +99e1be09eb774563464baf70abcd9eab0f64fabe 568026e4e6ac38cdd0750d988a52c13a94b0fb74 1988f2487c9b8073606b66ee5d69ffe02e814723 +8d8795f7dbea27aebed5aeead5c3359affd0bfac 99e1be09eb774563464baf70abcd9eab0f64fabe +883840e54449e25193dd66d3c46512b75d0272c5 8d8795f7dbea27aebed5aeead5c3359affd0bfac +c76b1be92c12462686e0be5330d336a80762f612 883840e54449e25193dd66d3c46512b75d0272c5 +8ffb55771df36bddd02a7c87eee246f386c7a764 c76b1be92c12462686e0be5330d336a80762f612 +11e59efa7b877584032d15a9b8e1c438331d944f 8ffb55771df36bddd02a7c87eee246f386c7a764 +22452d9341226b7b6d92ef13f084436b644bd51f 11e59efa7b877584032d15a9b8e1c438331d944f +0a6b4180ba2acd0aa76eaacbcab98b78c8b86bac 22452d9341226b7b6d92ef13f084436b644bd51f +51abdc1dd83ad04d8ee293a8eeb7d9a38916699f 0a6b4180ba2acd0aa76eaacbcab98b78c8b86bac +3dc1ca4f94f92a9d2ec7522c6844f62f18a15670 51abdc1dd83ad04d8ee293a8eeb7d9a38916699f +679b2c05dedc610bbaf5ac318cafe2e63448770b 3dc1ca4f94f92a9d2ec7522c6844f62f18a15670 +6a4bf50836ab6a17558724c1c55516cee02c40f5 679b2c05dedc610bbaf5ac318cafe2e63448770b +a72c33eb835a86c6e3bd865a1da6d118e9d3c2ce 6a4bf50836ab6a17558724c1c55516cee02c40f5 +ee419bf89f1e58b67606adefe8ffb331a05ebb14 a72c33eb835a86c6e3bd865a1da6d118e9d3c2ce +9fddb6fda746bcf4b3d6ce0ce9012b6d669d9868 ee419bf89f1e58b67606adefe8ffb331a05ebb14 +e1d65e12abba3f7eeaeb1bfd58f94395419c08f8 9fddb6fda746bcf4b3d6ce0ce9012b6d669d9868 +4a42ed2dad9b71cdf2f53be085ee93b95a762be2 e1d65e12abba3f7eeaeb1bfd58f94395419c08f8 +1e94821c001cd849913a1b84996a5881d2f9c3e5 4a42ed2dad9b71cdf2f53be085ee93b95a762be2 +199efcc7695160b9bc2a3896b7a856479c79ee21 1e94821c001cd849913a1b84996a5881d2f9c3e5 +4aaa8bbfeb62681937b64b323e6e5aca1bfa7643 199efcc7695160b9bc2a3896b7a856479c79ee21 +f2e037f92356e54aa9a3cbec6206c32a423eaf21 4aaa8bbfeb62681937b64b323e6e5aca1bfa7643 +649b21bd1a38c7b18010f832fe5d1fcc4720a5df f2e037f92356e54aa9a3cbec6206c32a423eaf21 +3dc6bb6daad1a8be19641fc6f069fa2f7bf2db53 649b21bd1a38c7b18010f832fe5d1fcc4720a5df +92e3221132ff3e1cdbfc6a8e710830ecbea6002a 3dc6bb6daad1a8be19641fc6f069fa2f7bf2db53 +f901d45a808a19519e452a0e9753a2b91a589fdf 92e3221132ff3e1cdbfc6a8e710830ecbea6002a +dbd66705f2fe83b727cc32984abf4892abe78c9f f901d45a808a19519e452a0e9753a2b91a589fdf +6840a56ba32fc1311e4c2eba9383e4ca30bbf36e dbd66705f2fe83b727cc32984abf4892abe78c9f +e089ce6e6e619bcf3aba14ac4967926f69e57d2d 6840a56ba32fc1311e4c2eba9383e4ca30bbf36e +8999f2b51517ba19b129806834e8a8e2b9765cdb e089ce6e6e619bcf3aba14ac4967926f69e57d2d +87eefdc7d054ce9334339252744e075ab5539606 8999f2b51517ba19b129806834e8a8e2b9765cdb +7f1862c92b050c3f395e21d5c81147852975fff1 87eefdc7d054ce9334339252744e075ab5539606 +9248f79fcdb3c33bcfcb4a69cdd875d5e559c8f2 7f1862c92b050c3f395e21d5c81147852975fff1 +e03a06cd099c6439a97805fad6bdedc5321fa654 7f1862c92b050c3f395e21d5c81147852975fff1 +54b3b948dbdb957fdd388deb2ab04b84030b2132 7f1862c92b050c3f395e21d5c81147852975fff1 e03a06cd099c6439a97805fad6bdedc5321fa654 +ac8b56a69def115cf43025c0db4449298ab2dbb1 54b3b948dbdb957fdd388deb2ab04b84030b2132 +a38ad081eb013b576a77edbbd6dc4f7b923a9123 ac8b56a69def115cf43025c0db4449298ab2dbb1 +2168aa447b1edeb7452cb9ec7000f088e19ad83d a38ad081eb013b576a77edbbd6dc4f7b923a9123 +c19c73079d4dcc2b5eeef7fd3e66037cb1d676e2 54b3b948dbdb957fdd388deb2ab04b84030b2132 2168aa447b1edeb7452cb9ec7000f088e19ad83d +5107df112b57a0c59fdc4899bfaefeed38de2153 c19c73079d4dcc2b5eeef7fd3e66037cb1d676e2 +c6f567fe5050963969a6df9c632d18e870ea1803 5107df112b57a0c59fdc4899bfaefeed38de2153 +91ef121f8c481dcf08d9b48cfaad98aa6649236f c6f567fe5050963969a6df9c632d18e870ea1803 +faa8f5becf8bfd744e505cf7635302440c54cb65 91ef121f8c481dcf08d9b48cfaad98aa6649236f +2576f4aafceda324e6b6d070eeefd6133cabf294 faa8f5becf8bfd744e505cf7635302440c54cb65 +e511187e20b5d9a5474caf9a4d83a2fceef7f662 2576f4aafceda324e6b6d070eeefd6133cabf294 +0b8e74fdce4241f4bb5d978e44b1b2352925c3f1 e511187e20b5d9a5474caf9a4d83a2fceef7f662 +126dbaf402569cc74412c3628c66684904257ace 0b8e74fdce4241f4bb5d978e44b1b2352925c3f1 +aa8a053b3b9cbd11bc98ed6c6f33420f72a94f86 126dbaf402569cc74412c3628c66684904257ace +e0fb22d9185565cec01bc874e17af8d1e38f1ec7 aa8a053b3b9cbd11bc98ed6c6f33420f72a94f86 +0d25c91c9cedbd6ee303b29878b725b61da281fd e0fb22d9185565cec01bc874e17af8d1e38f1ec7 +ab3906cb967975c3669fef7f3f7216a0b6d0e929 0d25c91c9cedbd6ee303b29878b725b61da281fd +2da2e9d3ed5053f7edd9a98c96c90eab3ce1f1b6 ab3906cb967975c3669fef7f3f7216a0b6d0e929 +c7e3bb29fc33ecc575cf07ae5b78c7d6f831eb0f 2da2e9d3ed5053f7edd9a98c96c90eab3ce1f1b6 +38d26bcec7fbc009dfaf8663b5cb3b09779a5f7c c7e3bb29fc33ecc575cf07ae5b78c7d6f831eb0f +10d99eb7f02d4a54e2ae332fe244f4a3b34ae9cd 38d26bcec7fbc009dfaf8663b5cb3b09779a5f7c +cd81a23d6796d94cd95de0cc4d0ed75abd3f08ed 10d99eb7f02d4a54e2ae332fe244f4a3b34ae9cd +908f021d285854a12a27f2ce5d784075dc602b67 cd81a23d6796d94cd95de0cc4d0ed75abd3f08ed +dd5a7f64543842c523a513bd29ac9dfbc5b54150 908f021d285854a12a27f2ce5d784075dc602b67 +49adc003dc221f55c38775c6dd034c2b8ca4364f dd5a7f64543842c523a513bd29ac9dfbc5b54150 +e98adf506a1c8656fc5992f90199d910b196e697 49adc003dc221f55c38775c6dd034c2b8ca4364f +63db70dba80016b511b0941ac66d3e62459ed7fc e98adf506a1c8656fc5992f90199d910b196e697 +f265672171e9ed364322d8a5c9328ce7275420c5 63db70dba80016b511b0941ac66d3e62459ed7fc +d82777aed7dc90a660e16228c920225897290965 f265672171e9ed364322d8a5c9328ce7275420c5 +2be1fb1261436506b5d21b1fa2073a1e136aee8c d82777aed7dc90a660e16228c920225897290965 +546fc5bbb69d7f5d215e8e98854f7e29f7f0b9bb 2be1fb1261436506b5d21b1fa2073a1e136aee8c +4d4117aa37d398f469632c11e9f5fb5785987828 546fc5bbb69d7f5d215e8e98854f7e29f7f0b9bb +9ea4ba6ccb9670e1f4056a233cc6e8aa0800a748 4d4117aa37d398f469632c11e9f5fb5785987828 +3e11088f1b744bcf402ec56d0c7b0090607035f0 9ea4ba6ccb9670e1f4056a233cc6e8aa0800a748 +94f0a87b17258892698f9dc66dd57c50812fa320 3e11088f1b744bcf402ec56d0c7b0090607035f0 +3b0f47e14afef983a2761c62707d93cd75ba5539 94f0a87b17258892698f9dc66dd57c50812fa320 +4cb721a9fcad99bb04d2bf6811057e44d6bb8aa9 3b0f47e14afef983a2761c62707d93cd75ba5539 +9883b6cadfc0ac49aea31909993745b445f138a7 4cb721a9fcad99bb04d2bf6811057e44d6bb8aa9 +0f21ae846f8eeb8957d6f651fd9a60aafb1351e2 9883b6cadfc0ac49aea31909993745b445f138a7 +7e8221f9a1b4964d81e2eaf792af5c2bee49aa41 0f21ae846f8eeb8957d6f651fd9a60aafb1351e2 +2a6e0e4510fbb83c2435bb0418d2797f0d3f6b24 7e8221f9a1b4964d81e2eaf792af5c2bee49aa41 +f398b1b4a42e6c947712657e2ec89896bb7e3465 2a6e0e4510fbb83c2435bb0418d2797f0d3f6b24 +fd80dbeed34c3c9231174b18a06818262e3cef89 f398b1b4a42e6c947712657e2ec89896bb7e3465 +1ae3ea32248b0a2896e57f68ad1a40f6912d16dd fd80dbeed34c3c9231174b18a06818262e3cef89 +02662507367564a988c2459cb19c9d759cbf34c3 1ae3ea32248b0a2896e57f68ad1a40f6912d16dd +6b427054dd1ae57fd91049fe27187c7c976c6b8d 02662507367564a988c2459cb19c9d759cbf34c3 +7e66c3fb33d91dc42c8a89e58443ca698355d3d1 6b427054dd1ae57fd91049fe27187c7c976c6b8d +63f23653dba618e47d67d5e81a50ef5e26ac8457 7e66c3fb33d91dc42c8a89e58443ca698355d3d1 +ab5c268c1352c47688eecb36914a3406b11b0a5a 63f23653dba618e47d67d5e81a50ef5e26ac8457 +100ed5aaf138a541259df688d7192119d9df25ff ab5c268c1352c47688eecb36914a3406b11b0a5a +62ef8df9f82bfde879f7e15823691283ffe30ee6 100ed5aaf138a541259df688d7192119d9df25ff +2dfdbc134756509347931d52c1cc3bcb5ff864a8 62ef8df9f82bfde879f7e15823691283ffe30ee6 +6d5a70590b170cc0c7a743223e9ca8635eeae0f3 2dfdbc134756509347931d52c1cc3bcb5ff864a8 +281c0f3fa6d6825a9572e28a57e54627a01fc58b 6d5a70590b170cc0c7a743223e9ca8635eeae0f3 +271f3574dbe91c51764eec62a3df879ff782fde9 281c0f3fa6d6825a9572e28a57e54627a01fc58b +73191591e2f7c1a09fa101d89a9f16b00ffcc24b 271f3574dbe91c51764eec62a3df879ff782fde9 +a4dd34c9e6655515174dd76a829f49106ad53cf0 73191591e2f7c1a09fa101d89a9f16b00ffcc24b +79a1bd7e7c94ff2f56c6b630638470bcc5667580 a4dd34c9e6655515174dd76a829f49106ad53cf0 +7260e9a272dfbaafe955421b455294cfe1c2db0e 79a1bd7e7c94ff2f56c6b630638470bcc5667580 +cc2a5c2c20ce8ce880e8513395c2961c4cf227a2 7260e9a272dfbaafe955421b455294cfe1c2db0e +c1c47c8c5b8eb9a5a5c0616b40e35a6b6a4254f6 cc2a5c2c20ce8ce880e8513395c2961c4cf227a2 +29af5e1b832d9fb45556b2cc9a4cbf0517488707 c1c47c8c5b8eb9a5a5c0616b40e35a6b6a4254f6 +035e2c2b9e114259a69220899be93f63a7a666ae 29af5e1b832d9fb45556b2cc9a4cbf0517488707 +70f42e8f34e25130df203a8c77deb7dc30960082 035e2c2b9e114259a69220899be93f63a7a666ae +af3f5b274e4b46662e3100982759f28c42c147eb 70f42e8f34e25130df203a8c77deb7dc30960082 +dce9edab5c1599e614ec5e2b95e23ce227cc10f6 af3f5b274e4b46662e3100982759f28c42c147eb +11f2ce41fbb9b54333c976d76bf1990492b51335 dce9edab5c1599e614ec5e2b95e23ce227cc10f6 +7c8a4644d21bb95c528d9b5d85d46673cf6eee5a 11f2ce41fbb9b54333c976d76bf1990492b51335 +68c344194a8bf657b7b714b67fee38ff49ed4395 7c8a4644d21bb95c528d9b5d85d46673cf6eee5a +95e7c1899e02b677dacc0fe4e70152f81e813150 68c344194a8bf657b7b714b67fee38ff49ed4395 +b57e862288d89572c0f296bf597c6ef98ecaa00d 95e7c1899e02b677dacc0fe4e70152f81e813150 +e2de59d90c95ce464fe9e387012970805c0b8e6b b57e862288d89572c0f296bf597c6ef98ecaa00d +028b498407d43ba384890cf41d34fc79b9198c44 e2de59d90c95ce464fe9e387012970805c0b8e6b +9feaa9155860d6294a6abb85ed821b06b18832e4 028b498407d43ba384890cf41d34fc79b9198c44 +4e463677a4ce6d331246c7ebe75a4c2049702b09 9feaa9155860d6294a6abb85ed821b06b18832e4 +e270a4d59e136e0980be86a210966593aacfc638 4e463677a4ce6d331246c7ebe75a4c2049702b09 +1a2287ea8ab1e62480d4ec319054597b7b8a1b50 e270a4d59e136e0980be86a210966593aacfc638 +b2d840d4bf4e11cca38cd6e9081ebaec9688e9b6 1a2287ea8ab1e62480d4ec319054597b7b8a1b50 +5067e2af2e72f71ef64bd39480371194771adbe0 b2d840d4bf4e11cca38cd6e9081ebaec9688e9b6 +a355c77e7c9f1276c2f4d26bf4d7d6364ab63ec3 5067e2af2e72f71ef64bd39480371194771adbe0 +07e6b517f6cd47cfff2bb91f293b4349fa77b2bb a355c77e7c9f1276c2f4d26bf4d7d6364ab63ec3 +71dc092e4ca948a81c7d130bc3472e04831b4d65 07e6b517f6cd47cfff2bb91f293b4349fa77b2bb +364a3390717d7f5562c52bf4d204fcb48f119dac 71dc092e4ca948a81c7d130bc3472e04831b4d65 +f4ee66d2ce268ee878fa087bef6f9d316639c948 364a3390717d7f5562c52bf4d204fcb48f119dac +c3bb177db487c7886e0a2237673f621cac59fac4 f4ee66d2ce268ee878fa087bef6f9d316639c948 +7459c7256c9e917565757a1303868c3a394b1eb6 c3bb177db487c7886e0a2237673f621cac59fac4 +cbb581647a6c73b065182f0cb97152b9fc18881a 7459c7256c9e917565757a1303868c3a394b1eb6 +e5fe48631032d99343756c06e31c9b4612409966 cbb581647a6c73b065182f0cb97152b9fc18881a +139625b295620672009058153f6cce7fb634f5e2 e5fe48631032d99343756c06e31c9b4612409966 +2dba0a941a6db2306517b939e3c7ae52dfb2e0cb 139625b295620672009058153f6cce7fb634f5e2 +f0f3c9175f7138a83213c213f58180dbcf003d06 2dba0a941a6db2306517b939e3c7ae52dfb2e0cb +3c33685f4451657a7168389a2954552628f73fcd f0f3c9175f7138a83213c213f58180dbcf003d06 +cda6b688e0937908ed6acec23d90f13d65cf1c71 3c33685f4451657a7168389a2954552628f73fcd +4bfa79a2c4c9301543445bab7568c46a1280d695 cda6b688e0937908ed6acec23d90f13d65cf1c71 +49484ad5d03a65d8a4ad1be7f5be59bc034c907a 4bfa79a2c4c9301543445bab7568c46a1280d695 +a99ad52e455c59b888d548744df6d208be972375 49484ad5d03a65d8a4ad1be7f5be59bc034c907a +af690b36182555f1b49abd59060fb6199b1de54a a99ad52e455c59b888d548744df6d208be972375 +7bec88662584f4ee7a419de22e455b42457819f5 af690b36182555f1b49abd59060fb6199b1de54a +84be336fcb3eb3789d39b4188088e651f1540f2d 7bec88662584f4ee7a419de22e455b42457819f5 +3bcf22eecd7b78cf9723d77a6c8da6d8ad760355 84be336fcb3eb3789d39b4188088e651f1540f2d +37e1d247cab10d2835d4394569853d957751ed02 3bcf22eecd7b78cf9723d77a6c8da6d8ad760355 +be7eee73b4272ac27d68254d9037a567348ae7cd 37e1d247cab10d2835d4394569853d957751ed02 +3d744d33365ec0c6c6e0e17da5f8a650a78ed1b8 be7eee73b4272ac27d68254d9037a567348ae7cd +60abbd2467fad5b1c39d6f48d819d77f6f90de99 3d744d33365ec0c6c6e0e17da5f8a650a78ed1b8 +eda94a6cf85090d3f3f2d3057cacfa31f46efe2d 60abbd2467fad5b1c39d6f48d819d77f6f90de99 +fadc16be25d99d2e8b2dd4de3a1755741559d6b1 eda94a6cf85090d3f3f2d3057cacfa31f46efe2d +91bbfafd614ebf885740f3e8440033da27ceef7f fadc16be25d99d2e8b2dd4de3a1755741559d6b1 +d6cae16068377a9183e3a996dc0dc53f4744da44 91bbfafd614ebf885740f3e8440033da27ceef7f +58d346f152440075ffcbaeb13e8a5810b550d5a3 d6cae16068377a9183e3a996dc0dc53f4744da44 +51980a05022bf4dadd66dc0fbd7473bcc84d55af 58d346f152440075ffcbaeb13e8a5810b550d5a3 +2a1d7079eff77d7dc465816d26ebc6ab30b9d36d 51980a05022bf4dadd66dc0fbd7473bcc84d55af +cb1f640cc0bf667cc6c552275b02323c7984f3fe 2a1d7079eff77d7dc465816d26ebc6ab30b9d36d +23f2a07e8a7ec966d484b6aab2f12a4a9cf5fe0c cb1f640cc0bf667cc6c552275b02323c7984f3fe +c934c017aa03e9f2cb42f99f6ca2360a5a1fc24c 23f2a07e8a7ec966d484b6aab2f12a4a9cf5fe0c +a655aedd92bee16971800dc3267c0845d89638d9 c934c017aa03e9f2cb42f99f6ca2360a5a1fc24c +c41493cd5d12d01a45ca116153c01bd515d1fd04 a655aedd92bee16971800dc3267c0845d89638d9 +19ccfe179a78a86fe3ea86b3943dd9df8aff19e7 c41493cd5d12d01a45ca116153c01bd515d1fd04 +4563b7a67983e25a776dc03a70dbd8e709e49294 19ccfe179a78a86fe3ea86b3943dd9df8aff19e7 +0aa2a6893a1b692297fa9ce65321f23da5c76bf5 4563b7a67983e25a776dc03a70dbd8e709e49294 +f98ad95e9c2eb3fe63f778c5cfed14a34ff0dfef 0aa2a6893a1b692297fa9ce65321f23da5c76bf5 +dfa5b1ddc81b2c24d282698e174e0b134ee5fe9a f98ad95e9c2eb3fe63f778c5cfed14a34ff0dfef +ffdc34e681f2021e8d9deb77faec13fc0e8c0b26 dfa5b1ddc81b2c24d282698e174e0b134ee5fe9a +d0e6f4dd957f000b8fd0f88e1c5d2659865777eb ffdc34e681f2021e8d9deb77faec13fc0e8c0b26 +cba5689bec7ccbf7ccbc504646d7f33dd54419c6 d0e6f4dd957f000b8fd0f88e1c5d2659865777eb +516abc9349f7493ba7f5d76dab9f40ceb22397c2 cba5689bec7ccbf7ccbc504646d7f33dd54419c6 +49472d3e585be482d975cb6b975ea0baf35d6c45 516abc9349f7493ba7f5d76dab9f40ceb22397c2 +6f03b436a1b817f58cd06148992cdb7c1a18aa2f 49472d3e585be482d975cb6b975ea0baf35d6c45 +42742afbca4faf460f5586eb8764d58ded017a7f 6f03b436a1b817f58cd06148992cdb7c1a18aa2f +f46357db480fc84c43c43b17724e2d35083a9767 42742afbca4faf460f5586eb8764d58ded017a7f +2effd85497dbd711be8f683d535feae81264a878 f46357db480fc84c43c43b17724e2d35083a9767 +91c2d3830d641b68ec4f799dc91f4fbae960dd41 2effd85497dbd711be8f683d535feae81264a878 +7ed5b9cb2d25a58fad7640301bc72bc61b05378f 91c2d3830d641b68ec4f799dc91f4fbae960dd41 +31eb144f3a649d75d49e84776e5b534f074d4920 7ed5b9cb2d25a58fad7640301bc72bc61b05378f +d221cbcdf75726a01397bb17c21481454dda89a2 31eb144f3a649d75d49e84776e5b534f074d4920 +fb7ee8e306080d64af83284319266a3b3b080f6c d221cbcdf75726a01397bb17c21481454dda89a2 +42d5be6f9a2810a2b7064349c11a76c1b00c3882 fb7ee8e306080d64af83284319266a3b3b080f6c +c7b30bc56d59982dc55548d9c25ddd7d06eef2ae 42d5be6f9a2810a2b7064349c11a76c1b00c3882 +337ceba6bf9a2224ce119a39fb4283986197f402 c7b30bc56d59982dc55548d9c25ddd7d06eef2ae +5f653b6c13d4d49928108b61703cef640f9c34e2 337ceba6bf9a2224ce119a39fb4283986197f402 +40d323622a413a7666bd6966ed49b1c48ffd292b 5f653b6c13d4d49928108b61703cef640f9c34e2 +b767251360428ef75f9a44e0d9abcf36d1f04eb5 40d323622a413a7666bd6966ed49b1c48ffd292b +accaccfddace4e79eb47453f175bb02bb25825b5 b767251360428ef75f9a44e0d9abcf36d1f04eb5 +128b8eff4f544ecdf1e4c8cbbf2af7348eb41de3 accaccfddace4e79eb47453f175bb02bb25825b5 +860a86952d2cfd15f592c8c01a381274e5fe8f28 128b8eff4f544ecdf1e4c8cbbf2af7348eb41de3 +b8fbaa4ba7a0d5982b1fcedcdc6b4a59cee0c31f 860a86952d2cfd15f592c8c01a381274e5fe8f28 +ab6de5935db7e3eedd9224a681606297af730dbd b8fbaa4ba7a0d5982b1fcedcdc6b4a59cee0c31f +d4306d9ddbfc1a6226141e5fbf218c2f2c731d7b ab6de5935db7e3eedd9224a681606297af730dbd +9372003c5fd9a025b6f70647690f9d106e81111a d4306d9ddbfc1a6226141e5fbf218c2f2c731d7b +b33b4670a5bac829ac2647e8e9b32ab705742d0e 9372003c5fd9a025b6f70647690f9d106e81111a +1be53c26196de044f7f3be99d6b13fb67ab86bac b33b4670a5bac829ac2647e8e9b32ab705742d0e +2c050b742467e98a093d0c463e04f6e5f0d69e70 1be53c26196de044f7f3be99d6b13fb67ab86bac +455bcbadfd2ae64209bd12cbe2081d056885c75a 2c050b742467e98a093d0c463e04f6e5f0d69e70 +beb581b226d4f7d6b86cb3e861080df6d90226e4 455bcbadfd2ae64209bd12cbe2081d056885c75a +82a3f94476498ac0a1272b17d8abee82e2bbebfc beb581b226d4f7d6b86cb3e861080df6d90226e4 +40d0869d04fbc67a66f512a616675f3f1a673c5a 82a3f94476498ac0a1272b17d8abee82e2bbebfc +4dc7ad508ff4980f84342d397a70be9c4156d958 40d0869d04fbc67a66f512a616675f3f1a673c5a +6a8ea7f2602d01652566a160c4153b788de76c7b 4dc7ad508ff4980f84342d397a70be9c4156d958 +e5c93a065adcdf92e357b41e1a15cef929b6e3d7 6a8ea7f2602d01652566a160c4153b788de76c7b +a38faf2e9952b805ce89975cb2d6eb240466c6af e5c93a065adcdf92e357b41e1a15cef929b6e3d7 +76c255d722256e5fef598119836204dfedcdcffa a38faf2e9952b805ce89975cb2d6eb240466c6af +0819d6373a92c624ff60717e6c542d4ed961a353 76c255d722256e5fef598119836204dfedcdcffa +13e064c12dfa99508f56dfeb81d829f5ac105a9f 0819d6373a92c624ff60717e6c542d4ed961a353 +541843eadbba9328993d6be9244aeb5293dad37c 13e064c12dfa99508f56dfeb81d829f5ac105a9f +db72c248e8c81c95b74d86935b1917d80b21c9fe 541843eadbba9328993d6be9244aeb5293dad37c +c3558d2539d2751dbdf6721ed928c1b85e979a42 db72c248e8c81c95b74d86935b1917d80b21c9fe +375a139ebb4d68fe869a2c3f1c570fc8ab8bcb98 c3558d2539d2751dbdf6721ed928c1b85e979a42 +90b4c8bf9faa84d2a9e04dbd731fa19bacfdf03a 375a139ebb4d68fe869a2c3f1c570fc8ab8bcb98 +a354e45db53dd07623bd55e078809724a982d924 90b4c8bf9faa84d2a9e04dbd731fa19bacfdf03a +4baaab960b828d441aada19c44bbdf1b53b29dbf a354e45db53dd07623bd55e078809724a982d924 +8c1f53b22a9565c771d9e4e2a40196c0fd74ac7d 4baaab960b828d441aada19c44bbdf1b53b29dbf +1507ceacd21e70c287a570a7d7f9027df5166ce6 8c1f53b22a9565c771d9e4e2a40196c0fd74ac7d +7ac43ca7fd2d306b29c0991be655c7780c15617a 1507ceacd21e70c287a570a7d7f9027df5166ce6 +39f997e48d326dfa78e35af55def4f484723a796 7ac43ca7fd2d306b29c0991be655c7780c15617a +673c537665be4b7ae85f45a796efbb8a92d56752 7ac43ca7fd2d306b29c0991be655c7780c15617a +dc45f957c5195b7be14499980eea5f59366fe0c8 673c537665be4b7ae85f45a796efbb8a92d56752 +8576794ad6cb7d13a04f9a57f597488eb6d0fa48 dc45f957c5195b7be14499980eea5f59366fe0c8 +f444e2bc1e11345aef415d8c3aa28b90414cadc8 8576794ad6cb7d13a04f9a57f597488eb6d0fa48 +0dd220a8e3ce43b18112c4990f1fe48afdab1a8b f444e2bc1e11345aef415d8c3aa28b90414cadc8 +a5b949f9c92ef8cc6c48691a2430aaaeedb3fbed 0dd220a8e3ce43b18112c4990f1fe48afdab1a8b +eea806c9fd982fd46656cf3253e4082f3c4a76be a5b949f9c92ef8cc6c48691a2430aaaeedb3fbed +75b20575baffd9e7ba55bade21546641ca787ae4 eea806c9fd982fd46656cf3253e4082f3c4a76be +0c403284cba4af1f39d0482e339158c59a6939f9 75b20575baffd9e7ba55bade21546641ca787ae4 +995d116125fb97980d4c597b222681aab887c839 0c403284cba4af1f39d0482e339158c59a6939f9 +4db6b8edcd7f3ee889320e9102568e5648860510 995d116125fb97980d4c597b222681aab887c839 +b1fef53752926310be3bc95aa8e19d3e6001577e 4db6b8edcd7f3ee889320e9102568e5648860510 +e00c6958c98914d391f3bc74d5f6db0d3e082ede b1fef53752926310be3bc95aa8e19d3e6001577e +8766248bb0c4d54270b3d8f7c4088d30a21095cb e00c6958c98914d391f3bc74d5f6db0d3e082ede +495e7caaf151dee3aacacbc318e242ebf61b5726 8766248bb0c4d54270b3d8f7c4088d30a21095cb +ced2e70006e306c660852ebcb4536814587c8839 495e7caaf151dee3aacacbc318e242ebf61b5726 +1b6cf104f03854a1ba754826a7c6cecb0bf21522 ced2e70006e306c660852ebcb4536814587c8839 +7b58256c731f7e8045b81cd38b019840889743d8 1b6cf104f03854a1ba754826a7c6cecb0bf21522 +238548bc400019f425558965ba14ea82eea3f886 7b58256c731f7e8045b81cd38b019840889743d8 +dca6476dab6b91e52f5fec8c5fc8ffe964e5a267 238548bc400019f425558965ba14ea82eea3f886 +4323dd47b38398d0f3f60b8aaf0c46a58c09d7b5 dca6476dab6b91e52f5fec8c5fc8ffe964e5a267 +7dc62a2eb6394b837bfeb38626c4953efc310c0e 4323dd47b38398d0f3f60b8aaf0c46a58c09d7b5 +c4f9e8933c50a7b1a2a502b43b9e1263a0cc348a 7dc62a2eb6394b837bfeb38626c4953efc310c0e +aee51d9e01653eda9c76a9072766d265415b4a43 c4f9e8933c50a7b1a2a502b43b9e1263a0cc348a +c95ed67921e7b9c3cd5ab14c72ddac72d61aae97 aee51d9e01653eda9c76a9072766d265415b4a43 +81648d810f7a68890093469059978abc4d871c28 c95ed67921e7b9c3cd5ab14c72ddac72d61aae97 +530d5e6182b578d859383fab6e832d1c77e496fd 81648d810f7a68890093469059978abc4d871c28 +0276b0d02cfacabce377368747e291610bc28511 530d5e6182b578d859383fab6e832d1c77e496fd +f1064db813f2086a0526d74c7b698a9141129eae 530d5e6182b578d859383fab6e832d1c77e496fd +1a8a70c1e3f112e04f5e5db9a7c18f5e451261a3 f1064db813f2086a0526d74c7b698a9141129eae +ace1c0764124f817e2ae6c790acc8c175bf8f287 1a8a70c1e3f112e04f5e5db9a7c18f5e451261a3 +f21ed18e38cb8e7c8de4b9ab33d791a521d78978 ace1c0764124f817e2ae6c790acc8c175bf8f287 +1cdae2c87d2d6eb8bb44141e9907e40d32d4642a f21ed18e38cb8e7c8de4b9ab33d791a521d78978 +56bfc754bd73d95aade48b6af3877d8aeb7a21a6 1cdae2c87d2d6eb8bb44141e9907e40d32d4642a +5fe9a156307cbca31683e754a89e1ed686d5da3b 56bfc754bd73d95aade48b6af3877d8aeb7a21a6 +f0b244c34232b4394ad16bd30ffd482052ad9178 5fe9a156307cbca31683e754a89e1ed686d5da3b +c7671a34685b0edd7596d7b5f9cfc4c0adb12847 f0b244c34232b4394ad16bd30ffd482052ad9178 +0e7a23d9fb16e8f4a39465344c2e57520593da3f 0276b0d02cfacabce377368747e291610bc28511 c7671a34685b0edd7596d7b5f9cfc4c0adb12847 +d8fb3a59a8897b06007f8f6b831a0c3333095657 0e7a23d9fb16e8f4a39465344c2e57520593da3f +01cabef2a0e91e8c9719fc412809cb051ec20d52 0e7a23d9fb16e8f4a39465344c2e57520593da3f +25ddb9e7e6cad604f652c3adc298926fe607d4bb 0e7a23d9fb16e8f4a39465344c2e57520593da3f +1bde23584b3dc89579e9658f2d2f4a37405fa88c 01cabef2a0e91e8c9719fc412809cb051ec20d52 25ddb9e7e6cad604f652c3adc298926fe607d4bb +b0e689154117e40c14710f94ab183cd3afa31bbc 1bde23584b3dc89579e9658f2d2f4a37405fa88c +ac252741425ee36eb3f22b88f3cbb17010119a72 b0e689154117e40c14710f94ab183cd3afa31bbc +2021d0c5cbb36a4f0e78865b4351e17cb12f2033 ac252741425ee36eb3f22b88f3cbb17010119a72 +ace75b5eeb4823011f0da8c8609fd5d48962e660 2021d0c5cbb36a4f0e78865b4351e17cb12f2033 +9b6ea67923cc3e9aa1272d6727999c71f1a55004 ace75b5eeb4823011f0da8c8609fd5d48962e660 +d1c71414b17aad901b29daeb96e5ff31417ad584 0e7a23d9fb16e8f4a39465344c2e57520593da3f 1bde23584b3dc89579e9658f2d2f4a37405fa88c +c2fd49ed61af1dbf6c35082ac9abe754a8835f3d d1c71414b17aad901b29daeb96e5ff31417ad584 +072649bbfd203d1117411c259f88a04c55d786c9 c2fd49ed61af1dbf6c35082ac9abe754a8835f3d ac252741425ee36eb3f22b88f3cbb17010119a72 +fa8c9d113dfe7730bb978b995703fbabcf1796ff 072649bbfd203d1117411c259f88a04c55d786c9 +c8a71bbfc6e23ee2e9be2f7c60bb4e772a5cba00 fa8c9d113dfe7730bb978b995703fbabcf1796ff 2021d0c5cbb36a4f0e78865b4351e17cb12f2033 +367e50fc44f5c8c8184074e4b9432e75b4a73233 c8a71bbfc6e23ee2e9be2f7c60bb4e772a5cba00 +768cd3f3acdbcd543476daf60f47cd1bb2f75ef1 367e50fc44f5c8c8184074e4b9432e75b4a73233 +ba333d63b9f7f5cb5884f7130800a02798e1658b 768cd3f3acdbcd543476daf60f47cd1bb2f75ef1 +0880022ad365e2647e013c43e0c5b1b21e9612d7 ba333d63b9f7f5cb5884f7130800a02798e1658b +5e979df40525267978e97895b34e041625b0c1b4 25ddb9e7e6cad604f652c3adc298926fe607d4bb +f99a5be0824993e2702bc41b33d674c76d972c24 5e979df40525267978e97895b34e041625b0c1b4 +c7a668f5ba9bc7cc8ec2cf07a34f7c2f0777e4a9 f99a5be0824993e2702bc41b33d674c76d972c24 +57cc1982854f3ff7b1a3e49bac94d27c03e222bc c7a668f5ba9bc7cc8ec2cf07a34f7c2f0777e4a9 +5ec61ac50925028cfba65fab48a495a4691da412 57cc1982854f3ff7b1a3e49bac94d27c03e222bc b0e689154117e40c14710f94ab183cd3afa31bbc +3db5fc4b95e978f55f3ac93a9a6b2ee0c18e38fa 5ec61ac50925028cfba65fab48a495a4691da412 +11947469a115c2e94819af69d2e87d274a8461e7 3db5fc4b95e978f55f3ac93a9a6b2ee0c18e38fa +4dfdd2452adb6e44a5a00c526681fcb73f955f25 11947469a115c2e94819af69d2e87d274a8461e7 +4d86cc9d483310d6d5eb02d82c39b2811322d85b 4dfdd2452adb6e44a5a00c526681fcb73f955f25 +f895a91aa453dcf7ed1a92c28ec7a8f3d39b6b2e 4d86cc9d483310d6d5eb02d82c39b2811322d85b +657d74c02b1fd68eddeff30229e772f56f30b6fc ace75b5eeb4823011f0da8c8609fd5d48962e660 +65edea925ed889c115b2d0bf9029bb4f4189f753 657d74c02b1fd68eddeff30229e772f56f30b6fc +279d29af0efcdf978707a56f31afc8610129424c 65edea925ed889c115b2d0bf9029bb4f4189f753 +3ebabeab0d15ce798f1f03f4a3b1fb3761aa020d 2021d0c5cbb36a4f0e78865b4351e17cb12f2033 +36a3f28139c69e1a602d998e0d1f0541038ee7e8 279d29af0efcdf978707a56f31afc8610129424c 3ebabeab0d15ce798f1f03f4a3b1fb3761aa020d +e98b5666f828793aa5e314e4c4c61f9faf3cff21 36a3f28139c69e1a602d998e0d1f0541038ee7e8 +d577dcae6cd4113e98200bb9ae4f1ae2cf46ee6d e98b5666f828793aa5e314e4c4c61f9faf3cff21 +2b7a7360c2bf88ea9733919c86720328bdbc1245 279d29af0efcdf978707a56f31afc8610129424c +b63e107779249aca8255fd5d9b188c96ee88440e d577dcae6cd4113e98200bb9ae4f1ae2cf46ee6d 2b7a7360c2bf88ea9733919c86720328bdbc1245 +12b8c6b8ba0477cbfc00b7e9c28e75d902c06b6c b63e107779249aca8255fd5d9b188c96ee88440e +ecd5f35077fc7ec23e2089b418ea2ec3ab09ebe4 12b8c6b8ba0477cbfc00b7e9c28e75d902c06b6c +86751abd4cd6b47dccbefe21df8e3a9b1e82defd ecd5f35077fc7ec23e2089b418ea2ec3ab09ebe4 +996b971755a33af1ffda43dcef0f4cc30d6faa39 86751abd4cd6b47dccbefe21df8e3a9b1e82defd +92fbc8ac680883802498fdabd8856d4a57a13c94 996b971755a33af1ffda43dcef0f4cc30d6faa39 +cb2f4cbc81ccb5b22b0b655e61fef8346c32626b 92fbc8ac680883802498fdabd8856d4a57a13c94 +26fa11227e3854fb84ef1c034d64da064a557ed1 b63e107779249aca8255fd5d9b188c96ee88440e +0fc5b8e55973b7c71bd6b221ebd01dd7a46128a0 cb2f4cbc81ccb5b22b0b655e61fef8346c32626b 26fa11227e3854fb84ef1c034d64da064a557ed1 +591c9c25c8759af6ebd7ca48acc61f4c93599b72 0fc5b8e55973b7c71bd6b221ebd01dd7a46128a0 +bf430edb39e57345a54e5256ac2fb2f811055691 591c9c25c8759af6ebd7ca48acc61f4c93599b72 +4d2087585182fc5dcf0403168f2d5404a721bc3f 279d29af0efcdf978707a56f31afc8610129424c +920da65e07ad911af5126c15bcf4b9d459cbe71b 4d2087585182fc5dcf0403168f2d5404a721bc3f +6988931e68ac1518e02966c56939fb0ae2efac2d 920da65e07ad911af5126c15bcf4b9d459cbe71b 11947469a115c2e94819af69d2e87d274a8461e7 +418abb19597911289b0eab34a9dd422e13a78caf 6988931e68ac1518e02966c56939fb0ae2efac2d +7781499201290a634175b1fed175f320429fdf79 418abb19597911289b0eab34a9dd422e13a78caf +b30eeea1ee237601e4afd2b39c27cc63cecf399a 7781499201290a634175b1fed175f320429fdf79 +c6ea72253bbed32dff32b7d81090d32d2c8aeee3 b30eeea1ee237601e4afd2b39c27cc63cecf399a 92fbc8ac680883802498fdabd8856d4a57a13c94 +26e00eaf9f2af44478ed29acd5a20e7d7020ed9e c6ea72253bbed32dff32b7d81090d32d2c8aeee3 +3f866c814532626dbb2fd1e95db31719487a76a6 bf430edb39e57345a54e5256ac2fb2f811055691 26e00eaf9f2af44478ed29acd5a20e7d7020ed9e +266e57226a4f699795132a31cb0fc741fcdbf0b8 3f866c814532626dbb2fd1e95db31719487a76a6 +e77e824c8c0d9ebeaad01cddff665444d0ee9420 266e57226a4f699795132a31cb0fc741fcdbf0b8 +39c1ca1ad73447b29b1aee56b1d467fd926cd559 e77e824c8c0d9ebeaad01cddff665444d0ee9420 4dfdd2452adb6e44a5a00c526681fcb73f955f25 +f4e0fc94e9768cf1d09df7a58fc41957bc9e9a44 39c1ca1ad73447b29b1aee56b1d467fd926cd559 +a497333187746e7cc1241c75260c7958f5387629 f4e0fc94e9768cf1d09df7a58fc41957bc9e9a44 +c37dc630387d838853eb928d07e0a759b723639b a497333187746e7cc1241c75260c7958f5387629 +27d500dca22dc3d493fb87c8409ccc00443bec05 c37dc630387d838853eb928d07e0a759b723639b +55cf327d0e4bfbb0c3a8f6fa54dc2a1c3a3b5606 27d500dca22dc3d493fb87c8409ccc00443bec05 +017c34081d8a7c53d3e4a2a862243ea78be733cc 55cf327d0e4bfbb0c3a8f6fa54dc2a1c3a3b5606 +cec7805a01b19a013cabef9af836b4b0c793afe2 017c34081d8a7c53d3e4a2a862243ea78be733cc +12e13a41ff9c808564a0096fa6e9057f49c9cfde cec7805a01b19a013cabef9af836b4b0c793afe2 +0c806f8a8d8619bcc31d05f50485874110312f98 12e13a41ff9c808564a0096fa6e9057f49c9cfde +3ed8b4e6229a8260c2d67fc25f3320ae3bf9ec8d 0c806f8a8d8619bcc31d05f50485874110312f98 +800e74133df7d8db422da16b52f338143a340de6 3ed8b4e6229a8260c2d67fc25f3320ae3bf9ec8d +1d53feeef3dded94e77c556f5988f7114ec961cc 800e74133df7d8db422da16b52f338143a340de6 +45441ee43b21b3ccdadfd7d7d7f91936188ab955 1d53feeef3dded94e77c556f5988f7114ec961cc +88c8224e193373b9fedd35efde5a5a6d8853c994 45441ee43b21b3ccdadfd7d7d7f91936188ab955 +50a71cb0a9de1c284e4a489e6f4d7c501c727313 88c8224e193373b9fedd35efde5a5a6d8853c994 +08de33cd202ee3c46884d07214fb999ed7323369 50a71cb0a9de1c284e4a489e6f4d7c501c727313 +d54f4c86f06a6aaf102f69c3890741141a7baf68 26e00eaf9f2af44478ed29acd5a20e7d7020ed9e +442b94556d5536a03c3dc339806a8fdd1b5f58df d54f4c86f06a6aaf102f69c3890741141a7baf68 +139cabf7dd8787b529e5a64a02df61f19b4c703c 442b94556d5536a03c3dc339806a8fdd1b5f58df +e49af2f32dfb7814e57fa404584b5934310451a9 139cabf7dd8787b529e5a64a02df61f19b4c703c +21e7c207ef98c4016ffdaed3c8e50e6c0045d8cf 139cabf7dd8787b529e5a64a02df61f19b4c703c +c345f7d3796c6d0795bc5b68f1d5813e2acf6d37 139cabf7dd8787b529e5a64a02df61f19b4c703c +38857a2c3c44b316e1f59fe64674cc463e6932d0 c345f7d3796c6d0795bc5b68f1d5813e2acf6d37 +ccd3479a7a13e2675d9eca9a874064776b2ba6b8 +f981e53dbd759f524120c4ba72ced950db097c82 ccd3479a7a13e2675d9eca9a874064776b2ba6b8 +d99a2262fcdb82c0f7a6476aa98d09529ec5f925 f981e53dbd759f524120c4ba72ced950db097c82 +14de7eae603c6810d63d40406e47db26d5c4182b d99a2262fcdb82c0f7a6476aa98d09529ec5f925 +477023ad6c7ce3c019f09b5728c302b5d3ea1c58 14de7eae603c6810d63d40406e47db26d5c4182b +44736bf9a3e24bcb623abb990b5c45632d1d64fc 14de7eae603c6810d63d40406e47db26d5c4182b 477023ad6c7ce3c019f09b5728c302b5d3ea1c58 +96d4d82afb5518922de7315bb36d69cc630aa3e6 139cabf7dd8787b529e5a64a02df61f19b4c703c +5831c3ddfb2273ad5b7ddcabaf0b8c90e6c075c8 96d4d82afb5518922de7315bb36d69cc630aa3e6 +07ffe4bf92083d127b4b984fece80a2e2e3cdf99 5831c3ddfb2273ad5b7ddcabaf0b8c90e6c075c8 +13d5e4b9a5f812cf443e92b457c4a3c018ce8a7f 07ffe4bf92083d127b4b984fece80a2e2e3cdf99 +74436c90255d6209d20bf48c7de54131affdb0bc 13d5e4b9a5f812cf443e92b457c4a3c018ce8a7f +4038367910947129882da98aa3a7f22659c2898a 74436c90255d6209d20bf48c7de54131affdb0bc +49e4b8d84ec13d31fec4c94940706810048dd0d9 4038367910947129882da98aa3a7f22659c2898a +2b9cce0bbbc3dc449f4538fc70542e9c289cfd3a 49e4b8d84ec13d31fec4c94940706810048dd0d9 +0ebf9a29f7718e9ad5a3f25999ec1f01cd54b2ea 2b9cce0bbbc3dc449f4538fc70542e9c289cfd3a +e607e2a7c9cc7236f6ac4a0a7c7cbd443e80de1e 0ebf9a29f7718e9ad5a3f25999ec1f01cd54b2ea +0de8f24fde5cf7868b3535a096954f77b85d5851 e607e2a7c9cc7236f6ac4a0a7c7cbd443e80de1e +17b2444b282b562d4247028d10dbc5d281b098f9 0de8f24fde5cf7868b3535a096954f77b85d5851 +cec214b920d0eece0d9c6ee5a1e972153d385998 17b2444b282b562d4247028d10dbc5d281b098f9 +c13a2ec15e7620bcf94dacb975b7607d9e225fb1 cec214b920d0eece0d9c6ee5a1e972153d385998 +d0bd5ea1f714d5dab441f4b6e0c93fdc313cd41f c13a2ec15e7620bcf94dacb975b7607d9e225fb1 +2bc7e993f7a58c259d38f5d3233326f8a69e17a2 d0bd5ea1f714d5dab441f4b6e0c93fdc313cd41f +d92c5bbc08cde7d117f49e3505201a853cde9d79 2bc7e993f7a58c259d38f5d3233326f8a69e17a2 +67a7e4741f9a2f0f0e8c65f5582bd48a93b53dae d92c5bbc08cde7d117f49e3505201a853cde9d79 diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index e7fee32b..902f1155 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -1,6 +1,6 @@ # Current Task (2025-09-10) -## 🎉 LLVMプラグイン環境変数問題完全解決(2025-09-10) +## 🎉 LLVMプラグイン戻り値表示問題修正進行中(2025-09-10) ### ✅ **完了した主要成果**: 1. **プラグイン実装** ✅ - `nyash.plugin.invoke_*`関数はnyrtライブラリに正常実装済み @@ -9,42 +9,34 @@ 4. **by-id統一完了** ✅ - by-name方式削除、method_id方式に完全統一 5. **環境変数削減達成** ✅ - `NYASH_LLVM_ALLOW_BY_NAME=1`削除完了 6. **シンプル実行実現** ✅ - `./target/release/nyash --backend llvm program.nyash` +7. **codex TLV修正マージ完了** ✅ - プラグイン戻り値TLVタグ2/6/7対応(2000行修正) +8. **console.log ハンドル対応** ✅ - 不正なi64→i8*変換を修正、ハンドル対応関数に変更 +9. **型変換エラー解消** ✅ - bool(i1)→i64拡張処理追加でLLVM検証エラー修正 -### 🔬 **現在の動作状況**(2025-09-10テスト結果): -- **プラグイン実行** ✅ - CounterBox、FileBox正常実行 -- **副作用処理** ✅ - ファイル書き込み、カウンター増加成功 -- **method_id注入** ✅ - `[LLVM] method_id injected: 4-5 places` -- **型推論動作** ✅ - `[BUILDER] Type inference: CounterBox get -> Integer` +### 🔬 **現在の動作状況**(2025-09-10 最新テスト): +- **プラグイン実行** ✅ - CounterBox、FileBox正常実行(副作用OK) +- **型エラー解消** ✅ - LLVM関数検証エラー修正済み - **コンパイル成功** ✅ - 環境変数なしでLLVMバックエンド動作 +- **条件分岐動作** ✅ - `if f.exists("file")` → "TRUE"/"FALSE"表示OK -### 🔍 **残存課題(深堀り調査必要)**: +### 🔍 **根本原因判明**: +**Task先生の詳細技術調査により特定**: +- **不正なハンドル→ポインタ変換**: `build_int_to_ptr(iv, i8p, "arg_i2p")` でハンドル値(3)を直接メモリアドレス(0x3)として扱う不正変換 +- **修正完了**: console.log を `nyash.console.log_handle(i64) -> i64` に変更、ハンドルレジストリ活用 -#### 1. **プラグイン戻り値表示問題** 🔶 **←最重要** -**症状**: +### 🔍 **残存課題**: + +#### 1. **プラグイン戻り値表示問題** 🔶 **←現在調査中** +**症状(修正後も継続)**: - `CounterBox.get()` → 数値戻り値がprint()で空白 - `FileBox.read(path)` → 文字列戻り値がprint()で空白 - `FileBox.exists(path)` → if条件では動作、変数格納で失敗 - `local x = 42; print(x)` → 正常(問題はプラグイン戻り値のみ) -**推測される問題層**: -- **プラグインランタイム層**: nyrtライブラリの戻り値処理 -- **MIR変数代入処理**: BoxCall結果の変数格納メカニズム -- **LLVM型変換**: プラグイン戻り値→LLVM値の変換処理 -- **print()関数型処理**: プラグイン値のprint()認識問題 - -#### 2. **IF文処理の不整合** 🔶 -**症状**: -- `if f.exists("file")` → 正常動作(条件判定OK) -- `local result = f.exists("file")` → 変数格納失敗 -- `print(result)` → 空白表示 - -**推測**: 戻り値がif条件では評価されるが、変数代入で失われる - -#### 3. **MIR生成層の潜在問題** 🟡 -**推測される問題**: -- BoxCall戻り値のMIR変数への代入処理 -- 型変換処理でのメタデータ不整合 -- プラグイン戻り値の寿命管理問題 +**残る問題の推定**: +- print()以外のExternCall処理にも同様の問題がある可能性 +- MIR変数代入処理での型情報不整合 +- プラグイン戻り値のハンドル→実値変換が不完全 ### 📊 **修正済みファイル**: - **src/mir/builder.rs** - プラグインメソッド戻り値型推論追加 diff --git a/CURRENT_TASK_restored.md b/CURRENT_TASK_restored.md new file mode 100644 index 00000000..f8071d43 --- /dev/null +++ b/CURRENT_TASK_restored.md @@ -0,0 +1,955 @@ +# Restart Notes — Ny Syntax Alignment (2025‑09‑07) + +目的 +- Self‑Hosting 方針(Nyのみで工具を回す前段)に合わせて、Ny 構文とコーディング規約を明示化し、最小版ツールの完走性を優先。 + +Ny 構文(実装時の基準) +- 1行1文/セミコロン非使用。 +- break / continue を使わない(関数早期 return、番兵条件、if 包みで置換)。 +- else は直前の閉じ波括弧と同一行(`} else {`})。 +- 文字列の `"` と `\` は確実にエスケープ。 +- 反復は `loop(条件) { …; インクリメント }` を基本とし、必要に応じて「関数早期 return」型で早期脱出。 + +短期タスク(Syntax 合意前提で最小ゴール) +1) include のみ依存木(Nyのみ・配列/マップ未使用)を完走化 + - `apps/selfhost/tools/dep_tree_min_string.nyash` + - FileBox/PathBox + 文字走査のみで JSON 構築(配列/マップに頼らない) + - `make dep-tree` で `tmp/deps.json` を出力 +2) using/module 対応は次段(構文・優先順位をユーザーと再すり合わせ後) + - 優先: `module > 相対 > using-path`、曖昧=エラー、STRICT ゲート(要相談) +3) ブリッジ Stage 1 は保留 + - `NYASH_DEPS_JSON=` 読み込み(ログ出力のみ)を最小パッチで用意(MIR/JIT/AOT は不変) + +備考 +- Cranelift 側の作業は別ブランチで継続。Self‑Hosting ブランチは Ny 工具の安定化に集中。 +- 構文の最終合意後、using/module 版(配列/マップ最小 API)へ拡張。 + + +## Grammar Sync — Phase 12.7 合わせ(現状と方針) + +参照ドキュメント(一次ソース) +- Phase 12.7 統合: `docs/development/roadmap/phases/phase-12.7/README.md` +- Grammar 最終決定: `docs/development/roadmap/phases/phase-12.7/grammar-specs/grammar-reform-final-decision.txt` +- Grammar 技術仕様: `docs/development/roadmap/phases/phase-12.7/grammar-specs/grammar-technical-spec.txt` +- 実装チェックリスト: `docs/development/roadmap/phases/phase-12.7/implementation/implementation-final-checklist.txt` +- ANCP Token Spec (参照): `docs/development/roadmap/phases/phase-12.7/ancp-specs/ANCP-Token-Specification-v1.md` + +実装状況(Phase 12.7 との整合) +- OK: `peek`(else必須・ブロック可)、`continue`、`birth` 統一、`fn{}` ラムダ(P0)、糖衣 basic(`|>`, `?.`, `??`, `+=/-=/*=/=`, `..`)ゲート済。 +- OK: `Parent::method` 用 `::` トークン+ `Parent::method(args)` 解析(P1相当の先行)。 +- OK: フィールド宣言 `name: Type` を受理(P0: 型はパースのみ、意味付けは今後)。 +- 差分(非致命): + - import 未実装(現状は `using` のみ Phase0: `nyashstd` 制限)。 + - `public name: Type` の単行は未対応(`public { ... }` ブロックは対応)。 + - レガシー `>>`(ARROW)トークンとASTが残存(12.7 では不要)。 + - Tokenizer に `fn` の重複割り当て(`FN`/`FUNCTION`)が存在(動作は壊していないが整理対象)。 + +合意に向けた軽微タスク(Self‑Hosting 主線を維持したまま) +- T1: `public name: Type` 単行を Box 内で受理(`public { ... }` は後方互換維持)。 +- T2: `import` を追加(現状 `using` と並行運用、Phase0は読み取りのみ/将来の解決器に接続)。 +- T3: 12.7 厳格モードゲート(例: `NYASH_STRICT_12_7=1`) + - `>>` を無効化(パーサ拒否 or トークナイズ抑止)。 + - 追加キーワード群(legacy拡張)の一部を“識別子扱い”へフォールバック(実験用)。 +- T4: Tokenizer の `fn` 重複を解消(`FN` を正とし `FUNCTION` 二重割り当てを削除)。 + +受け入れ基準(Grammar Sync) +- sugar_level=none/basic の双方でスモークが通る。 +- `peek` else 未指定時に適切なエラー(現状維持)。 +- `public name: Type` が Box 内でフィールドとして扱われる(最小P0)。 +- 厳格モードで `>>` が受理されない/互換モードでは現状維持。 + +検証コマンド(例) +- `NYASH_SYNTAX_SUGAR_LEVEL=none cargo test -p nyash_self_main -- tests::sugar_basic_test -- --nocapture`(none でも tokenizer/parseは通ること) +- `NYASH_SYNTAX_SUGAR_LEVEL=basic cargo test -p nyash_self_main -- tests::sugar_pipeline_test -- --nocapture` +- `NYASH_STRICT_12_7=1 ./target/release/nyash --backend vm apps/smokes/grammar/peek_basic.nyash`(`>>` を含むコードが拒否される) + +## Bitwise/Shift — main 取り込みと現状 + +- origin/main でビット演算(&, |, ^, <<, >>)が Grammar/Tokenizer/AST/MIR に統合済み。レガシー `>>` ARROW は撤退。 +- 追加テスト(main): + - `src/tests/parser_bitops_test.rs`(代表式 `1 + 2 << 3 & 7` の構文) + - `src/tests/vm_bitops_test.rs`(`(5&3)+(5|2)+(5^1)+(1<<5)+(32>>3) == 48`、`1<<100` マスク確認) +- 確認結果(ローカル): + - MIR バックエンドは 48 で合格(OK)。 + - VM バックエンドは現状 `Unsupported integer operation: BitAnd`(VM 側の実装が未導入のため) + +取り込み計画(selfhosting-dev に main を統合) +1) ローカル変更を一時退避(stash)し、`origin/main` をマージ。 +2) コンフリクト解消:`src/jit/lower/builder/cranelift.rs` は main 側の更新(ARROW撤退/SHR採用)を優先。 +3) 検証:MIR 経路で bitops スモーク(期待 48)。 +4) 次段:VM の bitops(i64限定、シフトは `rhs&63` マスク)を実装→テスト有効化。 +5) LLVM/E2E:grammar 解禁後に `apps/tests/ny-llvm-bitops/` を有効化(MIR直構築は現状担保)。 + +実行メモ(代表) +- MIR スモーク: `printf "return (5 & 3) + (5 | 2) + (5 ^ 1) + (1 << 5) + (32 >> 3)\n" > tmp/bitops_smoke.nyash && ./target/debug/nyash --backend mir tmp/bitops_smoke.nyash` → `Result: 48` +- VM は現状未対応(実装後に同式で確認)。 + +TODO(bitops) +- [ ] origin/main を selfhosting-dev にマージ(conflict 解消)。 +- [ ] MIR 経路のスモーク確認(48)。 +- [ ] VM: i64 の `& | ^ << >>` 実装(`rhs&63` マスク)。 +- [ ] tests: `vm_bitops_test.rs` を有効化(VM で合格)。 +- [ ] docs: ARROW(>>) 撤退と `|>` への一本化を明記。 + +## Self‑Host — Include‑only Dependency Tree(Phase 0) + +スコープ(Phase 0 最小) +- Nyのみ(Array/Map不使用)で include 依存木を構築し、純JSONを出力。 +- using/module/import は次段。Runner は `NYASH_DEPS_JSON` をログ読み込みのみ。 + +現状 +- ツール: `apps/selfhost/tools/dep_tree_min_string.nyash`(include専用、再帰・文字列走査)。 +- 出力: `make dep-tree` → `tmp/deps.json`(純JSON化、先頭ログの除去は `[tasks].dep_tree` で吸収)。 +- 走査: コメント(`//`, `#`)・文字列内の `include` を無視する状態機械を導入(誤検出抑制)。 +- サンプル: `apps/selfhost/smokes/dep_smoke_root.nyash`(子: `dep_smoke_child.nyash`)。 + +出力仕様・受け入れ基準: docs/selfhost/dep_tree_min_string.md に移設(CURRENT_TASKは要点のみ表記)。 + +残タスク(Phase 0 必須) +- P0-2: スモーク(循環あり/なし)と合わせて確認(追加済み)。 +- P0-3: docs への移設(完了)。 + +任意(Phase 0.5) +- stderr固定の徹底(将来Runner側の冗長出力をenvゲート化)。 +- ルートパスの正規化(`.`,`..` の整理)と最大深さ/件数の安全弁(オプション)。 + +検証(代表) +- `echo apps/selfhost/smokes/dep_smoke_root.nyash | ./target/release/nyash --backend vm apps/selfhost/tools/dep_tree_min_string.nyash` +- `echo apps/selfhost/smokes/dep_smoke_cycle_a.nyash | ./target/release/nyash --backend vm apps/selfhost/tools/dep_tree_min_string.nyash` +- `make dep-tree`(ENTRYは標準入力1行 or 既定パスにフォールバック) + +# Quick Plan — Self‑Host (Restart Safe) + +- Goals: Ny-only dependency tree (include → later using/module), JSON out; simple file-bridge to existing MIR→VM→AOT without tight coupling. +- Deliverables: + - Minimal tool: `apps/selfhost/tools/dep_tree_min_string.nyash` (include-only, recursion via FileBox/PathBox, no Array/Map) + - Full tool: `apps/selfhost/tools/dep_tree_simple.nyash` (include + using/module, strict/explicit resolution) + - Task/Make: `nyash.toml [tasks].dep_tree` and `make dep-tree` (outputs `tmp/deps.json`) + - Bridge Stage 1: Runner reads `NYASH_DEPS_JSON=` and logs (no behavior change) +- Order: + 1) Finish include-only tool to completion (Ny-only, strict 1‑statement lines) + 2) Harden full tool (using/module, module > relative > using-path, ambiguous=error, STRICT gate) + 3) Add Runner hook for `NYASH_DEPS_JSON` (log only) +- Quick run: + - `make dep-tree` → writes `tmp/deps.json` + - `./target/release/nyash --run-task dep_tree` + + +# CURRENT TASK (Compact) — Phase 15 / Self-Hosting(Ny→MIR→MIR-Interp→VM 先行) + +このドキュメントは「いま何をすれば良いか」を最小で共有するためのコンパクト版です。詳細は git 履歴と `docs/`(phase-15)を参照してください。 + +— 最終更新: 2025‑09‑08 (LLVM Core‑13 安定化 P0 進捗更新) + +【Quick Update — LLVM Core‑13 P0】 +現状 +- ビルド環境は LLVM 18 検出済み(`LLVM_SYS_180_PREFIX=/usr/lib/llvm-18`)。 +- 代表的なビルドエラーは次の3点に収束。 + 1) Opaque Pointer 由来: `PointerType::get_element_type()` 不在 → i8* 判別経路をヒューリスティックに簡素化。 + 2) IntegerBox API: `.value()` 誤用 → `.value` に修正(フィールド参照)。 + 3) BinaryOp 網羅: BitAnd/BitOr/BitXor/Shl/Shr 未対応 → いったん `_ => todo!()` で回避。 + +対応済み +- `src/backend/llvm/compiler.rs` + - `env.box.new` の opaque 対応(i8* は `nyash.box.from_i8_string` を呼ぶ単純化)。 + - `.value()`→`.value` を修正(BinOpパス)。 + - 末尾 mock BinOp に `_ => todo!()` を追加。 + +残タスク(P0完了条件) +- `env.box.new`(new_i64x 側)の引数 i64 化クロージャを完全インライン化(lifetime エラー解消)。 +- BinOp 未網羅の match 箇所をもう1か所整理(`_ => todo!()` か軽実装)。 +- 再ビルド通過後、代表スモークの一致確認。 + +代表スモーク +- ビルド: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm` +- 実行: `tools/build_llvm.sh apps/tests/mir-compare-multi/main.nyash -o app && ./app` +- 受け入れ: VM と同一の戻り値(Core‑13 正規化パスに依存:`NYASH_MIR_CORE13=1` 既定ON) + +メモ +- 作業ディレクトリ: `/mnt/c/git/nyash-project/nyash_llvm`(branch: `llvm-dev`) +- 次の commit で P0 を締め、P1(ビット演算/Shift 実装)に移行する。 + +【Phase 17.1 — LLVM Core‑13 安定化(専用worktree/branch)】 +目的 +- Core‑13 正規化後の MIR を LLVM AOT に下ろし、VM と同値の代表ケースを安定動作させる。 + +作業環境 +- worktree: /mnt/c/git/nyash-project/nyash_llvm (branch: llvm-dev, origin/llvm-dev 追従) +- LLVM 18 前提: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix)` + +短期タスク(P0) +- Opaque Pointer 対応: Inkwell 0.6 + LLVM 18 に合わせ、`get_element_type()` 等を使用しない降ろしに修正。 + - `env.box.new` の引数ハンドリングをヒューリスティックに単純化(i8* は `nyash.box.from_i8_string`) +- IntegerBox API 整合: `.value()` → `.value` に是正(フィールド参照)。 +- BinaryOp の網羅性: `BitAnd/BitOr/BitXor/Shl/Shr` 未対応を `_ => todo!()` で一旦回避(代表スモーク優先)。 + +検証(P0) +- ビルド: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm` +- 代表スモーク: `tools/build_llvm.sh apps/tests/mir-compare-multi/main.nyash -o app && ./app`(VM一致) + +後続(P1) +- ビット演算/シフトの実装と検証(LLVM 降ろし/IR 生成/実行互換)。 +- AOT 実行の戻り値と型変換経路の整理(i64/handle→Box materialize)。 + +【ハンドオフ(2025‑09‑06 final)— String.length 修正 完了/JIT 実行を封印し四体制へ】 + +概要 +- 目的: AOT/JIT‑AOT で発生していた `StringBox.length/len` が 0 になる不具合の是正(Lower の二段フォールバック:`nyash.string.len_h` → `nyash.any.length_h`)。 +- 結果: 当該不具合は修正・確認完了(AOT/VM で期待値)。JIT 直実行の継続調査は打ち切り、実行モードは「インタープリター/VM/Cranelift(EXE)/LLVM(EXE)」の4体制へ移行。 + +【Phase 15.17 追記 — Core‑13 純化モード 実装/稼働・AOT shim 拡張】 +概要 +- Core‑13 純化モード(厳格)を導入: `NYASH_MIR_CORE13_PURE=1` + - Builder 段: `new`→`ExternCall(env.box.new, [type, …args])` を直接生成(`NewBox/birth` 非生成) + - Unary(−/!/~): 直接展開(`Const+BinOp/Compare`) + - WeakRef(weak_new/load): 純化ONでは生成回避(パススルー) + - Optimizer 安全網: Load/Store→`env.local.get/set` 変換、最終MIRで13命令以外はエラー +- 実行系: + - VM: `env.local.get/set` と `env.box.new` を実装(BoxFactoryRegistry 連動) + - LLVM AOT: `env.local.get/set` の Lowering と `env.box.new` shim を追加 + - NyRT 追加: `nyash.env.box.new` / `nyash.env.box.new_i64x` (最大4引数) + - NyRT 追加: `nyash.box.from_i8_string`(i8*→StringBox)、`nyash.box.from_f64`(f64→FloatBox) + - Lowering: 引数を i64 ハンドルに正規化(int/ptr→i64、i8*→from_i8_string、f64→from_f64) + - Cranelift (スケルトン): `env.local.get/set` / `env.box.new` を実行ループに最小実装(将来のAOT出力の布石) + +検証 +- `cargo test`: 206 passed / 0 failed / 24 ignored(通常) +- 純化ON(選択的 skip あり): グリーン。`src/tests/mir_pure_envbox.rs` 追加で `env.box.new` 生成を検証 + +実装(済) +- LowerCore: 二段フォールバック実装を追加(Param/Local/リテラル)。 + - `emit_len_with_fallback_param`/`_local_handle`/`_literal` + - `core.rs` の `len/length` で二段フォールバックを使用。結果をローカルスロットへ保存(Return で拾えるように) +- BoxCall 共通(ops_ext): + - StringBox の `len/length` を最優先で処理(Param/Local/リテラル/handle.of)。 + - リテラル `new StringBox("...")` → `length` は即値畳み込み(const 返却)。 +- Hostcall registry 追補: `nyash.string.len_h` を ReadOnly 登録 + 署名 `(Handle)->I64` 追加。 +- JIT ブリッジ: `extern_thunks.rs` に `nyash_string_len_h` を追加、`cranelift` ビルダーに `SYM_STRING_LEN_H` を登録。 +- ポリシー: `StringBox.length/len` マッピングを `nyash.any.length_h` → `nyash.string.len_h` に是正。 +- デッドコード整理: 旧 `lower_boxcall_simple_reads` を削除(conflict 回避)。 +- ツール/スモーク: `tools/aot_smoke_cranelift.sh` 追加、`apps/smokes/jit_aot_string_length_smoke.nyash` 追加。 + +— 15.17 追加 実装(済) +- Core‑13 純化モード: `NYASH_MIR_CORE13_PURE=1`(Builder/Optimizer/Verifier 連携) +- VM: `env.local.get/set`, `env.box.new` を実装 +- LLVM AOT: `env.box.new` shim(new/new_i64x)+ 引数 i8*/f64 のハンドル化 helper 追加 +- Cranelift: ExternCall の最小実装(get/set/new)を追加(スケルトン) +- テスト: `src/tests/mir_pure_envbox.rs` 追加(純化 new→env.box.new の生成確認) +- テスト: `src/tests/mir_pure_e2e_vm.rs` 追加(純化ONで VM 実行: new StringBox + length の e2e) +- テスト: `src/tests/mir_pure_locals_normalized.rs` 追加(locals が env.local.get/set に正規化されることを確認) +- テスト: `src/tests/mir_pure_llvm_build.rs` 追加(feature=llvm 時に純化ONで .o を正常生成できることを確認。実行の同値性はAOT実装拡張後に別途追加予定) +- テスト: `src/tests/mir_pure_e2e_arith.rs` 追加(純化×VMで加算の e2e) +- テスト: `src/tests/mir_pure_e2e_branch.rs` 追加(純化×VMで条件分岐の e2e) +- テスト: `src/tests/mir_pure_only_core13.rs` 追加(最終MIRが13命令のみで構成されることを静的検査) +- CI: Core‑13 純化(LLVM) ワークフロー追加(`.github/workflows/core13-pure-llvm.yml`)。LLVM 18 をセットアップし、`--features llvm` で純化ONテストを実行。 +- CI: Core‑13 純化モード専用ワークフローを追加(`.github/workflows/core13-pure.yml`)。`NYASH_MIR_CORE13_PURE=1 cargo test --all-targets` を実行。 + +確認状況(最終) +- `apps/smokes/jit_aot_string_min.nyash`(concat/eq): AOT で `Result: 1`(OK)。 +- `apps/smokes/jit_aot_string_length_smoke.nyash`: AOT .o 生成/リンク・実行とも良好(稀発の segfault 調査は「低優先」に移行)。 +- `apps/smokes/jit_aot_any_len_string.nyash`: AOT で `Result` が期待値(0 問題は解消)。 +- 備考: JIT 直実行の既知の不安定性は、JIT 実行封印に伴い調査終了とする(アーカイブ扱い)。 + +残課題(方針更新後) +P0: 実行モード整理(JIT 実行封印) +- ランタイム実行は「Interpreter/VM」に限定。ネイティブ配布は「Cranelift AOT(EXE)/LLVM AOT(EXE)」。JIT 関連のランタイムフラグ説明は docs で封印明記。 + +P1: AOT 安定化(低頻度 segfault の追跡:低優先) +- 稀な DT_TEXTREL 警告・segfault は PIE/LTO/relro/TLS/extern 登録順の再確認を残課題として維持(優先度は下げる)。 + +P2: リファクタ(Phase A)継続(振る舞い不変) +- Hostcall シンボル `SYM_*` 統一、`core/string_len.rs` への集約、観測フックの整理は継続。JIT 実行依存の観測は停め、VM/AOT 観測を優先。 + +P3: Core‑13 純化 仕上げ(今回の続き) +- Cranelift AOT: 実オブジェクト出力で `env.local/env.box` のシンボル連携(現状は実行スケルトンのみ) +- LLVM AOT: `env.box.new_i64x` の引数拡張(>4, TLV支援)と型復元の精度UP(文字列/浮動/配列 等) +- Builder 純化の徹底: Load/Store/WeakRef を完全非生成(全経路点検) +- E2E 純化スモーク: `apps/smokes_pure13/` を追加(VM/LLVM EXE の結果一致) +- CI: 純化ON ジョブを常時実行(最終MIR 13命令チェック含む) + +進捗(2025‑09‑06 終了報告) +- ops_ext: StringBox.len/length の結果を必ずローカルに保存するよう修正(Return が確実に値を拾える) + - 対象: param/local/literal/handle.of 各経路。`dst` があれば `local_index` に slot を割当てて `store_local_i64`。 +- デバッグ計測を追加 + - JIT Lower 追跡: `NYASH_JIT_TRACE_LOWER=1`(BoxCall の handled 判定/box_type/dst 有無) + - Return 追跡: `NYASH_JIT_TRACE_RET=1`(known/param/local の命中状況) + - ローカルslot I/O: `NYASH_JIT_TRACE_LOCAL=1`(`store/load idx=` を吐く) + - String.len_h 実行: `NYASH_JIT_TRACE_LEN=1`(thunk 到達と any.length_h フォールバック値を吐く) +- 再現確認 + - `apps/smokes/jit_aot_any_len_string.nyash` は依然 Result: 0(JIT-direct)。 + - 追跡ログ(要 `NYASH_JIT_TRACE_LOWER=1 NYASH_JIT_TRACE_RET=1 NYASH_JIT_TRACE_LOCAL=1`) + - `BoxCall ... method=length handled=true box_type=Some("StringBox") dst?=true` + - ローカル slot の流れ: `idx=0` recv(handle) → `idx=1` string_len → `idx=2` any_len → `idx=3` cond → select → `idx=4` dst 保存 → Return で `load idx=4` + - つまり lowering/Return/ローカル材化は正しく配線されている。 +JIT 直実行に関する未解決点(import 解決先の差異疑い 等)は封印に伴いアーカイブ化。必要時に `docs/development/current/` へ復元して再開する。 + +暫定変更(フォールバック強化) +- `ops_ext` の StringBox.len で「リテラル復元(NewBox(StringBox, Const String))」を param/local より先に優先。 + - JIT-AOT 経路で文字列リテラルの length は常に即値化(select/hostcall を経由せず 3 を返す)。 + - ただし今回のケースでは local 経路が発火しており、まだ 0 のまま(hostcall 実行が 0 を返している疑い)。 + +未解決/次アクション(デバッグ指針) +- [ ] `nyash.string.len_h` が実際にどの関数へリンクされているかを確認 + - Cranelift JIT: `src/jit/lower/builder/cranelift.rs` の `builder.symbol(...)` 群は設定済みだが、実行時に thunk 側の `eprintln` が出ない。 + - 追加案: `emit_host_call` で宣言した `func_id` と `builder.symbol` 登録可否の整合をダンプ(シンボル直列化や missing import の検知)。 +- [ ] `extern_thunks::nyash_string_len_h` へ確実に到達させるため、一時的に `emit_len_with_fallback_*` で `SYM_STRING_LEN_H` を文字列リテラル直書きではなく定数経由に統一。 +- [ ] `nyash.string.from_u64x2` の呼び出し可否を同様にトレース(`NYASH_JIT_TRACE_LOCAL=1` の直後に `NYASH_JIT_TRACE_LEN=1` が見えるか) +- [ ] ワークアラウンド検証: `NYASH_JIT_HOST_BRIDGE=1` 強制でも 0 → host-bridge 経路の呼び出しが発火していない可能性。bridge シンボル登録も再確認。 + +メモ/所見 +- lowering と Return 材化(ローカルslot への保存→Return で load)は動いている。値自体が 0 になっているので hostcall 側の解決/戻りが疑わしい。 +- AOT .o の生成は成功。segv は今回は再現せず。 + +実行コマンド(デバッグ用) +- `NYASH_JIT_TRACE_LOWER=1 NYASH_JIT_TRACE_RET=1 NYASH_JIT_TRACE_LOCAL=1 NYASH_AOT_OBJECT_OUT=target/aot_objects/test_len_any.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_any_len_string.nyash` +- 追加で thunk 到達確認: `NYASH_JIT_TRACE_LEN=1 ...`(現状は無出力=未到達の可能性) + +Phase A 進捗(実施済) +- A‑1: Hostcall シンボルの定数化(直書き排除)完了 + +【ハンドオフ(2025‑09‑06 4th)— GUI/egui 表示テスト計画(Cranelift/LLVM × Windows/WSL)】 + +目的 +- 以前は Windows exe で egui ウィンドウ表示を確認できていたが、現状で再現が不安定な報告あり。Cranelift/LLVM と OS 組み合わせ別に手順と期待結果を明文化し、再現性を担保する。 + +前提・重要ポイント +- プラグイン版 EguiBox は Windows 専用で実ウィンドウ分岐(`#[cfg(all(windows, feature = "with-egui"))]`)。Linux/WSL では `run()` はスタブ(void)でウィンドウは出ない(X 転送の有無に関係なく)。 +- Windows でウィンドウ表示を行うには、`nyash-egui-plugin` を `--features with-egui` でビルドし、`nyash.toml` の `plugin_paths`(または `NYASH_PLUGIN_PATHS`)に DLL のパスが解決できること。 +- Linux でウィンドウ表示を確認したい場合は「Rust 例(gui_simple_notepad)」または「ビルトイン EguiBox(nyash 本体を `--features gui` でビルドし、専用 Nyash スクリプトを使用)」を利用する。 + +テストマトリクス(手順と期待結果) +1) Windows × Cranelift(JIT-direct/EXE 相当) + - 準備: `cargo build --release --features cranelift-jit` + - プラグイン: `cargo build -p nyash-egui-plugin --release --features with-egui` + - 実行(JIT-direct 経路): `powershell -ExecutionPolicy Bypass -File tools\egui_win_smoke.ps1` + - 期待: Egui ウィンドウが表示される(アプリ終了までブロッキング)。 + +2) Windows × LLVM(EXE/直実行) + - LLVM 準備: `tools\windows\ensure-llvm18.ps1 -SetPermanent` + - プラグイン: `cargo build -p nyash-egui-plugin --release --features with-egui` + - Nyash 本体: `cargo build --release --features llvm` + - 直実行: ` .\target\release\nyash.exe --backend llvm apps\egui-hello\main.nyash` + - AOT EXE: `tools\build_llvm.ps1 apps\egui-hello\main.nyash -Out egui_hello.exe` → ` .\egui_hello.exe` + - 期待: どちらの経路でも Egui ウィンドウが表示される(DLL が `plugin_paths` に解決可能であること)。 + +3) WSL × Cranelift(JIT-direct/EXE 相当) + - 準備: `cargo build --release --features cranelift-jit` + - 実行: `./target/release/nyash --jit-direct apps/egui-hello/main.nyash` + - 期待: 実ウィンドウは出ない(プラグインの `run()` はスタブ)。エラーなく終了(void)。 + - 備考: GUI 表示が必要な場合は Rust 例(`cargo run --features gui-examples --example gui_simple_notepad --release`)を利用。 + +4) WSL × LLVM(EXE/直実行) + - 準備: `./tools/llvm_check_env.sh` → `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm` + - 実行: `./target/release/nyash --backend llvm apps/egui-hello/main.nyash` + - 期待: 実ウィンドウは出ない(スタブ)。 + - 備考: GUI 表示が必要な場合は Rust 例、もしくは nyash 本体を `--features gui` でビルドし、ビルトイン EguiBox 用の Nyash スクリプトを別途用意(要サンプル整備)。 + +診断スイッチ(共通) +- `NYASH_DEBUG_PLUGIN=1`: プラグインのロードパス/解決状況を表示 +- `NYASH_CLI_VERBOSE=1`: プラグインホスト初期化やランタイムの詳細ログ +- Windows/プラグインの DLL 解決が怪しい場合は `NYASH_PLUGIN_PATHS` で DLL ディレクトリを明示(`;` 区切り) + +既知の制約 / TODO +- Linux/WSL でプラグイン版 EguiBox の `run()` は現在スタブ(実ウィンドウなし)。将来的に `#[cfg(target_os = "linux")]` 分岐で eframe 実装を追加し、X11/Wayland でも表示可能にする。 +- ビルトイン EguiBox(`src/boxes/egui_box.rs`)は `--features gui` でビルド時に有効。Nyash スクリプト側の API はプラグイン版と異なる(`setTitle/setSize/addText/run`)。Linux GUI 確認用にビルトイン用サンプル(apps/egui-builtin/)を追加して整備する。 +- Windows AOT リンクは MSVC `link.exe` を既定(fall back: clang)。lld へのスイッチ(速度優先)を将来オプション化検討。 + +次アクション(引き継ぎ TODO) +- [ ] Windows: 4通りの実行(Cranelift 直/JIT、LLVM 直、AOT EXE)で `apps/egui-hello/main.nyash` のウィンドウ表示を再確認(`NYASH_DEBUG_PLUGIN=1` でログ採取)。 +- [ ] WSL: Cranelift/LLVM の直実行は「スタブ終了」が期待値であることを README/ガイドに明記。GUI が必要なら Rust 例 or ビルトイン EguiBox 経路を案内。 +- [ ] Linux 向けプラグイン `with-egui` 実装の導入可否を検討(`plugins/nyash-egui-plugin/src/lib.rs` の `winrun` と類似の `linrun` を追加)。 +- [ ] ビルトイン EguiBox 用の Nyash サンプルを `apps/egui-builtin/` として追加し、`--features gui` での手順を `dev/selfhosting/` または `docs/` に追記。 + - `nyash.handle.of` / `nyash.string.len_h` / `nyash.console.birth_h` を `SYM_*` に統一 +- A‑2: string_len ヘルパ抽出(共通化)完了 + - `src/jit/lower/core/string_len.rs` 新設、`emit_len_with_fallback_*` を移設 + - 呼び出し元はそのまま(挙動は不変) +- A‑3: 観測の統一(第一弾) + - string_len 内で `observe::lower_hostcall` を発火(len_h/any.length_h) + - Cranelift/ObjectBuilder の `emit_host_call[_typed]` に `NYASH_JIT_TRACE_IMPORT=1` によるインポート解決ログを追加 + +観測結果(A‑3 導入後) +- `NYASH_JIT_TRACE_IMPORT=1` で `nyash.string.len_h` / `nyash.any.length_h` の import 呼び出しを確認(JIT/AOT 両方) +- それでも `NYASH_JIT_TRACE_LEN=1` の thunk 到達ログは出ず → 依然解決先に差異がある疑い(要継続調査) + +■ 実行系の最終方針(Phase 15 着地) +- ランタイム: Interpreter / VM +- 配布: Cranelift AOT (EXE) / LLVM AOT (EXE) +- JIT 直実行: 封印(ドキュメント上も「実験的/無効」へ集約) + +■ 検証チェックリスト(更新) +- VM: `./target/release/nyash --backend vm apps/smokes/jit_aot_string_min.nyash` → Result:1 +- AOT(Cranelift): `./tools/build_aot.sh apps/smokes/jit_aot_string_length_smoke.nyash -o app` → `./app` 実行 → 期待結果 +- AOT(Windows one‑shot): `pwsh -File tools/windows/build_egui_aot.ps1 -Input apps/egui-hello-plugin/main.nyash -Out app_egui` → 画面表示 + + +— Phase A(無振る舞い変更)リファクタ方針(継続) +- A‑1: Hostcall シンボルを定数に統一(直書き排除) + - `"nyash.handle.of"` → `jit::extern::handles::SYM_HANDLE_OF` + - `"nyash.string.len_h"` → `jit::extern::collections::SYM_STRING_LEN_H` + - `"nyash.console.birth_h"` → 既存の定数へ(なければ `extern::...` に追加して使用) +- A‑2: 長さ取得の共通化 + - 新規: `src/jit/lower/core/string_len.rs` + - 既存の `emit_len_with_fallback_{param,local,literal}` をこのモジュールへ抽出し、`core.rs`/`ops_ext.rs` から呼び出すだけにする(挙動は据え置き)。 + - 目的: 重複と分岐のばらけを解消し、シンボル差し替えや観測フックを一点で行えるようにする。 +※ Phase A は「振る舞いを変えない」ことを厳守する。 + +2) 診断イベントの追加(軽量) + - `emit_len_with_fallback_*` と `lower_box_call(len/length)` に `observe::lower_hostcall` を追加し、 + Param/Local/リテラル/handle.of どの経路か、select の条件(string_len==0)をトレース可能にする(`NYASH_JIT_EVENTS=1`)。 + +3) AOT segfault (稀発) の追跡(低優先) + - `tools/aot_smoke_cranelift.sh` 実行中に稀に segv(`.o` 生成直後/リンク前後)。 + - `nyash.string.from_u64x2` 載せ替えと DT_TEXTREL 警告が出るので、PIE/LTO/relro 周りと TLS/extern の登録順を確認。 + +4) 警告のノイズ低減(低優先) + - `core_hostcall.rs` の unreachable 警告(case 統合の名残)。 + - `jit/lower/*` の unused 変数/unused mut の警告。 + +影響ファイル(今回差分) +- `src/jit/lower/core.rs`(len/length 二段フォールバック呼出し、保存強化) +- `src/jit/lower/core/ops_ext.rs`(StringBox len/length 優先処理、リテラル即値畳み込み、保存) +- `src/jit/hostcall_registry.rs`(`nyash.string.len_h` 追補) +- ドキュメント: README(ja/en) の実行モード更新、ガイド(egui AOT)に one‑shot スクリプト反映 +- `src/jit/extern/collections.rs`(`SYM_STRING_LEN_H` 追加) +- `src/jit/lower/extern_thunks.rs`(`nyash_string_len_h` 追加) +- `src/jit/lower/builder/cranelift.rs`(`SYM_STRING_LEN_H` のシンボル登録) +- `tools/aot_smoke_cranelift.sh`(新規) +- `apps/smokes/jit_aot_string_length_smoke.nyash`(新規) + +再現/確認コマンド +- ビルド(JIT/AOT): `cargo build --release --features cranelift-jit` +- JIT‑AOT(.o出力): `NYASH_AOT_OBJECT_OUT=target/aot_objects/test_len_any.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_any_len_string.nyash` +- AOT 連結〜実行: `bash tools/aot_smoke_cranelift.sh apps/smokes/jit_aot_string_min.nyash app_str` + +次アクション(引き継ぎ TODO) +- [ ] Return の後方走査材化を実装(BoxCall/Call/Select 等の定義→保存→Return 接続)。 +- [ ] `emit_len_with_fallback_*` / `lower_box_call(len/length)` にイベント出力を追加(選択分岐/経路ログ)。 +- [ ] AOT segv の最小再現収集(PIE/relro/TLSの前提確認)→ `nyrt` 側エクスポート/リンカフラグ点検。 +- [ ] `NYASH_USE_PLUGIN_BUILTINS=1` 時の `length` も robust path を常に使用することを E2E で再確認。 +- [ ] Cranelift AOT: `env.local/env.box` を実オブジェクト出力に反映(link/name 解決の道付け) +- [ ] LLVM AOT: `nyash.env.box.new_i64x` の引数≥5およびTLV化の検討、引数型の復元精度UP +- [ ] Builder 純化の網羅化(Load/Store/WeakRef 非生成の全経路テスト追加) +- [ ] 純化ON E2E スモーク(VM/LLVM)と CI 常時ジョブの追加 + +メモ +- `jit_aot_any_len_string.nyash` は `return s.length()` の Return 経路解決が決め手。材化を強化すれば `3` が期待値。 +- 既存の Array/Map 経路・他の smokes は影響なし(len/size/get/has/set の HostCall/PluginInvoke は従来どおり)。 + +■ 進捗サマリ +- Phase 12 クローズアウト完了。言語糖衣(12.7-B/P0)と VM 分割は反映済み。 +- Phase 15(Self-Hosting: Cranelift AOT)へフォーカス移行。 + - 設計/仕様ドキュメントとスモーク雛形を追加済み。 + - 設計: `docs/backend-cranelift-aot-design.md` + - API案: `docs/interfaces/cranelift-aot-box.md` + - LinkerBox: `docs/interfaces/linker-box.md` + - スモーク仕様: `docs/tests/aot_smoke_cranelift.md` + - 雛形スクリプト: `tools/aot_smoke_cranelift.sh`, `tools/aot_smoke_cranelift.ps1` +- README にセルフホスト到達の道筋を明記(C ABI を Box 化)。 + +【ハンドオフ(2025‑09‑06 3rd)— String.length: const‑fold→Return 材化の不一致 調査ログとTODO】 + +概要(現象) +- 目標: JIT/JIT‑AOT で `StringBox.length/len` が 3 を返すべき箇所で 0 になるケースを解消。 +- 現状: Lower 中の早期 const‑fold で `length = 3` を確実に計算([LOWER] early const‑fold ... = 3 が出力)。Return 時点でも `ValueId(3)` が `known_i64=3` と認識される([LOWER] Return known_i64?=true)。にもかかわらず最終結果(実行結果)は 0。 + +重要な観測(再現とログ) +- MIR ダンプ(プリンタ仕様上、BoxCall は `call %box.method()` として表示) + 0: `%1 = const "abc"` + 1: `%2 = new StringBox(%1)` + 2: `call %2.birth(%1)` // birth は通常 call(dst なし) + 3: `%3 = call %2.length()` // これも通常 call 表記(内部は BoxCall) + 4: `ret %3` +- Lower ログ: + - `[LOWER] early const-fold StringBox.length = 3` が出る(const‑fold 成功) + - `[LOWER] Return value=ValueId(3) known_i64?=true param?=false local?=true` + - それでも実行結果は `Result: 0` +- `nyash.jit.dbg_i64`([JIT‑DBG])の出力が実行時に出ていない(import は宣言されるが call が観測されず)。 + +今回入れた変更(実装済・該当ファイル) +- Return/材化の強化(known を最優先) + - `src/jit/lower/core_ops.rs`: `push_value_if_known_or_param` を「known_i64 最優先」に変更。 + - `src/jit/lower/core.rs` の `I::Return` でも `known_i64` を最優先で積むように変更。 +- Call/ArrayGet の戻り値の保存 + - `src/jit/lower/core.rs`: `I::Call` 戻り値を dst が無い場合もスクラッチローカルへ保存(栈不整合の防止)。`I::ArrayGet` 戻り値も dst スロットへ保存。 +- String.length/len の早期 const‑fold を二段に強化 + - `src/jit/lower/core.rs`: BoxCall 入り口で `StringBox.literal` の length/len を即値化(最優先)。 + - `src/jit/lower/core/ops_ext.rs`: 同様の const‑fold を堅牢化(NewBox(StringBox, Const) から復元)。 + - `src/jit/lower/core.rs`: lowering 前に `known_str` を事前シード、`string_box_literal` マップ(NewBox → リテラル文字列)を構築し、Copy 伝播も対応。 +- トレース導線 + - `src/jit/lower/core/string_len.rs`: 二段フォールバック(param/local/literal)にデバッグフック(タグ 110x/120x/130x 系)追加。 + - `src/jit/lower/builder/cranelift.rs`: ローカル slot の store/load トレース(`NYASH_JIT_TRACE_LOCAL=1`)。 + - `crates/nyrt/src/lib.rs`: AOT 側の `nyash.string.len_h` / `nyash.any.length_h` に `[AOT-LEN_H]` を追加。 + - `src/jit/lower/extern_thunks.rs`: `nyash_string_from_u64x2` に `[JIT-STR_H]` を追加(JIT のハンドル生成観測)。`nyash_handle_of` に `[JIT-HANDLE_OF]` を追加。 + +仮説(根本原因) +- const‑fold で 3 を積めているにも関わらず、Return 時の実返却が 0。優先順位の修正により `known_i64` から 3 を積むよう修正済みだが、compiled JIT 関数内での Return 材化導線(ret_block への引数配線/最後の return)が値 0 に擦り替わる経路が残っている可能性。 + - ret_block/ジャンプ引数の材化不整合 + - 後続命令でスタックが上書きされる経路 + - birth の dst なし call で残留値が生じていた可能性(Call 戻り値スクラッチ保存で対策済) + +次アクション(TODO) +1) Return の後方走査材化(優先・CURRENT_TASK 既存 TODO の実装) + - BoxCall/Call/Select/Const/Copy/Load に遡って、Return が値を確実に拾う材化パスを補強する。 + - 既に known_i64 最優先化は実施済み。残りは ret_block 引数配線の最終確認(CraneliftBuilder の ret 経路)。 + +2) 実行時の値トレース強化(短期) + - `emit_return`(CraneliftBuilder)で、ret_block へ jump 直前の引数 `v` を `nyash.jit.dbg_i64(299,v)` で確実に呼ぶ(env でON)。 + - ret_block 入口パラメータの `return_` 直前でも `dbg_i64(300,param0)` 呼び出しを足し、どこで 0 になるかを確定する。 + +3) BoxCall(length/len) の早期 fold 命中率最終確認 + - `NYASH_JIT_TRACE_LOWER=1` で `[LOWER] early const-fold ... = 3` が必ず出ることを確認。 + - 既に出ているが、Return までの導線で 3 が 0 に化ける起点を 2) で特定する。 + +4) AOT/JIT‑AOT 観測の整備(参考) + - `[AOT-LEN_H]` で AOT 側 len_h/any.length_h の handle 解決有無をログ化。JIT‑AOT smoke での差異を収集。 + +再現/確認コマンド(更新) +- 早期 fold と Return 導線ログ: + - `NYASH_JIT_TRACE_LOWER=1 NYASH_JIT_TRACE_RET=1 NYASH_AOT_OBJECT_OUT=target/aot_objects/test_len_any.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_any_len_string.nyash` +- ローカル slot 観測: + - `NYASH_JIT_TRACE_LOCAL=1 NYASH_AOT_OBJECT_OUT=... --jit-direct ...` +- AOT 側の handle 解決ログ: + - `NYASH_JIT_TRACE_LEN=1 bash tools/aot_smoke_cranelift.sh apps/smokes/jit_aot_string_min.nyash app_str` + +補足メモ +- MirPrinter は BoxCall を `call %box.method()` と出力する仕様(今回は BoxCall 経路で const‑fold が呼ばれていることは [LOWER] ログで確認済み)。 +- `call %2.birth(%1)` の戻り値残留に備え、I::Call の dst なし呼び出しでもスクラッチ保存して栈を消費するよう修正済み(回帰に注意)。 + +担当者への引き継ぎポイント +- まず 2) の dbg を CraneliftBuilder の ret 経路(jump to ret_block と return_)に追加し、`v`/`param0` が 0 になる箇所を特定してください。 +- 次に 1) の Return 後方走査材化を入れて、BoxCall/Select/Copy 等いずれの経路でも Return が安定して値を拾えるようにしてください。 +- その後、smoke `apps/smokes/jit_aot_any_len_string.nyash` が `Result: 3` で通ることを確認し、const‑fold のログと一致することをもってクローズ。 + +【将来計画(バグ修正後)— JIT を exec 専用にし、VM 連携を段階的に廃止】 + +目的 +- JIT は「コンパイル+実行(exec)」に一本化し、VM 依存のレガシー経路(param-index/TLS参照)を撤去する。 +- 値の材化・ハンドル管理・hostcall を JIT 側で一貫させ、境界の不整合を根本から減らす。 + +ロードマップ(段階移行) +1) 実行モードの明確化(設定) + - 環境変数 `NYASH_JIT_MODE=exec|compile|off` を導入。 + - 既存の `NYASH_JIT_STRICT` は非推奨化し、`MODE=compile` に集約。 + +2) JIT ABI の一本化 + - `src/jit/lower/extern_thunks.rs` などから `with_legacy_vm_args` を撤去。 + - `nyash_handle_of` を含む extern は「JIT引数/ハンドルのみ」を受け付ける設計に変更。 + - ランタイム境界で `VMValue -> JitValue(Handle)` へのアダプタを用意。 + +3) レガシー撤去(JIT/AOT側) + - `crates/nyrt/src/lib.rs` の `nyash.string.len_h`/`nyash.any.length_h` から param-index フォールバックを削除。 + - lowering の `-1` センチネルや VM 依存の fallback を廃止し、`handle.of` または既存ローカルハンドルに統一。 + +4) フォールバック方針(移行期間) + - 関数単位で `unsupported>0` の場合のみ VM にフォールバック。 + - オプション `NYASH_JIT_TRAP_ON_FALLBACK=1` を追加し、移行時の漏れを検出可能に。 + +5) Return 導線の強化(本タスクの延長) + - Cranelift 生成の ret 経路に dbg を常設(envでON)。 + - Return の後方走査材化を標準化し、const-fold/BoxCall/Select いずれでも Return が値を確実に拾うように。 + +6) ドキュメント/テスト更新 + - README/CURRENT_TASK にモード説明と運用方針を追記。 + - CI の smoke は `MODE=exec` を常態化し、compile-only はAOT出力/ベンチのみで使用。 + +影響範囲(主な修正ポイント) +- `src/jit/manager.rs`(モード/実行ポリシー) +- `src/jit/lower/extern_thunks.rs`(レガシーVM依存排除、JIT ABI専用化) +- `src/jit/lower/core.rs` / `src/jit/lower/core_ops.rs`(-1センチネル削除・ハンドル材化徹底) +- `crates/nyrt/src/lib.rs`(dotted名hostcallのレガシー経路削除) +- ドキュメント(README/CURRENT_TASK) + +ロールアウト/リスク +- フラグ駆動で段階的に切替(デフォルト `exec`)。 +- リスク: plugin経路/hostcall registry/ハンドルリーク。 + - 緩和: `handles::begin_scope/end_scope_clear` によりハンドル回収を徹底、registryの検証を追加。 + +【本日更新】 +- VM if/return 無限実行バグを修正(基本ブロック突入時に `should_return`/`next_block` をリセット)。include 経路のハングも解消。 +- ArrayBox プラグイン生成失敗に対し、v2 ローダへパス解決フォールバック(`plugin_paths.search_paths`)を追加し安定化。 +- std/string の P0 関数を Ny 実装で追加(length/concat/slice/index_of/equals)。index_of は substring ループで代替。 +- 残課題: string_smoke で `fails` 累積の else 側に φ が入らず未定義値参照(MIR Builder 側の SSA/φ 振る舞い)。別タスク化。 + +【ハンドオフ(2025‑09‑06)— AOT/JIT‑AOT 足場と箱下寄せリファクタ】 +- 変更サマリ + - nyrt: AOT 連携の dotted 名を追加(Map/String/Any/birth) + - `nyash.map.{size_h,get_h,get_hh,set_h,has_h}` + - `nyash.string.{len_h,charCodeAt_h,concat_hh,eq_hh,lt_hh}` / `nyash.any.{length_h,is_empty_h}` + - NewBox/文字列: `nyash.instance.birth_name_u64x2`, `nyash.string.from_u64x2` + - JIT‑AOT(ObjectBuilder): + - 文字列リテラル→ハンドル生成(u64x2 パック → `nyash.string.from_u64x2`) + - 出力関数を `ny_main` としてエクスポート + - 最小 Store/Load(i64)を StackSlot で実装 + - Lower(箱を下に寄せる最小整理): + - Map: param 不在でもローカルハンドルがあれば `_H` シンボルで直呼び + - Any.length: StringBox は `nyash.string.len_h` を優先。ローカル/再構築/旧 index の順にフォールバック + - Copy/Load でローカルハンドルを dst 側 slot に伝播 + - Array.length は ArrayBox 受けに限定(ops_ext ガード) + +- 追加スモーク(JIT‑AOT) + - `apps/smokes/jit_aot_string_min.nyash`(concat+eq)→ PASS + - `apps/smokes/jit_aot_any_isempty_string.nyash` → PASS + - `apps/smokes/jit_aot_any_len_string.nyash` → 現状 Result: 0(後述の未解決) + - `apps/smokes/jit_aot_map_min.nyash` → 環境により MapBox 生成が必要 + +- 実行例 + - 文字列ミニ(AOT): + - `NYASH_AOT_OBJECT_OUT=target/aot_objects/test_str.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.nyash` + - `cc target/aot_objects/test_str.o -L target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o app_str && ./app_str` → `Result: 1` + - isEmpty(AOT): + - 同様に `app_empty` → `Result: 1` + - Map 最小(AOT): + - `.o` 生成/リンクは通る。`new MapBox()` はプラグイン/設定に依存(`nyash.toml` と `.so` の配置を確認) + +- 未解決 / 既知の課題(優先度高) + 1) String.length の AOT 実行が 0 になるケース + - 症状: `s = new StringBox("abc"); return s.length()` → `Result: 0` + - 現状の対処: Any.length を String.len_h 優先にし、ローカル/再構築/旧 index の順でフォールバック。Const fold も追加済み。 + - 追加方針: 受け型伝播(Copy/Load→dst へ型共有)をより堅牢化。最終手段として、ローカルハンドル時に `string.len_h`→`any.length_h` の二段呼び分け(0 返りのときだけ後者)で保険を張る。 + 2) MapBox 生成(AOT 実行バイナリ) + - 環境によりプラグイン解決が必要。`nyash.toml` のあるディレクトリで実行し、必要なら各プラグインを `target/release` に配置。 + +- 次アクション(引き継ぎ TODO) + - [ ] Any.length の 0 問題を完全解消 + - [ ] 受けの型/ハンドル伝播(Copy/Load/Store)を統一ヘルパ化し、length/len/charCodeAt で確実にハンドルを積む + - [ ] StringBox(Const) は定数畳み込みを最優先(len を即値化) + - [ ] 保険: `string.len_h`→0→`any.length_h` の順にフォールバック(ローカルハンドル時) + - [ ] メソッド→シンボル/引数規約の集中表を作成(Array/Map/String/Any) + - [ ] ops_ext/core の分岐重複を縮減(箱の責務を「下」に寄せる) + - [ ] AOT スモーク拡充 + - [ ] String/Array の length/len を追加、select/分岐のミニ例も用意 + - [ ] Map.get/has/set(プラグインあり環境用) + +- 影響ファイル(主要) + - 追加/更新: `crates/nyrt/src/lib.rs`(dotted エクスポート多数)、 + `src/jit/lower/builder/{object.rs,cranelift.rs}`、 + `src/jit/lower/{core.rs,core/ops_ext.rs,core_hostcall.rs}`、 + スモーク: `apps/smokes/jit_aot_*.nyash` + +■ ハンドオフ(JIT AOT / LLVM の現状と次アクション) +- 現状サマリ + - Array fast‑path: VM 側 len/length を最前段に早期化(Void→0 も確認)。 + - Null 互換: NullBox→VMValue::Void へ統一(比較の整合確保)。 + - std/array smoke: `NYASH_DISABLE_PLUGINS=1` で PASS(len/push/pop/slice)。 + - LLVM AOT: 復活(nyrt の read lock 寿命修正、build_llvm.sh のリンクパス `-L target/release` 追加)。 + - JIT AOT(ObjectBuilder): P0 安定化+P1 実装済(const/return、i64 binop、compare、select、branch/jump、hostcall 基本、PHI最小化ブロック引数)。 + - jit-direct で .o 生成確認: `apps/smokes/jit_aot_arith_branch.nyash` → Result 13、.o 出力 OK。 + - build_aot.sh は既定で STRICT=0、出力 `target/aot_objects/main.o` に固定。 + - nyrt: AOT 連携用 dotted 名 alias を Array に追加(`nyash.array.{len_h,get_h,set_h,push_h}`)。 + +- 優先TODO(次にやること) + 1) JIT AOT P2: hostcall 拡張(規約ベースの最小集合) + - Map: `nyash.map.{size_h,get_h,has_h,set_h}` の dotted 名を nyrt に追加(既存実装へ forward) + - String: 代表メソッド(len/concat/substring/indexOf 等)で必要なシンボルを dotted 名として追加 + - ObjectBuilder から `emit_host_call_typed` で呼び出し(Lower の対応表に従う) + 2) LowerCore: slot/name→hostcall マッピング(by‑slot を優先、by‑name は互換フォールバック) + - Array/Map/String の最小セット(len/get/set/push、size/get/has/set、len/concat など) + 3) 後続(必要時): JIT AOT スモークを追加(分岐あり最小、Array/Map の各1本) + +- 実行コマンド(確認用) + - JIT AOT(jit-direct + .o): + - `NYASH_DISABLE_PLUGINS=1 NYASH_JIT_EVENTS=1 NYASH_AOT_OBJECT_OUT=target/aot_objects/jit_aot_arith.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_arith_branch.nyash` + - LLVM AOT(emit+link): + - `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) tools/build_llvm.sh apps/tests/ny-llvm-smoke/main.nyash -o app` + +■ 現在のフォーカス(JITオンリー/一旦の着地) +1) Core 緑維持(完了) + - `tools/jit_smoke.sh` / Roundtrip(A/B) / Bootstrap(c0→c1→c1') / Using E2E = PASS + +【P1 進捗 — LLVM Core-13: ビット演算/シフト】 +実装 +- LLVM 降ろしで `BinaryOp::{BitAnd,BitOr,BitXor,Shl,Shr}` を i64 経路に実装済み(既存)。 +- `compile_and_execute` の MIR インタプリタにも同演算を実装し、パリティを確保。 + +検証 +- 単体テスト追加: `src/tests/llvm_bitops_test.rs` + - MIR を直接構築して `1=(5&3),7=(5|2),4=(5^1),32=(1<<5),4=(32>>3)` の合計 48 を検証。 + - VM 実行で 48、LLVM `compile_to_object` がエラーなく emit、`compile_and_execute` でも 48 を確認(フォールバック実行)。 +- AOT スモーク(任意): `tools/llvm_smoke.sh` に `NYASH_LLVM_BITOPS_SMOKE=1` で有効化する項目を追加(入力は Nyash ソース制約のため現状 skip 既定)。 + +注意 +- Nyash ソースパーサが `&|^<<>>` を未サポートのため、ビット演算の E2E は当面 MIR 直構築テストで担保。 + 将来 `grammar/` の演算子追加後に `apps/tests/ny-llvm-bitops/` を有効化予定。 +2) CI 分離(完了) + - Core(常時): `tools/jit_smoke.sh` + Roundtrip + - Plugins(任意): `NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh`(strict既定OFF、`NYASH_PLUGINS_STRICT=1`でON) +3) Self‑host E2E(完了) + - ny_plugins 有効 + `NYASH_USE_NY_COMPILER=1` の自己ホストE2Eをオプションゲートで運用 +4) クリーンアップ(完了) + - 未使用import/変数の整理、runner責務分割、tools出力体裁の統一 + +■ ブランチ/構成(Phase 15) +- 実装ブランチ: `phase-15/self-host-ny-mir` +- 既存 Workspace は維持(`crates/*`)。 +- 方針: crates 側は変更せず「Nyash スクリプト + nyash.exe」だけで実装・運用(Windows優先)。 + - 例: `C:\git\nyash-project\nyash_self\nyash` 直下で `target\release\nyash` 実行。 +- Nyash 製パーサは `apps/selfhost/ny-parser-nyash/`(Nyashコード)として配置(最初は最小サブセット)。 +- MIR 解釈層は既存 `backend/mir_interpreter.rs` と `runner/modes/mir_interpreter.rs` を拡充。 +- AOT 関連の雛形は `src/backend/cranelift/` に維持(feature gate: `cranelift-aot`)。 + +■ 再開TODO(優先順) +1) std Ny実装の実体化(P0/P1) + - string: length/concat/slice/indexOf/equals → P0 完了(string_smoke PASS) + - array: len/push/pop/slice を内蔵経路で先行(次着手) + - map: get/set/len/keys (+values/entries/forEach) + - jit_smoke に機能検証を常時化(Coreは `NYASH_DISABLE_PLUGINS=1`) +2) NyコンパイラMVPのsubset拡張 + - let/call/return に続き if/ブロック/関数引数まで拡張し、`NYASH_USE_NY_COMPILER=1` スモークを充実 +3) Self‑host E2E ゲートの昇格 + - 連続N回グリーン後にCI optional→requiredへ昇格(trace/hash基準) +4) Plugins厳格ONの段階移行 + - Core‑13準拠サンプルへ置換し、`NYASH_PLUGINS_STRICT=1` ゲートで順次ONに復帰 + +【優先追加 — JIT AOT(ObjectBuilder)安定化・拡張】 +- P0: 安定化(完了) + - switch_to_block なしでの命令発行panic対策(emit_const系) + - 終端命令なしVerifierエラー対策(emit_return 実装) + - build_aot.sh の STRICT 緩和(デフォルト0)+ obj 直指定 +- P1: 最小命令カバレッジ(今すぐ実装) + - i64 binop: add/sub/mul/div/mod を実コード生成 + - compare: eq/ne/lt/le/gt/ge → b1→i64(0/1) へ正規化してpush + - 分岐/ジャンプ: br_if_top_is_true/jump_to 実装(ブロック遷移とCFG整合) + - select: emit_select_i64 実装(cond, then, else の順) +- P2: hostcall 系の型付き発行(必要最小限) + - array/map/string/integer の代表 extern を ObjectBuilder に実装 + - ny-llvm-smoke 等に相当する JIT AOT smoke 追加 +- P3: CI スモーク + - `tools/jit_smoke.sh` に AOT(JIT)最小タスクを追加(STRICT=0 で .o 生成確認) + +## ブロッカー/暫定対応(2025‑09‑05 更新) +- 影響範囲(Backend差) + - JIT(cranelift) → 影響なし。 + - VM(backends=vm) → if/return 無限ループは修正済み(基本ブロック突入時に CF リセット)。 + - 結論: include ハングの根因は VM の制御フロー残存フラグ。修正により解消。 + +- 事象A: include ハング → 解消 + - `apps/tmp_len_min.nyash`/`apps/tmp_len_test.nyash` 正常完走を確認。 + +- 事象B: ArrayBox プラグイン生成エラー → 解消 + - v2 ローダにフォールバック探索(`plugin_paths.search_paths`)を追加し、workspace の `./target/release/*.so` を自動解決。 + - DEBUG 時に birth 戻り `code/out_len` をロギング。 + +- 事象C: std/string_smoke の最終段で未定義値参照 → 解消 + - MIR Builder の if 降ろしで φ を必ず生成(then のみ代入・else 未代入時は pre 値と then 値で合流)。 + - string_smoke PASS を確認。 + +## 次アクション(デバッグ計画) +- A1: includeハング最小化再現を固定(VM経路優先で調査) + - `apps/tmp_len_test.nyash` 固定、`NYASH_DEBUG=1` で `execute_include_expr` → `ensure_static_box_initialized` までの経路にログを追加。 + - `included_files`/`include_stack` の push/pop と RwLock/RwLock の取り回しを確認。ポップ忘れ/二重ロックがないか検査。 + - `apps/std/string.nyash` 内のメソッドを段階的に無効化して最小原因を特定(現状 length のみでも再現)。 + +- A2: VM if/return 無限実行(VM限定)を優先修正 + - 症状: JITは1回then→Return→終了。VMはthenのprintが際限なく繰り返される。 + - 再現最小: `apps/tmp_if_min.nyash` + ```nyash + static box Main { + main() { + local x + x = 3 + if x == 3 { + print("ok3") + return 0 + } + print("bad") + return 1 + } + } + ``` + - JIT: `./target/release/nyash apps/tmp_if_min.nyash` → 1回だけ ok3, Result:0 + - VM: `timeout 4s ./target/release/nyash --backend vm apps/tmp_if_min.nyash` → ok3 が無限に出続け TIMEOUT + - MIRダンプ(`NYASH_VM_DUMP_MIR=1`)では if 降下は正しく、then/else 各ブロックは `ret` を含む。 + - 例: bb1 に `extern_call log("ok3")` の後 `ret 0`。bb2 に `ret 1`。 + - 観測ログ(`NYASH_VM_DEBUG_EXEC=1`)では Print/Const が繰り返し実行。Return の終端処理が機能していない疑い。 + - 仮説: VM 実行ループの制御フロー(`execute_function`)で `ControlFlow::Return` を受け取った後の関数脱出が何らかの理由で無効化/上書き/再入している。 + - 着手案: + - `execute_function` に短期ログ: 現在ブロックID/terminator種別/`should_return` セット→関数戻りの分岐をeprintln(NYASH_VM_DEBUG_EXEC=1時) + - `execute_instruction` で `Return` ディスパッチ時に明示ログ(val_id/値)を出す(現状VTトレースも可)。 + - `previous_block`/`loop_executor`/`record_transition` で自己遷移が起きていないか確認。 + - `BasicBlock::add_instruction` にて terminator設定/Successorsの更新は正常(コード・MIR上はOK)。処理後の `next_block` 決定ロジックを再点検。 + +## ハンドオフ(変更点・補助情報) +- 追加ファイル(std MVP + smokes) + - `apps/std/string.nyash`, `apps/std/array.nyash` + - `apps/smokes/std/string_smoke.nyash`, `apps/smokes/std/array_smoke.nyash` +- スクリプト/設定の更新 + - `tools/jit_smoke.sh`: Std smokes に `timeout 15s`、ArrayBox未提供時は `SKIP` を出力 + - `tools/smoke_plugins.sh`: `NYASH_PLUGINS_STRICT=1` のON/OFF表示 + - `nyash.toml`: `ny_plugins` に std 2件を追加 + - `src/runner/modes/vm.rs`: `NYASH_VM_DUMP_MIR=1` でVM実行前にMIRをダンプ + - `src/mir/builder/stmts.rs`: 末尾 `return/throw` 後に同ブロックへ更に命令を積まないための早期breakを追加(安全強化) +- 再現とログ + - VM再現: `timeout 4s ./target/release/nyash --backend vm apps/tmp_if_min.nyash` + - JIT対照: `./target/release/nyash apps/tmp_if_min.nyash` + - MIRダンプ: `NYASH_VM_DUMP_MIR=1 --backend vm ...` + - 命令トレース: `NYASH_VM_DEBUG_EXEC=1 --backend vm ...` +- プラグイン/ArrayBox注意 + - 既定でプラグイン経由に迂回するため、未ビルドだと ArrayBox 生成に失敗。 + - 回避: `NYASH_USE_PLUGIN_BUILTINS=0` または `NYASH_PLUGIN_OVERRIDE_TYPES` から `ArrayBox,MapBox`を除外。もしくはプラグインをビルド。 + +## すぐ着手できるTODO(VM側) +- [ ] `execute_function` にブロック遷移/Return検出ログ(NYASH_VM_DEBUG_EXEC=1時のみ) +- [ ] Return発生時に確実に `Ok(return_value)` で関数を抜けることを確認(`should_return`/`next_block` の上書き防止) +- [ ] `record_transition`/`loop_executor` の副作用で自己遷移が起きていないか確認 +- [ ] 修正後、`apps/tmp_if_min.nyash` が VM/JIT 両方で一発終了することを確認(MIRダンプ上は既に正しい) +- B1: ArrayBox 経路の選択を明示 + - 手元では `NYASH_USE_PLUGIN_BUILTINS=0` で内蔵にフォールバックするか、プラグインを `cargo build -p nyash-array-plugin --release` で用意。 + - CIは当面 `SKIP` 維持。 + +## 実行メモ(暫定) +- Std smokes(手元で回す) + - `NYASH_LOAD_NY_PLUGINS=1 NYASH_USE_PLUGIN_BUILTINS=0 ./tools/jit_smoke.sh` + - またはプラグインをビルドしてから `NYASH_LOAD_NY_PLUGINS=1 ./tools/jit_smoke.sh` + +■ 予定(R5 拡張: Ny Plugins → Namespace) +- Phase A(最小): 共有レジストリ `NyModules` を追加し、`env.modules.set/get` で exports を登録/取得。 + - `[ny_plugins]` は戻り値(Map/StaticBox)を「ファイルパス→名前空間」に変換して登録。 + - 名前空間導出: ルート相対・区切りは `.`、拡張子除去・無効文字は `_`。予約 `nyashstd.*` 等は拒否。 +- Phase B(範囲): 共有Interpreterオプション(`NYASH_NY_PLUGINS_SHARED=1`)で静的定義を共有。ログに REGISTERED を出力。 +- Phase C(言語結線): `using ` を `NyModules` 参照→未解決時にファイル/パッケージ解決(nyash.link)へフォールバック。 + +■ 直近で完了したこと(主要抜粋/JIT) +- R1: JSON v0 ブリッジ(`--ny-parser-pipe`/`--json-file`)、変換器 `src/runner/json_v0_bridge.rs`、スモーク追加 +- R2: ラウンドトリップ E2E(`tools/ny_roundtrip_smoke.{sh,ps1}`) +- R3: 直結ブリッジ v0(`--parser ny`/`NYASH_USE_NY_PARSER=1`、`NYASH_DUMP_JSON_IR=1`)→ `return (1+2)*3` で 9 +- R5: Ny スクリプトプラグイン([ny_plugins])列挙+実行(OK/FAIL 出力・列挙のみガード付き) + - NyModules登録/名前空間導出/Windows正規化の仕様確定・回帰スモーク + - using/namespace(ゲート)・nyash.link最小・resolverキャッシュ・実行時フック(提案付き診断) +- AOT P2(step‑1): RUN スモーク配線(最小オブジェクト生成+実行ログ) + +- ■ 直近で完了したこと(主要抜粋) +- T0: MIRインタープリタ強化(分岐/比較/PHI/extern/Box最小)+ Runner 観測ログ +- T1: Nyash製ミニパーサ(整数/四則/括弧/return)→ JSON IR v0 出力 +- T2: JSON IR v0 → MIRModule 受け口(`--ny-parser-pipe`) +- T3: CLI 切替/ヘルプ(`--ny-parser-pipe`/`--json-file`、mirヘルプ追補) +- T4: Docs/Samples/Runner scripts(apps/ny-mir-samples, tools/*, README 追補) +- Phase 15 起点準備 + - CLIに `--backend cranelift-aot` と `--poc-const` を追加(プレースホルダ動作)。 + - `src/backend/cranelift/{mod.rs,aot_box.rs,linker_box.rs}` の雛形追加(feature gate)。 + - MIR解釈層スケルトン(`semantics/eval.rs` と `backend/mir_interpreter.rs`)の確認 + +■ 再開用クイックメモ(JITのみ) +- ビルド + - VM/JIT: `cargo build --release --features cranelift-jit` + - LLVM(必要時): `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm` + - AOT(導入後): `cargo build --release --features cranelift-aot` +- スモーク(JIT/VM) + - Core: `NYASH_DISABLE_PLUGINS=1 NYASH_CLI_VERBOSE=1 ./tools/smoke_vm_jit.sh` + - Parser Bridge: `./tools/ny_parser_bridge_smoke.sh` + - Roundtrip: `./tools/ny_roundtrip_smoke.sh`(A/B) + - Plugins: `NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh`(厳格は `NYASH_PLUGINS_STRICT=1` 時のみON) + - Bootstrap: `./tools/bootstrap_selfhost_smoke.sh` + - Using/Resolver: `./tools/using_e2e_smoke.sh` + +■ 状態 +- JIT自己ホストMVP: 到達(E2E/ブートストラップ/ドキュメント/CI分離まで完了) +- リファクタ: Step1/2/3 完了(未使用掃除・runner分割・tools体裁統一) +- 次回は「std実装の実体化」と「Nyコンパイラsubset拡張」から再開 +- 参照 + - Phase 15 概要/ロードマップ: `docs/development/roadmap/phases/phase-15/README.md`, `docs/development/roadmap/phases/phase-15/ROADMAP.md` + - ハンドオフ: `docs/handoff/phase-15-handoff.md` + - 設計/API: `docs/backend-cranelift-aot-design.md`, `docs/interfaces/*` + +■ 合否基準(P0: Ny→MIR→MIR-Interp→VM 最小成立) +- 自作Nyashパーサ(最小サブセット)が Nyash で動作し、テスト入力から中間形式(JSON暫定)を生成できる。 +- Runner が中間形式を MIRModule に変換し、MIR 解釈層で実行して既知の結果(例: `Result: 42`)を出力する。 +- 代表ケース(整数四則演算/括弧/return)で往復が安定。 + +■ JSON IR v0(暫定スキーマ) +- version: 整数(例: 0) +- kind: 固定 "Program" +- body: 配列(Stmt[]) +- Stmt(最小) + - { "type": "Return", "expr": Expr } +- Expr(最小) + - { "type": "Int", "value": 123 } + - { "type": "Binary", "op": "+"|"-"|"*"|"/", "lhs": Expr, "rhs": Expr } +- error(失敗時) + - { "version":0, "kind":"Error", "error": { "message": "...", "span": {"start":N, "end":M} } } +- 例 + - `return 1+2*3` → {"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Binary","op":"+","lhs":{"type":"Int","value":1},"rhs":{"type":"Binary","op":"*","lhs":{"type":"Int","value":2},"rhs":{"type":"Int","value":3}}}}]} + - `return (1+2)*3` → `Binary('*', Binary('+',1,2), 3)` の形で生成 + +■ 補足(優先/範囲) +- 先行するのは Ny→MIR→MIR-Interp→VM の自己ホスト経路(AOTはP2以降)。 +- OS 優先: Windows →(後続で Linux/macOS)。 +- メモリ/GC: P0は整数演算/定数返し中心でNyRT拡張不要。 +- Codex 非同期運用: `tools/codex-async-notify.sh`/`tools/codex-keep-two.sh` 継続利用。 + +## 実行コマンド(サマリ) +- VM/JIT 実行例 + - `printf "Hello\n" | NYASH_CLI_VERBOSE=0 ./target/release/nyash apps/ny-echo/main.nyash` + - `printf "Hello\n" | NYASH_CLI_VERBOSE=0 ./target/release/nyash --backend vm apps/ny-echo/main.nyash` +- AOT/LLVM 系は後段(当面OFF) + +- JSON v0 ブリッジ(R1 Quick Start) + - パイプ実行(Unix/WSL): `printf '{"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Binary","op":"+","lhs":{"type":"Int","value":1},"rhs":{"type":"Binary","op":"*","lhs":{"type":"Int","value":2},"rhs":{"type":"Int","value":3}}}}]}' | ./target/release/nyash --ny-parser-pipe` + - ファイル指定(Unix/WSL): `./target/release/nyash --json-file sample.json` + - スモーク(Unix/Windows): `./tools/ny_parser_bridge_smoke.sh` / `pwsh -File tools/ny_parser_bridge_smoke.ps1` + +- E2E ラウンドトリップ(R2) + - Unix/WSL: `./tools/ny_roundtrip_smoke.sh` + - Windows: `pwsh -File tools/ny_roundtrip_smoke.ps1` + - tmux通知で並列実行(例): + - `CODEX_ASYNC_DETACH=1 ./tools/codex-async-notify.sh "./tools/ny_roundtrip_smoke.sh" codex` + - `CODEX_ASYNC_DETACH=1 ./tools/codex-async-notify.sh "pwsh -File tools/ny_roundtrip_smoke.ps1" codex` + +- Ny プラグイン列挙(R5) + - 有効化: `--load-ny-plugins` または `NYASH_LOAD_NY_PLUGINS=1` + - `nyash.toml` 例: + ```toml + ny_plugins = [ + "apps/std/ny-config.nyash", + "apps/plugins/my-helper.nyash" + ] + ``` + - 実行: 列挙に加え、Interpreterで順次実行(ベストエフォート)。 + - ガード: `NYASH_NY_PLUGINS_LIST_ONLY=1` で列挙のみ(実行しない) + - 注意: プラグインスクリプトは副作用の少ない初期化/登録処理に限定推奨。 + - Std Ny スモーク実行(任意): `NYASH_LOAD_NY_PLUGINS=1 ./tools/jit_smoke.sh` + +## トレース/環境変数(抜粋) +- AOT/Link: `NYASH_LINKER`, `NYASH_LINK_FLAGS`, `NYASH_LINK_VERBOSE` +- ABI: `NYASH_ABI_VTABLE=1`, `NYASH_ABI_STRICT=1` +- VM/JIT: `NYASH_VM_PIC_STATS`, `NYASH_JIT_DUMP` など従来通り + +--- +詳細な履歴や議事録は docs 配下の Phase 15 セクションを参照してください。 + - ny-config(R4) + - `./target/release/nyash apps/std/ny-config.nyash` + - 現状: Interpreter 経路のプラグイン初期化順序により FileBox/TOMLBox を使うには Runner 側の微調整が必要(VM 経路への移行 or プラグイン登録の早期化)。スクリプト本体は追加済み。 +- 直結ブリッジ v0(R3 Quick Start) + - `printf 'return (1+2)*3\n' > t.ny && NYASH_USE_NY_PARSER=1 NYASH_DUMP_JSON_IR=1 ./target/release/nyash t.ny` + + +--- + +New Plan — Self‑Host Dependency Tree (Ny‑only) and Bridge(2025‑09‑07) + +目的 +- Ny スクリプトのみで依存木(include + using/module)を再帰解析して JSON を出力。Rust ビルド無しで回せる内側ループを整備。 +- 既存の MIR→VM→AOT 系とは疎結合を維持しつつ、最小の橋渡し(JSONファイル経由)を用意。 + +実装項目(最小) +- ツール: `apps/selfhost/tools/dep_tree_simple.nyash` + - 1ファイル・静的boxで実装。1行1文/break無し/elseは同一行。 + - 解析: `include "..."`、`using ns`/`using ns as Alias`、`using "./path" as Name`、`// @module ns=path`。 + - 解決順: `module > 相対 > using-path`(using-path 既定: `apps/selfhost:apps:lib:.`)。 + - JSON: `{ version, root_path, tree{ path, includes[], uses[], modules[], children[] } }`(uses は unresolved/hint/alias/resolved を含む)。 + +- タスク/Make: + - `nyash.toml [tasks].dep_tree` を追加し、1コマンドで JSON を `tmp/deps.json` に出力。 + - `make dep-tree`: `cargo build --release && ./target/release/nyash --run-task dep_tree`。 + +- 受け入れ基準: + - `make dep-tree` が `tmp/deps.json` を出力。曖昧(複数ヒット)は注記/STRICT で停止。 + - VM/Interpreter いずれでも実行可(File/Path/Array/Map 最小APIで実装)。 + +橋渡し(Stage 1: 疎結合) +- `NYASH_DEPS_JSON=` を Runner で読取り(ログ出力等の診断用途)。MIR/JIT/AOT の挙動は不変。 +- 後続(Stage 2以降)は JSON IR `extensions.deps` や lock ファイルの導入を検討(別期)。 + +進め方(短期) +1) `dep_tree_simple.nyash` の完走化(VM実行での File/Path 最小APIのみ使用)。 +2) `nyash.toml` へ `dep_tree` 追加+ `make dep-tree` 整備。 +3) Runner へ `NYASH_DEPS_JSON` の最小読込み(ログ出力)を追加(影響ゼロの範囲)。 diff --git a/crates/nyrt/src/lib.rs b/crates/nyrt/src/lib.rs index cd896508..11d3f397 100644 --- a/crates/nyrt/src/lib.rs +++ b/crates/nyrt/src/lib.rs @@ -2386,6 +2386,54 @@ pub extern "C" fn nyash_console_log_export(ptr: *const i8) -> i64 { 0 } +// Exported as: nyash.console.log_handle(i64 handle) -> i64 +#[export_name = "nyash.console.log_handle"] +pub extern "C" fn nyash_console_log_handle(handle: i64) -> i64 { + if handle <= 0 { return 0; } + + if let Some(obj) = nyash_rust::jit::rt::handles::get(handle as u64) { + let s = obj.to_string_box().value; // 既存の統一文字列変換メソッド + println!("{}", s); + } + 0 +} + +// Exported as: nyash.console.warn_handle(i64 handle) -> i64 +#[export_name = "nyash.console.warn_handle"] +pub extern "C" fn nyash_console_warn_handle(handle: i64) -> i64 { + if handle <= 0 { return 0; } + + if let Some(obj) = nyash_rust::jit::rt::handles::get(handle as u64) { + let s = obj.to_string_box().value; + eprintln!("WARN: {}", s); + } + 0 +} + +// Exported as: nyash.console.error_handle(i64 handle) -> i64 +#[export_name = "nyash.console.error_handle"] +pub extern "C" fn nyash_console_error_handle(handle: i64) -> i64 { + if handle <= 0 { return 0; } + + if let Some(obj) = nyash_rust::jit::rt::handles::get(handle as u64) { + let s = obj.to_string_box().value; + eprintln!("ERROR: {}", s); + } + 0 +} + +// Exported as: nyash.debug.trace_handle(i64 handle) -> i64 +#[export_name = "nyash.debug.trace_handle"] +pub extern "C" fn nyash_debug_trace_handle(handle: i64) -> i64 { + if handle <= 0 { return 0; } + + if let Some(obj) = nyash_rust::jit::rt::handles::get(handle as u64) { + let s = obj.to_string_box().value; + eprintln!("TRACE: {}", s); + } + 0 +} + // Exported as: nyash.console.warn(i8* cstr) -> i64 #[export_name = "nyash.console.warn"] pub extern "C" fn nyash_console_warn_export(ptr: *const i8) -> i64 { diff --git a/debug_counter_side_effects.nyash b/debug_counter_side_effects.nyash new file mode 100644 index 00000000..ff9fb5c8 --- /dev/null +++ b/debug_counter_side_effects.nyash @@ -0,0 +1,15 @@ +// Test if CounterBox side effects work +print("Testing counter side effects:") +local c = new CounterBox() +print("Initial counter (should be 0):") +local initial = c.get() +print(initial) + +print("Incrementing...") +c.inc() +c.inc() +c.inc() + +print("After 3 increments (should be 3):") +local final = c.get() +print(final) \ No newline at end of file diff --git a/debug_integer_method.nyash b/debug_integer_method.nyash new file mode 100644 index 00000000..2aca9b21 --- /dev/null +++ b/debug_integer_method.nyash @@ -0,0 +1,9 @@ +// Test IntegerBox method calls +print("Testing IntegerBox methods:") +local i = new IntegerBox(42) +print("Constructor result:") +print(i) +print("Calling get() method:") +local result = i.get() +print("Method result:") +print(result) \ No newline at end of file diff --git a/debug_simple_counter.nyash b/debug_simple_counter.nyash new file mode 100644 index 00000000..8f281b07 --- /dev/null +++ b/debug_simple_counter.nyash @@ -0,0 +1,6 @@ +// Very simple test +print("Testing counter:") +local c = new CounterBox() +local result = c.get() +print("Result:") +print(result) \ No newline at end of file diff --git a/debug_simple_integer.nyash b/debug_simple_integer.nyash new file mode 100644 index 00000000..8e475757 --- /dev/null +++ b/debug_simple_integer.nyash @@ -0,0 +1,5 @@ +// Test with IntegerBox constructor (should return Integer) +print("Testing IntegerBox:") +local i = new IntegerBox(42) +print("Value:") +print(i) \ No newline at end of file diff --git a/debug_simple_math.nyash b/debug_simple_math.nyash new file mode 100644 index 00000000..95a7fe7c --- /dev/null +++ b/debug_simple_math.nyash @@ -0,0 +1,6 @@ +// Test with MathBox +print("Testing MathBox:") +local m = new MathBox() +local result = m.sqrt(16) +print("sqrt(16) =") +print(result) \ No newline at end of file diff --git a/docs/development/roadmap/phases/phase-50/README.md b/docs/development/roadmap/phases/phase-50/README.md new file mode 100644 index 00000000..76185844 --- /dev/null +++ b/docs/development/roadmap/phases/phase-50/README.md @@ -0,0 +1,193 @@ +# Phase 50: GPU Box Computing 🎮 + +**夢の実行形態:Everything is GPU Box!** + +## 🌟 ビジョン + +Nyashの「Everything is Box」哲学を活かし、超並列GPU実行を実現する革命的な実行形態。 +箱の独立性と純粋性を利用して、数万〜数百万のBoxを同時にGPU上で実行! + +## 📦 なぜBoxとGPUは相性が良いか + +### 1. **完璧な並列性** +- 各Boxは独立 → データ競合なし +- メッセージパッシングのみ → 同期が単純 +- 副作用なし → GPU実行に最適 + +### 2. **メモリ効率** +- Boxはイミュータブル → 読み取り専用GPU メモリ +- 型が明確 → 最適なメモリレイアウト +- 予測可能なアクセスパターン + +### 3. **計算の均一性** +- 同じ型のBox → 同じGPUカーネル +- メソッド単位の実行 → SIMD/SIMT に最適 + +## 🏗️ アーキテクチャ + +### GPU Box定義 +```nyash +// GPU実行可能なBox +gpu box Particle { + position: VectorBox + velocity: VectorBox + mass: FloatBox + + @gpu + update(deltaTime) { + // このメソッドはGPU上で実行される + me.position = me.position + me.velocity * deltaTime + } +} + +// 100万個の粒子を同時処理 +local particles = new GPUArrayBox(1_000_000, Particle) +particles.gpuExecute("update", 0.016) // 全粒子並列更新! +``` + +### 実行モデル +``` +Nyashコード + ↓ +MIR (Box呼び出し) + ↓ +GPU IR生成 + ↓ +CUDA/OpenCL/Vulkan Compute + ↓ +GPU実行 +``` + +## 💡 実装アイデア + +### 1. スマートディスパッチ +```nyash +box SmartArray from ArrayBox { + map(func) { + if me.size > GPU_THRESHOLD { + // 自動的にGPU実行へ + return me.gpuMap(func) + } else { + return me.cpuMap(func) + } + } +} +``` + +### 2. GPU Box制約 +- `@gpu`アノテーション付きメソッドのみGPU実行 +- 純粋関数であること(副作用禁止) +- 基本型またはGPU対応Box型のみ使用可能 + +### 3. メモリ管理 +```nyash +// GPU メモリ上のBox配列 +gpu box ImageBuffer { + pixels: GPUArrayBox + + @gpu + applyFilter(kernel) { + // GPU上で畳み込み演算 + me.pixels.convolve(kernel) + } +} +``` + +## 🌈 応用例 + +### 1. リアルタイム画像処理 +```nyash +local image = new ImageBox("photo.jpg") +local filters = new GPUPipeline([ + BlurBox(radius: 5), + BrightnessBox(level: 1.2), + ContrastBox(amount: 1.5) +]) +image.applyGPU(filters) // 全フィルタ並列実行! +``` + +### 2. 物理シミュレーション +```nyash +gpu box FluidCell { + density: FloatBox + velocity: Vector3Box + pressure: FloatBox + + @gpu + simulate(neighbors: ArrayBox) { + // ナビエ・ストークス方程式をGPUで解く + me.updatePressure(neighbors) + me.updateVelocity(neighbors) + } +} +``` + +### 3. AI/機械学習 +```nyash +gpu box Neuron { + weights: TensorBox + bias: FloatBox + + @gpu + forward(input: TensorBox) { + // テンソル演算をGPUで高速化 + return (me.weights @ input + me.bias).relu() + } +} + +// ニューラルネットワーク全層をGPU実行 +local network = new GPUNetwork([ + DenseLayer(neurons: 1024), + DenseLayer(neurons: 512), + DenseLayer(neurons: 10) +]) +``` + +### 4. 暗号通貨マイニング(?) +```nyash +gpu box HashBox { + @gpu + mine(nonce) { + // SHA-256をGPUで並列計算! + return me.hash(nonce) + } +} +``` + +## 🚀 実装ロードマップ + +### Stage 1: 基礎実装 +- [ ] GPU Box アノテーション(`@gpu`) +- [ ] 基本的なGPU IR生成 +- [ ] 単純な数値演算のGPU実行 + +### Stage 2: 型システム統合 +- [ ] GPU互換型チェッカー +- [ ] GPU メモリ管理 +- [ ] CPU ⇔ GPU データ転送最適化 + +### Stage 3: 高度な最適化 +- [ ] Box融合最適化(カーネル結合) +- [ ] 自動CPU/GPUスケジューリング +- [ ] マルチGPU対応 + +### Stage 4: エコシステム +- [ ] GPU Boxライブラリ +- [ ] プロファイリングツール +- [ ] デバッガー対応 + +## 🎯 成功指標 + +1. **パフォーマンス**: CPU実行の100倍〜1000倍高速化 +2. **使いやすさ**: `@gpu`を付けるだけで自動GPU実行 +3. **互換性**: 既存のBoxコードがそのまま動く + +## 💭 夢の先へ + +- **量子コンピューティング対応**: `@quantum` アノテーション +- **分散GPU実行**: 複数マシンのGPUを透過的に使用 +- **AIアシスト最適化**: 実行パターンを学習して自動最適化 + +--- + +*"Everything is Box, Everything is Parallel, Everything is Fast!"* 🚀 \ No newline at end of file diff --git a/docs/development/roadmap/phases/phase-50/gpu-box-spec.md b/docs/development/roadmap/phases/phase-50/gpu-box-spec.md new file mode 100644 index 00000000..3e2890ee --- /dev/null +++ b/docs/development/roadmap/phases/phase-50/gpu-box-spec.md @@ -0,0 +1,154 @@ +# GPU Box 技術仕様(案) + +## 🔧 技術的詳細 + +### GPU Box の要件 + +1. **純粋性** + - 副作用を持たない + - 外部状態に依存しない + - 決定的な実行結果 + +2. **型制約** + - GPU互換型のみ使用可能 + - ポインタ/参照の制限 + - 再帰呼び出し禁止 + +3. **メモリモデル** + ```nyash + // GPU メモリレイアウト + gpu box ParticleArray { + // Structure of Arrays (SoA) で自動配置 + positions: GPUBuffer + velocities: GPUBuffer + masses: GPUBuffer + } + ``` + +### MIR → GPU IR 変換 + +``` +// Nyash MIR +BoxCall { + box_val: %particles, + method: "update", + args: [%deltaTime] +} + +// ↓ 変換 + +// GPU IR(擬似コード) +kernel particle_update { + params: [particles_ptr, deltaTime] + threads: particles.count + + thread_body: { + idx = thread_id() + pos = load(particles.positions[idx]) + vel = load(particles.velocities[idx]) + new_pos = pos + vel * deltaTime + store(particles.positions[idx], new_pos) + } +} +``` + +### バックエンド対応 + +1. **CUDA** (NVIDIA GPU) + - PTX生成 + - cuBLAS/cuDNN統合 + +2. **OpenCL** (クロスプラットフォーム) + - SPIR-V生成 + - 各種GPU対応 + +3. **Vulkan Compute** (モダンAPI) + - SPIR-V生成 + - モバイルGPU対応 + +4. **Metal** (Apple GPU) + - Metal Shading Language + - Apple Silicon最適化 + +### 最適化技術 + +1. **Box融合** + ```nyash + // これらの操作を1つのGPUカーネルに融合 + data.map(x => x * 2) + .filter(x => x > 10) + .reduce(+) + ``` + +2. **メモリ合体アクセス** + - Boxフィールドの最適配置 + - キャッシュ効率の最大化 + +3. **占有率最適化** + - スレッドブロックサイズ自動調整 + - レジスタ使用量の制御 + +### エラー処理 + +```nyash +gpu box SafeDiv { + @gpu + divide(a, b) { + if b == 0 { + // GPU例外はCPU側で処理 + gpu.raise(DivisionByZeroError) + } + return a / b + } +} +``` + +## 🔍 課題と解決策 + +### 課題1: デバッグの困難さ +**解決**: GPU実行トレース機能 +```nyash +// デバッグモードでGPU実行を記録 +local result = particles.gpuExecute("update", 0.016, debug: true) +print(result.trace) // 各スレッドの実行履歴 +``` + +### 課題2: CPU/GPU同期オーバーヘッド +**解決**: 非同期実行とパイプライン +```nyash +// GPU実行を非同期化 +local future = particles.gpuExecuteAsync("update", 0.016) +// CPU側で他の処理を継続 +doOtherWork() +// 必要な時に結果を取得 +local result = await future +``` + +### 課題3: メモリ制限 +**解決**: ストリーミング処理 +```nyash +// 大規模データを分割処理 +largeData.gpuStream(chunkSize: 1_000_000) + .map(process) + .collect() +``` + +## 🎓 学習曲線を下げる工夫 + +1. **自動GPU化** + - コンパイラが自動的にGPU実行可能性を判定 + - ヒント表示: 「このBoxはGPU実行可能です」 + +2. **段階的移行** + - 既存コードはCPUで動作保証 + - `@gpu`を追加するだけでGPU化 + +3. **プロファイリング支援** + ```nyash + // GPU実行の効果を可視化 + local profile = Profiler.compare( + cpu: => particles.update(0.016), + gpu: => particles.gpuExecute("update", 0.016) + ) + print(profile.speedup) // "GPU: 156.3x faster" + ``` \ No newline at end of file diff --git a/src/backend/llvm/compiler.rs b/src/backend/llvm/compiler.rs index d24571e8..a5abf78f 100644 --- a/src/backend/llvm/compiler.rs +++ b/src/backend/llvm/compiler.rs @@ -775,21 +775,37 @@ impl LLVMCompiler { // Route console.log/warn/error/readLine and debug.trace to NyRT shims if (iface_name == "env.console" && (method_name == "log" || method_name == "warn" || method_name == "error")) || (iface_name == "env.debug" && method_name == "trace") { - if args.len() != 1 { return Err(format!("{}.{} expects 1 arg (string)", iface_name, method_name)); } + if args.len() != 1 { return Err(format!("{}.{} expects 1 arg (handle)", iface_name, method_name)); } let av = *vmap.get(&args[0]).ok_or("extern arg missing")?; - let i8p = codegen.context.i8_type().ptr_type(AddressSpace::from(0)); - let sp = match av { - BasicValueEnum::PointerValue(pv) => pv, - BasicValueEnum::IntValue(iv) => codegen.builder.build_int_to_ptr(iv, i8p, "arg_i2p").map_err(|e| e.to_string())?, - _ => return Err("extern arg must be string pointer or i64 handle".to_string()), + + // Handle-based console functions (i64 → i64) + let arg_val = match av { + BasicValueEnum::IntValue(iv) => { + // Handle different integer types (i1, i32, i64) + if iv.get_type() == codegen.context.bool_type() { + // bool (i1) → i64 zero-extension + codegen.builder.build_int_z_extend(iv, codegen.context.i64_type(), "bool2i64").map_err(|e| e.to_string())? + } else if iv.get_type() == codegen.context.i64_type() { + iv // already i64 + } else { + // other integer types → i64 sign-extension + codegen.builder.build_int_s_extend(iv, codegen.context.i64_type(), "int2i64").map_err(|e| e.to_string())? + } + }, + BasicValueEnum::PointerValue(pv) => codegen.builder.build_ptr_to_int(pv, codegen.context.i64_type(), "p2i").map_err(|e| e.to_string())?, + _ => return Err("console.log arg conversion failed".to_string()), }; - let i8p = codegen.context.i8_type().ptr_type(AddressSpace::from(0)); - let fnty = codegen.context.i64_type().fn_type(&[i8p.into()], false); + + let fnty = codegen.context.i64_type().fn_type(&[codegen.context.i64_type().into()], false); let fname = if iface_name == "env.console" { - match method_name.as_str() { "log" => "nyash.console.log", "warn" => "nyash.console.warn", _ => "nyash.console.error" } - } else { "nyash.debug.trace" }; + match method_name.as_str() { + "log" => "nyash.console.log_handle", + "warn" => "nyash.console.warn_handle", + _ => "nyash.console.error_handle" + } + } else { "nyash.debug.trace_handle" }; let callee = codegen.module.get_function(fname).unwrap_or_else(|| codegen.module.add_function(fname, fnty, None)); - let _ = codegen.builder.build_call(callee, &[sp.into()], "extern_rt").map_err(|e| e.to_string())?; + let _ = codegen.builder.build_call(callee, &[arg_val.into()], "console_log_h").map_err(|e| e.to_string())?; if let Some(d) = dst { vmap.insert(*d, codegen.context.i64_type().const_zero().into()); } } else if iface_name == "env.console" && method_name == "readLine" { if !args.is_empty() { return Err("console.readLine expects 0 args".to_string()); }