From 912d2137cee070ca423b173d670b0d84d69b2a9f Mon Sep 17 00:00:00 2001 From: BkPankaj Date: Wed, 28 Aug 2024 17:14:09 +0530 Subject: [PATCH] fixed errors and added week 13 progress --- README.md | 8 +- docs/_config.yml | 1 - docs/_data/navigation.yml | 2 + docs/_posts/2024-06-03-code-w1.md | 8 +- docs/_posts/2024-06-10-code-w2.md | 10 +- ...06-10-code-w3.md => 2024-06-17-code-w3.md} | 8 +- ...06-10-code-w4.md => 2024-06-24-code-w4.md} | 12 +- ...06-10-code-w5.md => 2024-07-01-code-w5.md} | 4 +- ...0-code-w6-7.md => 2024-07-15-code-w6-7.md} | 0 ...06-10-code-w8.md => 2024-07-22-code-w8.md} | 6 +- ...06-10-code-w9.md => 2024-07-29-code-w9.md} | 8 +- ...-05-code-w10.md => 2024-08-05-code-w10.md} | 8 +- ...de-w11-12.md => 2024-08-20-code-w11-12.md} | 0 docs/_posts/2024-08-25-code-w13.md | 54 ++ ...07-05-summary.md => 2024-08-26-summary.md} | 7 +- docs/_site/feed.xml | 567 +++++++++--------- docs/_site/index.html | 47 +- docs/assets/images/thirtyeight.png | Bin 0 -> 107129 bytes docs/assets/images/thirtyseven.png | Bin 0 -> 50071 bytes docs/index.md | 8 +- 20 files changed, 424 insertions(+), 334 deletions(-) rename docs/_posts/{2024-06-10-code-w3.md => 2024-06-17-code-w3.md} (93%) rename docs/_posts/{2024-06-10-code-w4.md => 2024-06-24-code-w4.md} (92%) rename docs/_posts/{2024-06-10-code-w5.md => 2024-07-01-code-w5.md} (93%) rename docs/_posts/{2024-06-10-code-w6-7.md => 2024-07-15-code-w6-7.md} (100%) rename docs/_posts/{2024-06-10-code-w8.md => 2024-07-22-code-w8.md} (95%) rename docs/_posts/{2024-06-10-code-w9.md => 2024-07-29-code-w9.md} (95%) rename docs/_posts/{2024-07-05-code-w10.md => 2024-08-05-code-w10.md} (96%) rename docs/_posts/{2024-07-05-code-w11-12.md => 2024-08-20-code-w11-12.md} (100%) create mode 100644 docs/_posts/2024-08-25-code-w13.md rename docs/_posts/{2024-07-05-summary.md => 2024-08-26-summary.md} (98%) create mode 100644 docs/assets/images/thirtyeight.png create mode 100644 docs/assets/images/thirtyseven.png diff --git a/README.md b/README.md index 62745e0..6e5bddc 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,10 @@ This GSoC Project focuses on adding a global block composition feature, resolvin - [Toshan Luktuke](https://github.com/toshan-luktuke) -**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/) -**Github Issues**: [Summary](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+) -**Pull Requests:** [Summary](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+) +**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/)
+**Project Summary:** [Explore Summary](https://theroboticsclub.github.io/gsoc2024-Pankaj_Borade/summary/)
+**About:** [Explore About](https://theroboticsclub.github.io/gsoc2024-Pankaj_Borade/About/)
+**Github Issues**: [View Issues](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+)
+**Pull Requests:** [See Pull Requests](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+)
Thank you for your interest, and feel free to reach out via email if you have any questions, comments, or suggestions. I hope you find my work engaging! diff --git a/docs/_config.yml b/docs/_config.yml index 2cecb78..964a0ea 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -99,7 +99,6 @@ defaults: author_profile: true read_time: true comments: true - share: true related: true # _pages - scope: diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 9dc4fd3..a6a04b9 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -39,6 +39,8 @@ docs: url: /coding-week10/ - title: "Coding Period - Week 11 & 12" url: /coding-week11-12/ + - title: "Coding Period - Week 13" + url: /coding-week13/ - title: "Project Summary" url: /summary/ \ No newline at end of file diff --git a/docs/_posts/2024-06-03-code-w1.md b/docs/_posts/2024-06-03-code-w1.md index 11ba717..11781f4 100644 --- a/docs/_posts/2024-06-03-code-w1.md +++ b/docs/_posts/2024-06-03-code-w1.md @@ -17,14 +17,14 @@ From here onwards Coding period begins, During the Monday meeting, mentors discu ## Accomplishment and Challenges -* #### First yaml file for Github Actions +* ### First yaml file for Github Actions First of all, it was my first time writing a YAML file for GitHub Actions. I used resources such as YouTube videos [1] and GitHub Actions documentation [2] to help me write the initial script. From the discussions, it was clear that testing should trigger when there is a pull request to the master branch, so I started with that and followed the VisualCircuit documentation for the frontend installation. First failure of coding period: ![one](../assets/images/one.png) -* #### Creating workflow for installation process +* ### Creating workflow for installation process The initial idea was to create a separate workflow for the installation process. This installation workflow would be reused for every test and other workflows. I worked on this and resolved the above issue by including '--legacy-peer-deps' at the end of the 'npm install' command. ```shell @@ -73,12 +73,12 @@ jobs: - name: Generate static files run: python backend/manage.py collectstatic ``` -* #### Research and modifying the workflow +* ### Research and modifying the workflow I reviewed some open source projects such as RocketChat and Volto by the Plone Foundation to understand the CI pipeline workflow. I realized that creating a separate workflow for installation is uncommon and not a best practice. Instead, I created a setup job and stored the results in artifacts for use in different tests (jobs). Initially, I encountered a "MODULE NOT FOUND" frontend error because I stored node modules in artifacts. Storing node modules in artifacts is not ideal since artifacts are typically used for build files. Stack Overflow and GitHub Actions documentation [3] suggested using Action Cache instead. After switching to Action Cache, the issue was resolved, and I proceeded to the next step of basic frontend testing. -* #### CI Workflow with basic frontend test +* ### CI Workflow with basic frontend test For basic frontend testing, I researched Jest and React testing frameworks commonly used for unit tests on the React side. I used prebuilt React tests and initially printed the rendered HTML in the terminal. Based on this, I identified the menubar elements and added a basic test to find and verify that the "File" text is present in the rendered App. CI Workflow tested in forked repo: diff --git a/docs/_posts/2024-06-10-code-w2.md b/docs/_posts/2024-06-10-code-w2.md index 75378a7..997529e 100644 --- a/docs/_posts/2024-06-10-code-w2.md +++ b/docs/_posts/2024-06-10-code-w2.md @@ -17,23 +17,23 @@ Welcome to the second week of Coding Week progress. In the Monday meeting, we di ## Accomplishment and Challenges -* #### Learning tools for Automation - Selenium +* ### Learning tools for Automation - Selenium To create a global test, I needed a tool that could automatically click respective options in the VisualCircuit application. I explored several technologies such as Puppeteer, Playwright, and Selenium. I chose Selenium as it is widely used for automation. I learned how Selenium works and how to use it. -* #### Integreation of Selenium with Github Action +* ### Integreation of Selenium with Github Action From my research, I observed that there are two ways to use Selenium with GitHub Actions: one involves the standard installation of Chrome and ChromeDriver, and the other uses the selenium/standalone-chrome Docker image. I chose the second method as it includes the latest Chrome and ChromeDriver, eliminating the need for a separate ChromeDriver. Additionally, it contains all the functionalities of the Chrome browser. Initially, the browser was not displaying correctly on the Selenium Grid, only showing the logo. To view the live action of the process, I opted for noVNC. -* #### Automating clicking File and Open buttons in the Menubar +* ### Automating clicking File and Open buttons in the Menubar After successfully running selenium/standalone-chrome on my local machine, I automated the process of clicking the menubar buttons. I needed the XPATH to locate and perform the respective actions. I found the XPATH for the File and Open buttons from the Developer Console. Below is a GIF showing the automation process of opening the browser, launching VC, and clicking the respective buttons. Automating clicking File and Open buttons in the Menubar: ![](../assets/images/five.gif) -* #### Research about Block Composition +* ### Research about Block Composition The first step was to understand the issue created by David Tapiador. I researched the data flow of opening prebuilt VC projects, adding as a block, and the build options. When the project is built, the dependency section includes package and design key-value pairs. The dependencies were not included, which may be the reason for this nested issue. -* #### Adding interdependencies +* ### Adding interdependencies For nested blocks, I modified the Dependency interface to include the interdependencies element. I also modified the package-model and converter for dependencies. Successfully, interdependencies appeared inside dependencies, but they were blank. This blank state is a great checkpoint as modifying internal structures introduced many errors. I am happy with the progress of this blank interdependencies issue. diff --git a/docs/_posts/2024-06-10-code-w3.md b/docs/_posts/2024-06-17-code-w3.md similarity index 93% rename from docs/_posts/2024-06-10-code-w3.md rename to docs/_posts/2024-06-17-code-w3.md index 111ebee..e8b4fe7 100644 --- a/docs/_posts/2024-06-10-code-w3.md +++ b/docs/_posts/2024-06-17-code-w3.md @@ -17,20 +17,20 @@ On the 10th of June, during Monday's meeting, Dr. JoseMaria explained the Global ## Accomplishment and Challenges -* #### Understanding the VC Block Composition +* ### Understanding the VC Block Composition I went through some frontend files such as `menu/index.tsx`, `project-info-dialog.tsx`, and `editor.ts`. These files are responsible for editing the project information on the frontend side. Initially, I thought of adding Global Input Output functionality within the existing project editing interface. However, as I began implementing it, I realized that it was more difficult than anticipated since it required changing the Project Info interface in every file. Therefore, I decided to build a new dialog box that can be opened from the "Save Block" option in the menu bar. -* #### Implementation of Global Input Output on frontend +* ### Implementation of Global Input Output on frontend For choosing the Global Input Output, all inputs and outputs can be shown, and from there, the Global Input Output can be assigned. I created a new script for the dialog box and modified `editor.ts` and `menu/index.tsx`. Currently, all inputs and outputs are displayed. Next week, I will work on assigning the inputs and outputs as Global for the block. Checkbox for global input output - dialog box: ![](../assets/images/five.png) -* #### Solving the nested block with different approach +* ### Solving the nested block with different approach In this approach, I didn't use `node.dependencies` but instead created blocks and wires for internal dependencies. This solution was suggested by ChatGPT, so I tried it. It involved creating internal wires for dependencies and making the linkages. I spent around two days on this, but it didn't yield the desired results. Additionally, it was suggesting editing many internal components, so I dropped this idea and returned to my nested block solution. -* #### Solving the nested block with last week approach +* ### Solving the nested block with last week approach In the previous week, I encountered blank dependencies. I noticed that the interface dependencies contained a single dependency, so I modified it to include an array and used recursive calls to add internal dependencies. Additionally, `factory.tsx` had not been changed, so I modified that as well. However, the issue of blank dependencies still persists. I need to consult the mentors regarding this issue, as I feel it can be resolved with some more effort. ## Previous PR Updates diff --git a/docs/_posts/2024-06-10-code-w4.md b/docs/_posts/2024-06-24-code-w4.md similarity index 92% rename from docs/_posts/2024-06-10-code-w4.md rename to docs/_posts/2024-06-24-code-w4.md index bb5be3d..0fe3628 100644 --- a/docs/_posts/2024-06-10-code-w4.md +++ b/docs/_posts/2024-06-24-code-w4.md @@ -16,26 +16,26 @@ In the fourth week's Monday meeting, I showed a working demo and discussed the p ## Accomplishment and Challenges -* #### Pasting .vc3 file and opening the file in VC +* ### Pasting .vc3 file and opening the file in VC I first tried putting the circuit file in the Selenium Docker container through a Python script, but it wasn't a great solution, so I decided to put the circuit file through YAML using Docker commands. After solving this, I needed to open the file from a particular directory in the file manager dialog box. For this, OS-level control was needed, so I used the pyautogui library for opening the file in Visual Circuit. -* #### Building and solving inseure download issue +* ### Building and solving inseure download issue There were many errors when building the project as the backend was running on localhost on the local machine and had to be accessed from the Docker container, resulting in fetch errors. These were resolved after modifying setting.py and .env. After that, the browser wasn't allowing downloads as Chrome considered the HTTP frontend insecure. After some Googling and searching on StackOverflow, I found a solution. Finally, the whole process was completed automatically by Selenium. The complete process is shown in the GIF below. Selenium based first automated global test: ![](../assets/images/six.gif) -* #### Improving fetch Global Input and Output function +* ### Improving fetch Global Input and Output function In the previous week, I was able to fetch the port data from all blocks, but it was using more iterations and not proper internal functions for fetching the data. So I improved the global input/output function and also added the submit and checklist handlers to pass data to other scripts. -* #### Creating input output blocks automatically from checkbox data +* ### Creating input output blocks automatically from checkbox data Depending on the port chosen by the user, the particular global input/output block is generated automatically. It checks the port type, and according to that, the input or output block is generated with the same name. Initially, the global input/output block position is the same as the initial position, and the links are null. -* #### Modification of Links and creating respective input output block +* ### Modification of Links and creating respective input output block I researched the internal structure of the model and tried to access the links and respective link IDs of each block. After this, I wrote down all possible cases for creating a circuit by the user. One case is where the global input/output has zero links, so one link has to be created, and the source and target assigned. Another case is that there is already a link connected with the block, so according to the port type, the particular source or target has to be removed and a new one assigned. Apart from that, there are other cases that need to be tested in the future, such as if there are two links at the same port, which one to choose. I want to ask the mentors about these cases. -* #### Saving and retriving old blocks function +* ### Saving and retriving old blocks function Before generating the .vc3 composed block file, the old model has to be saved so the user can continue working on the circuit without worrying about the blocks global input/output. The model and project info are saved in the stack, and whenever the build is completed, the old model is loaded. There were constant errors, such as storing the data in the stack but it was changing with changes, as I was storing this.activModel directly in the stack, causing changes in the stack. For that, I tried several methods using deepCopy, custom functions, and cloneDeep. Both deepCopy and custom functions didn't work, so I used the cloneDeep library, which worked without any errors. Similar to the "Save as" functionality, I used that part of the code for generating .vc3 file. diff --git a/docs/_posts/2024-06-10-code-w5.md b/docs/_posts/2024-07-01-code-w5.md similarity index 93% rename from docs/_posts/2024-06-10-code-w5.md rename to docs/_posts/2024-07-01-code-w5.md index 9849aa1..bf37bdf 100644 --- a/docs/_posts/2024-06-10-code-w5.md +++ b/docs/_posts/2024-07-01-code-w5.md @@ -17,10 +17,10 @@ On Monday's meeting, we discussed possible cases for a composed block. Last week ## Accomplishment and Challenges -* #### Solving the global block input links issue and extending block composition for every block +* ### Solving the global block input links issue and extending block composition for every block As discussed above, we should not have more than one link at the input port, and we need to hide input ports with internal wiring from the block composition dialog box. I modified the globalInputOutput function to segregate ports based on links and port types. In last week's code, only code blocks were supported, so I made changes to support every block. I also observed an issue with the text being fetched from the package, which was taking a 40-character name. I modified it to take the name port from the labels of the blocks. -* #### Solving the global block output links issue and refining existing code +* ### Solving the global block output links issue and refining existing code For blocks with multiple wiring at the output side, a new link needs to be added with the respective global input/output attached. Unlike the global input block issue, this requires the parent global output block ID and the respective link ID so that the existing link is not modified. These changes were extensive and altered last week's code, so I refined the overall code. After refinement, the entire global input/output block was tested with all cases and is working as expected. diff --git a/docs/_posts/2024-06-10-code-w6-7.md b/docs/_posts/2024-07-15-code-w6-7.md similarity index 100% rename from docs/_posts/2024-06-10-code-w6-7.md rename to docs/_posts/2024-07-15-code-w6-7.md diff --git a/docs/_posts/2024-06-10-code-w8.md b/docs/_posts/2024-07-22-code-w8.md similarity index 95% rename from docs/_posts/2024-06-10-code-w8.md rename to docs/_posts/2024-07-22-code-w8.md index 1769704..170c53c 100644 --- a/docs/_posts/2024-06-10-code-w8.md +++ b/docs/_posts/2024-07-22-code-w8.md @@ -27,13 +27,13 @@ Modules directory with all nested python files: ## Accomplishment and Challenges -* #### Analyzing the Week 3 Code for the Nested Issue +* ### Analyzing the Week 3 Code for the Nested Issue Dr. Jose Maria suggested in the meeting to revisit the basics and look for solutions in the internal architecture. Therefore, I recreated the issue from week 3. I wrote two codes: one where a new node is created according to dependencies and new wiring was made. However, this approach was not sustainable due to the potential complexity from multiple dependencies. I dropped that idea. The second approach was recursion-based on frontend side, aimed at getting all dependencies, but it resulted in blank dependencies. After analyzing this solution, I changed the recursion solution from the package level. -* #### Blank dependicies issue +* ### Blank dependicies issue Upon deeper analyzing into PackageBlockModel and factory.tsx, I observed that I had created nested dependencies that were not present in the interface of PackageBlockModel. I modified the dependency array for every script and added internal dependencies to the respective interface and methods. The solution was close to being resolve, but I took a different approach in week 3. -* #### Python script in modules directory issue +* ### Python script in modules directory issue Initially, the circuit was not building, but the Save as function was working. Due to nested dependencies, the synthesis file could not be processed. I added a recursive solution to get the nested dependencies from the frontend, which was very challenging. The files were being created but not at all levels. After debugging, I found that the issue was the missing internal dependencies at each level and the improper assignment of keys. The above images attached show the progress made this week. ## PR Created diff --git a/docs/_posts/2024-06-10-code-w9.md b/docs/_posts/2024-07-29-code-w9.md similarity index 95% rename from docs/_posts/2024-06-10-code-w9.md rename to docs/_posts/2024-07-29-code-w9.md index 83dfe34..bb54afe 100644 --- a/docs/_posts/2024-06-10-code-w9.md +++ b/docs/_posts/2024-07-29-code-w9.md @@ -54,17 +54,17 @@ Output including printing at every level and code block: ## Accomplishment and Challenges -* #### Modifying the Current Version to Support Multi Code Block Dependency +* ### Modifying the Current Version to Support Multi Code Block Dependency When I completed writing the entire logic, I found that multiple codes were not supported, and extra wires were created that couldn't connect. Additionally, other code blocks of inter-dependency were not included in data.json, leading to improper linkage. I modified synthesize_modules and changed the logic for adding internal blocks, so they were not treated as whole dependencies. This way, the blocks were added at one level. -* #### Understanding Backend Processing by Creating Sample Tests +* ### Understanding Backend Processing by Creating Sample Tests To understand the process, I created a sample test and added blocks and wires in data.json. This helped me see how the internal file structure of the zip file works after building. I drew the whole connection and tried to replicate it by modifying synthesis.py using recursive and iterative techniques until level 1 was achieved. -* #### Fixing the Issue of Missing Nested Blocks After Backend Processing +* ### Fixing the Issue of Missing Nested Blocks After Backend Processing I created the process_dependency function, which is called inside synthesize_modules. This function iterates over all blocks of a dependency and creates module Python scripts depending on the block type. Only code block type modules and block values are included in data.json. If there is a dependency inside a dependency, process_dependency is called recursively until no nested dependencies are left. This method ensures that only code blocks are included in the modules directory, while other blocks such as global input/output, dependencies, and constants are filtered out. -* #### Writing code for filtering and mapping the wires in backend +* ### Writing code for filtering and mapping the wires in backend After obtaining the proper blocks in data.json, I focused on the wires. In the current version, level 1 blocks were being added to data.json, so I modified process_dependency to include every wire. There were wires for packages and global input/output, which required proper filtering and the creation of new links between the required blocks. I iterated over all wires selected from process_dependency and segregated them based on the wire's source and target block ID. After that, in another iteration, I checked each wire with the filtered blocks in data.json to determine if the block was present, adding the key pair of ob:absent. Then, I created process_wire, where all wire mappings were handled. This function contains nested iterations: 1. The first internal iteration iterates over all valid wires, checks for global input and output, and either saves the wire in a dictionary or removes the entire source-target link based on the presence of the absent value. diff --git a/docs/_posts/2024-07-05-code-w10.md b/docs/_posts/2024-08-05-code-w10.md similarity index 96% rename from docs/_posts/2024-07-05-code-w10.md rename to docs/_posts/2024-08-05-code-w10.md index 9bc0e0b..2f4cb50 100644 --- a/docs/_posts/2024-07-05-code-w10.md +++ b/docs/_posts/2024-08-05-code-w10.md @@ -49,16 +49,16 @@ Single port - Multiple IN and Multiple OUT issue: ## Accomplishment and Challenges -* #### Replicating David's FSM Circuit +* ### Replicating David's FSM Circuit The nested issue was opened by David around a year ago when he faced this problem while creating the FSM circuit with VC. My first goal was to recreate the nested FSM circuit. You may wonder why recreate it? The circuit was made with an earlier version, and the internal blocks will not have interdependency if I build with the older .vc3. So, I had to recreate every block and circuit. There was an issue when I ran the parameters; they were missing, so I checked with data.json and found missing parameters. -* #### Parameter Issue in Nested Code +* ### Parameter Issue in Nested Code The earlier code was developed for one code block dependency, similar to nested blocks. The parameter IDs depended on the "type ID" of the dependency, but if multiple blocks are inside the dependency, this method will have the same type ID, and the parameters cannot map to the correct block. This type_ID needed to be changed in nested code. All blocks in data.json are at a single level, so the types are basic blocks. Initially, I thought to create a random alphanumeric string of 30 characters as the parameter ID. After implementing it, many issues were found, such as if parameters are used in input and output, leading to more confusion in wire mapping. Then, I implemented a new ID not dependent on type_ID, and particular wires will map with blocks, so the issue of mapping extra wires also won't occur. -* #### Single level FSM Circuit +* ### Single level FSM Circuit After solving the parameters issue, I proceeded with the single-level FSM circuit. The blocks such as laser_ROS2, motor_ROS2, and screen used by David were not from the block library. Initially, it didn't work, and finding the issue took more time. After analyzing the internal code of the above blocks, they were customized. After modifying and recreating, the whole logic ran without any issue. I ran turtlebot3 in an empty world inside my local machine and ran the FSM logic with VC. -* #### Issue in multi level FSM Circuit (Major issue) +* ### Issue in multi level FSM Circuit (Major issue) After running the single level, I was confident it would run with nested, but as the saying goes, things don't always go as planned. David used single port multiple OUT to different blocks and took input outside of the composed block from multiple blocks. However, I wrote for single IN - OUT, so it could not map the multiple blocks; it was taking one block and connecting to another block. This is a big issue as it requires looking again at the mapping of wires and adding conditions for such situations. diff --git a/docs/_posts/2024-07-05-code-w11-12.md b/docs/_posts/2024-08-20-code-w11-12.md similarity index 100% rename from docs/_posts/2024-07-05-code-w11-12.md rename to docs/_posts/2024-08-20-code-w11-12.md diff --git a/docs/_posts/2024-08-25-code-w13.md b/docs/_posts/2024-08-25-code-w13.md new file mode 100644 index 0000000..97dcd5e --- /dev/null +++ b/docs/_posts/2024-08-25-code-w13.md @@ -0,0 +1,54 @@ +--- +title: "Coding Period Week 13: Aug 21 ~ Aug 26" +categories: + - Blog +permalink: /coding-week13/ +toc_label: Table of Content +toc: true +sidebar: + nav: "docs" +--- + +This is the final evaluation week, where ongoing and new errors were resolved, a demo video was created, and the summary report for the final evaluation of GSoC was written. New blocks, such as a generic PID and person detector, were also developed and tested by creating demo circuits. Although there are some loose ends left that I plan to address after GSoC, everything in the current version works perfectly. The remaining loose ends are additional features that need to be added. + + + +## Goals +- [x] Develop generic PID and person detector blocks +- [x] Test new blocks by creating demo circuits +- [x] Refine the code and add comments +- [ ] Resolve the issue with multiple instances of prebuilt package blocks +- [x] Create and edit demo video for final evaluation +- [x] Complete summary report and publish the video on youtube + + + + +## Accomplishment and Challenges + +* ### Generic PID and person detector block + Now it's time to add some blocks. First on the list is the Generic PID. A question that might arise is why we need this if there is already a PID block. Like you, I asked this question to my mentors, and they explained that the current PID block is designed for a particular use case where the PID is applied to angular velocity, while linear velocity remains constant. This PID block cannot be used for every case, which is why a generic PID block is needed that takes the error and provides a resulting value for both linear and angular velocity, not just angular. The generic PID can be used in any application. + + For the person detector block, I took reference from the Object Detector block. According to my mentor, we need a simple block that outputs an image with a selected box, indicating the detected person along with their coordinates, width, and height. Both blocks were tested by creating a demo application. + + Generic PID and person detector block: + ![](../assets/images/thirtyseven.png) + + Inside person detector block: + ![](../assets/images/thirtyeight.png) + + +* ### Multiple Instances Issue with Prebuilt Package Block + This unexpected error occurred in the code for handling multiple instances from the previous week when blocks were added from the prebuilt collection block. Upon verification, it was observed that the code I wrote was correct and should work for every package block since it was running in loadPackage, which is also called in the collection block. Therefore, the issue is not with the code itself, but rather with the debugging process. It was observed that when one collection block is added, the ID changes, but when adding another identical collection block, the ID changes again, altering the previous block ID. This seems to be modifying the entire model, and the reason is still unclear but needs to be investigated further. + +* ### Demo video and summary report + Almost everything was aligned correctly for the demo video, with some loose ends that are extra features and minor unexpected errors that can be resolved in the future. Apart from that, everything is functioning as expected. It was time to create the demo video showcasing the features that will be released in v3.6. In the video, I demonstrated the state before v3.6, the modifications made in v3.6, and how to use the composed and nested block features. After verification from my mentors, I published the video on YouTube and also wrote the summary report required for the final evaluation of GSoC. + + [Composed and Nested Blocks Feature Demo - v3.6](https://www.youtube.com/watch?v=xvceQL8AgQ4) + + +## Final Note +With this, my GSoC work is complete, but I believe this is just the beginning of a new chapter with JdeRobot and open source. I will continue contributing as time allows, alongside my other commitments. + +If you’ve been following from the beginning, thank you for reading up to week 13—I truly appreciate your time. If you started with this blog or any intermediate blog, you can read all the posts from day 0 to the present. A summary blog is also available, which covers the entire GSoC project progress. If you have any questions or comments, feel free to reach out to me through my social media handles provided in the sidebar. Again, thank you for visiting my blog and reading about my GSoC journey. + diff --git a/docs/_posts/2024-07-05-summary.md b/docs/_posts/2024-08-26-summary.md similarity index 98% rename from docs/_posts/2024-07-05-summary.md rename to docs/_posts/2024-08-26-summary.md index 1bf5ed1..5906092 100644 --- a/docs/_posts/2024-07-05-summary.md +++ b/docs/_posts/2024-08-26-summary.md @@ -25,9 +25,10 @@ This blog post will be a quick summary of what I worked on during the GSOC perio - [Toshan Luktuke](https://github.com/toshan-luktuke) -**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/) -**Github Issues**: [Summary](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+) -**Pull Requests:** [Summary](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+) +**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/)
+**About:** [ℹ️ Explore About](https://theroboticsclub.github.io/gsoc2024-Pankaj_Borade/About/)
+**Github Issues**: [View Issues](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+)
+**Pull Requests:** [See Pull Requests](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+)
## Goals diff --git a/docs/_site/feed.xml b/docs/_site/feed.xml index f4ba3e5..33a7db6 100644 --- a/docs/_site/feed.xml +++ b/docs/_site/feed.xml @@ -1,119 +1,4 @@ -Jekyll2024-08-28T11:14:18+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/feed.xmlGSoC 2024 VisualCircuit Block Library - JdeRobotPankaj Keshav BoradeCoding Period Week 10: July 30 ~ Aug 052024-07-05T00:00:00+05:302024-07-05T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w10In the tenth week’s Monday meeting, we discussed progress until the ninth week and outlined the tasks for the upcoming week. The main goal is to perform a robotics application with new nested code. I chose David’s FSM issue for the robotics application. Mentor Dr. José María sent the GitHub link to David’s repository. Several issues arose, and one is still ongoing, which I will discuss in the Challenges section. Through this robotics application, several loose ends were identified, and I resolved them this week. However, one issue remains that I need to address.

- -

Goals

-
    -
  • Solve the Robotics Application with nested and composed version (Found Issues)
  • -
- -

Sub-Goals

-
    -
  • Understand David’s FSM circuit and issue
  • -
  • Replicate David’s VC Circuit with a newer version
  • -
  • Run the FSM on a single level
  • -
  • New issue: Nested parameters not appearing in the build file
  • -
  • Resolve the parameters issue by modifying earlier version code
  • -
  • New issue: Analyze the issue of nested FSM; unable to run single port with multiple IN and OUT.
  • -
  • Update the blog page with about, home, sidebar.
  • -
- -

Images

-

Older version FSM single level circuit: -

- -

Recreated working FSM circuit with nested code: - -

- -

Output of single level: - -

- -

Parameter issue: -

- -

Single port - Multiple IN and Multiple OUT issue: -

- -

Accomplishment and Challenges

- -
    -
  • -

    Replicating David’s FSM Circuit

    -

    The nested issue was opened by David around a year ago when he faced this problem while creating the FSM circuit with VC. My first goal was to recreate the nested FSM circuit. You may wonder why recreate it? The circuit was made with an earlier version, and the internal blocks will not have interdependency if I build with the older .vc3. So, I had to recreate every block and circuit. There was an issue when I ran the parameters; they were missing, so I checked with data.json and found missing parameters.

    -
  • -
  • -

    Parameter Issue in Nested Code

    -

    The earlier code was developed for one code block dependency, similar to nested blocks. The parameter IDs depended on the “type ID” of the dependency, but if multiple blocks are inside the dependency, this method will have the same type ID, and the parameters cannot map to the correct block. This type_ID needed to be changed in nested code. All blocks in data.json are at a single level, so the types are basic blocks. Initially, I thought to create a random alphanumeric string of 30 characters as the parameter ID. After implementing it, many issues were found, such as if parameters are used in input and output, leading to more confusion in wire mapping. Then, I implemented a new ID not dependent on type_ID, and particular wires will map with blocks, so the issue of mapping extra wires also won’t occur.

    -
  • -
  • -

    Single level FSM Circuit

    -

    After solving the parameters issue, I proceeded with the single-level FSM circuit. The blocks such as laser_ROS2, motor_ROS2, and screen used by David were not from the block library. Initially, it didn’t work, and finding the issue took more time. After analyzing the internal code of the above blocks, they were customized. After modifying and recreating, the whole logic ran without any issue. I ran turtlebot3 in an empty world inside my local machine and ran the FSM logic with VC.

    -
  • -
  • -

    Issue in multi level FSM Circuit (Major issue)

    -

    After running the single level, I was confident it would run with nested, but as the saying goes, things don’t always go as planned. David used single port multiple OUT to different blocks and took input outside of the composed block from multiple blocks. However, I wrote for single IN - OUT, so it could not map the multiple blocks; it was taking one block and connecting to another block. This is a big issue as it requires looking again at the mapping of wires and adding conditions for such situations.

    -
  • -
- -

PRs Created

-
    -
  1. Open - https://github.com/JdeRobot/VisualCircuit/pull/325
  2. -
- -

Issues

-
    -
  1. Open - https://github.com/JdeRobot/VisualCircuit/issues/324
  2. -
- - -
    -
  1. Midterm update linkedin post - https://www.linkedin.com/feed/update/urn:li:activity:7226124206420180992/
  2. -
]]>
Pankaj Keshav Borade
Coding Period Week 11 & 12: Aug 06 ~ Aug 202024-07-05T00:00:00+05:302024-07-05T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w11-12In the past two weeks, the main task has been to complete the remaining demo and resolve issues that arose along the way. A major issue was with the FSM circuit, where there were multiple inputs and outputs connected to a single port. This issue has been partially resolved; when the number of inputs and outputs is equal, the wires are mapped correctly, but if they are unequal, the issue persists. Another issue was with IDs remaining the same across multiple instances of the same block. This has been resolved using a queue (detailed in the “Achievements and Challenges” section). Additionally, there was a problem where, after pressing the Back button, the model data remained the same, leading to identical IDs for multiple instances. By the end of week 12, the line follower with the composed block feature was successfully solved.

- -

Goals

-
    -
  • Multiple instances of block issue
  • -
  • Line follower with composed block feature
  • -
  • Partially resolved the single port with multiple input/output issue
  • -
  • Completed Python file for CI workflow build test
  • -
- -

Sub-Goals

-
    -
  • Solved the line follower with a single level
  • -
  • Resolved the single port with multiple input/output issue when the number of inputs and outputs is the same
  • -
  • Resolved the issue of identical IDs across multiple instances of the same block
  • -
  • Resolved the issue of model data remaining the same when the Back button is pressed
  • -
  • Solved the line follower with composed block feature
  • -
  • Completed the Python file for the CI workflow
  • -
- -

Images

-

Composed circuit of line follower: -

- -

Internal perception composed block: -

- -

Global Input Output dialog box: -

- -

Accomplishment and Challenges

- -
    -
  • -

    Identical IDs across multiple instances of the same block

    -

    In the line follower demo, Dr. Jose Maria suggested using two generic PID blocks, which led to the issue of identical IDs across multiple instances. While the line follower worked with a single PID, using two PID instances is more appropriate as it minimizes errors in linear and angular velocities. The issue arose because multiple levels were converted into a single level after backend processing, resulting in identical IDs for both internal blocks, causing incorrect wire and block mapping. To resolve this, I added an extra script in the “Add as Block” function before the jsonModel.design is appended. This script iterates to modify the IDs with random IDs, and not only the block but also the design’s wire and layer block IDs need to be changed, which was achieved in this extra script.

    -
  • -
  • -

    Issue with model data remaining unchanged when the Back button is pressed

    -

    After solving the issue with identical IDs across multiple instances, another issue arose where, upon entering a package, the ID and internal data of the block remained the same as they were at the time of importing. This issue was due to the node layers in the editor, as the model of the editor was appended in the higher-level block stack. The code I wrote to solve the multiple instance issue involved modifying the IDs of the design model. To fix this, I added an extra iteration in the loadPackage function. In the editor, there were two objects—one for links and one for blocks—so both IDs needed to be changed along with the earlier design IDs.

    -
  • -
  • -

    Single port with multiple input/output issue

    -

    This issue occurred when David’s FSM circuit was created using the composed block feature. In David’s circuit, multiple blocks were attached to a single port. My approach was to use a queue operation to map all blocks, but there were many cases where the number of inputs and outputs was not the same, requiring the creation of extra links. The issue with equal numbers of input/output blocks was resolved using the queue approach.

    -
  • -
]]>
Pankaj Keshav Borade
Project Summary2024-07-05T00:00:00+05:302024-07-05T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/summaryProject Overview +Jekyll2024-08-28T17:08:31+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/feed.xmlGSoC 2024 VisualCircuit Block Library - JdeRobotPankaj Keshav BoradeProject Summary2024-08-26T00:00:00+05:302024-08-26T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/summaryProject Overview

This GSoC project focuses on adding a global block composition feature, resolving nested issues, modifying the current version’s single dependency codebase to a multi-level dependency, implementing two or more demo robotics applications, expanding the block library, automating the testing of VisualCircuit and its documentation using GitHub Actions, and releasing the new version with all issue fixes.

The last 16 weeks have been an incredible and exhilarating journey filled with learning, challenges, and accomplishments. It was a great experience to work on such an exciting project, applying my web development skills to the field of Robotics, a domain I’m deeply passionate about, and learning more about both areas along the way. These past few months were exciting and memorable, with late nights, early mornings, and sometimes not sleeping at all. The joy of completing tasks is hard to describe in words (though my weekly blog attempts to capture some of that emotion).

@@ -316,183 +201,286 @@ Firstmeet

Person Detector Block testing: -Firstmeet

]]>
Pankaj Keshav Borade
Coding Period Week 2: June 04 ~ June 102024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w2Welcome to the second week of Coding Week progress. In the Monday meeting, we discussed the minimum tasks required for the midterm evaluation, reviewed the previous tasks, and assigned tasks for the next week. One of the issues in VisualCircuit is that it doesn’t generate internal scripts for nested blocks. This issue prevents the creation of complex robotics applications. To address this, I will be modifying the block composition this week. Additionally, I created a basic frontend test and installation process within GitHub Actions. This week, I will work on the first global test with GitHub Actions.

+Firstmeet

]]>
Pankaj Keshav Borade
Coding Period Week 13: Aug 21 ~ Aug 262024-08-25T00:00:00+05:302024-08-25T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w13This is the final evaluation week, where ongoing and new errors were resolved, a demo video was created, and the summary report for the final evaluation of GSoC was written. New blocks, such as a generic PID and person detector, were also developed and tested by creating demo circuits. Although there are some loose ends left that I plan to address after GSoC, everything in the current version works perfectly. The remaining loose ends are additional features that need to be added.

Goals

    -
  • Create first global test workflow [In Progress]
  • -
  • Solve the issue of nested block [In Progress]
  • +
  • Develop generic PID and person detector blocks
  • +
  • Test new blocks by creating demo circuits
  • +
  • Refine the code and add comments
  • +
  • Resolve the issue with multiple instances of prebuilt package blocks
  • +
  • Create and edit demo video for final evaluation
  • +
  • Complete summary report and publish the video on youtube

Accomplishment and Challenges

  • -

    Learning tools for Automation - Selenium

    -

    To create a global test, I needed a tool that could automatically click respective options in the VisualCircuit application. I explored several technologies such as Puppeteer, Playwright, and Selenium. I chose Selenium as it is widely used for automation. I learned how Selenium works and how to use it.

    -
  • -
  • -

    Integreation of Selenium with Github Action

    -

    From my research, I observed that there are two ways to use Selenium with GitHub Actions: one involves the standard installation of Chrome and ChromeDriver, and the other uses the selenium/standalone-chrome Docker image. I chose the second method as it includes the latest Chrome and ChromeDriver, eliminating the need for a separate ChromeDriver. Additionally, it contains all the functionalities of the Chrome browser. Initially, the browser was not displaying correctly on the Selenium Grid, only showing the logo. To view the live action of the process, I opted for noVNC.

    -
  • -
  • -

    Automating clicking File and Open buttons in the Menubar

    -

    After successfully running selenium/standalone-chrome on my local machine, I automated the process of clicking the menubar buttons. I needed the XPATH to locate and perform the respective actions. I found the XPATH for the File and Open buttons from the Developer Console. Below is a GIF showing the automation process of opening the browser, launching VC, and clicking the respective buttons.

    -
  • -
+

Generic PID and person detector block

+

Now it’s time to add some blocks. First on the list is the Generic PID. A question that might arise is why we need this if there is already a PID block. Like you, I asked this question to my mentors, and they explained that the current PID block is designed for a particular use case where the PID is applied to angular velocity, while linear velocity remains constant. This PID block cannot be used for every case, which is why a generic PID block is needed that takes the error and provides a resulting value for both linear and angular velocity, not just angular. The generic PID can be used in any application.

-

Automating clicking File and Open buttons in the Menubar:

+

For the person detector block, I took reference from the Object Detector block. According to my mentor, we need a simple block that outputs an image with a selected box, indicating the detected person along with their coordinates, width, and height. Both blocks were tested by creating a demo application.

-

+

Generic PID and person detector block: +

-
    +

    Inside person detector block: +

    +
  • -

    Research about Block Composition

    -

    The first step was to understand the issue created by David Tapiador. I researched the data flow of opening prebuilt VC projects, adding as a block, and the build options. When the project is built, the dependency section includes package and design key-value pairs. The dependencies were not included, which may be the reason for this nested issue.

    +

    Multiple Instances Issue with Prebuilt Package Block

    +

    This unexpected error occurred in the code for handling multiple instances from the previous week when blocks were added from the prebuilt collection block. Upon verification, it was observed that the code I wrote was correct and should work for every package block since it was running in loadPackage, which is also called in the collection block. Therefore, the issue is not with the code itself, but rather with the debugging process. It was observed that when one collection block is added, the ID changes, but when adding another identical collection block, the ID changes again, altering the previous block ID. This seems to be modifying the entire model, and the reason is still unclear but needs to be investigated further.

  • -

    Adding interdependencies

    -

    For nested blocks, I modified the Dependency interface to include the interdependencies element. I also modified the package-model and converter for dependencies. Successfully, interdependencies appeared inside dependencies, but they were blank. This blank state is a great checkpoint as modifying internal structures introduced many errors. I am happy with the progress of this blank interdependencies issue.

    +

    Demo video and summary report

    +

    Almost everything was aligned correctly for the demo video, with some loose ends that are extra features and minor unexpected errors that can be resolved in the future. Apart from that, everything is functioning as expected. It was time to create the demo video showcasing the features that will be released in v3.6. In the video, I demonstrated the state before v3.6, the modifications made in v3.6, and how to use the composed and nested block features. After verification from my mentors, I published the video on YouTube and also wrote the summary report required for the final evaluation of GSoC.

    + +

    Composed and Nested Blocks Feature Demo - v3.6

    +
-

Integreation of interdependencies inside dependencies:

+

Final Note

+

With this, my GSoC work is complete, but I believe this is just the beginning of a new chapter with JdeRobot and open source. I will continue contributing as time allows, alongside my other commitments.

-

-

+

If you’ve been following from the beginning, thank you for reading up to week 13—I truly appreciate your time. If you started with this blog or any intermediate blog, you can read all the posts from day 0 to the present. A summary blog is also available, which covers the entire GSoC project progress. If you have any questions or comments, feel free to reach out to me through my social media handles provided in the sidebar. Again, thank you for visiting my blog and reading about my GSoC journey.

]]>
Pankaj Keshav Borade
Coding Period Week 11 & 12: Aug 06 ~ Aug 202024-08-20T00:00:00+05:302024-08-20T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w11-12In the past two weeks, the main task has been to complete the remaining demo and resolve issues that arose along the way. A major issue was with the FSM circuit, where there were multiple inputs and outputs connected to a single port. This issue has been partially resolved; when the number of inputs and outputs is equal, the wires are mapped correctly, but if they are unequal, the issue persists. Another issue was with IDs remaining the same across multiple instances of the same block. This has been resolved using a queue (detailed in the “Achievements and Challenges” section). Additionally, there was a problem where, after pressing the Back button, the model data remained the same, leading to identical IDs for multiple instances. By the end of week 12, the line follower with the composed block feature was successfully solved.

-

Commits

-
    -
  1. https://github.com/JdeRobot/VisualCircuit/commit/7ccbea013a311fe1d0af6e71408b84b3b7594f15
  2. -
  3. https://github.com/JdeRobot/VisualCircuit/commit/8ea1c0d35e1ee11f282a7407635ff899c538f34f
  4. -
- -

Previous PR Updates

-
    -
  1. Merged - https://github.com/JdeRobot/VisualCircuit/pull/309
  2. -
]]>
Pankaj Keshav Borade
Coding Period Week 3: June 11 ~ June 172024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w3On the 10th of June, during Monday’s meeting, Dr. JoseMaria explained the Global Input Output issue. Whenever the user creates a Robotics Application circuit, if it needs to generate a block, the user needs to modify the circuit, which is very time-consuming. Therefore, we need to implement the functionality for generating both the block and the circuit without modifying the circuit. This functionality will improve user performance on VC. Additionally, the tasks from the previous week were only partially completed, so they have been reassigned for this week.

Goals

    -
  • Modification of VC block compostion for Global Input Output [In Progress]
  • -
  • Create first global test workflow [In Progress]
  • -
  • Solve the issue of nested block [In Progress]
  • +
  • Multiple instances of block issue
  • +
  • Line follower with composed block feature
  • +
  • Partially resolved the single port with multiple input/output issue
  • +
  • Completed Python file for CI workflow build test
  • +
+ +

Sub-Goals

+
    +
  • Solved the line follower with a single level
  • +
  • Resolved the single port with multiple input/output issue when the number of inputs and outputs is the same
  • +
  • Resolved the issue of identical IDs across multiple instances of the same block
  • +
  • Resolved the issue of model data remaining the same when the Back button is pressed
  • +
  • Solved the line follower with composed block feature
  • +
  • Completed the Python file for the CI workflow
+

Images

+

Composed circuit of line follower: +

+ +

Internal perception composed block: +

+ +

Global Input Output dialog box: +

+

Accomplishment and Challenges

  • -

    Understanding the VC Block Composition

    -

    I went through some frontend files such as menu/index.tsx, project-info-dialog.tsx, and editor.ts. These files are responsible for editing the project information on the frontend side. Initially, I thought of adding Global Input Output functionality within the existing project editing interface. However, as I began implementing it, I realized that it was more difficult than anticipated since it required changing the Project Info interface in every file. Therefore, I decided to build a new dialog box that can be opened from the “Save Block” option in the menu bar.

    +

    Identical IDs across multiple instances of the same block

    +

    In the line follower demo, Dr. Jose Maria suggested using two generic PID blocks, which led to the issue of identical IDs across multiple instances. While the line follower worked with a single PID, using two PID instances is more appropriate as it minimizes errors in linear and angular velocities. The issue arose because multiple levels were converted into a single level after backend processing, resulting in identical IDs for both internal blocks, causing incorrect wire and block mapping. To resolve this, I added an extra script in the “Add as Block” function before the jsonModel.design is appended. This script iterates to modify the IDs with random IDs, and not only the block but also the design’s wire and layer block IDs need to be changed, which was achieved in this extra script.

  • -

    Implementation of Global Input Output on frontend

    -

    For choosing the Global Input Output, all inputs and outputs can be shown, and from there, the Global Input Output can be assigned. I created a new script for the dialog box and modified editor.ts and menu/index.tsx. Currently, all inputs and outputs are displayed. Next week, I will work on assigning the inputs and outputs as Global for the block.

    +

    Issue with model data remaining unchanged when the Back button is pressed

    +

    After solving the issue with identical IDs across multiple instances, another issue arose where, upon entering a package, the ID and internal data of the block remained the same as they were at the time of importing. This issue was due to the node layers in the editor, as the model of the editor was appended in the higher-level block stack. The code I wrote to solve the multiple instance issue involved modifying the IDs of the design model. To fix this, I added an extra iteration in the loadPackage function. In the editor, there were two objects—one for links and one for blocks—so both IDs needed to be changed along with the earlier design IDs.

  • +
  • +

    Single port with multiple input/output issue

    +

    This issue occurred when David’s FSM circuit was created using the composed block feature. In David’s circuit, multiple blocks were attached to a single port. My approach was to use a queue operation to map all blocks, but there were many cases where the number of inputs and outputs was not the same, requiring the creation of extra links. The issue with equal numbers of input/output blocks was resolved using the queue approach.

    +
  • +
]]>
Pankaj Keshav Borade
Coding Period Week 10: July 30 ~ Aug 052024-08-05T00:00:00+05:302024-08-05T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w10In the tenth week’s Monday meeting, we discussed progress until the ninth week and outlined the tasks for the upcoming week. The main goal is to perform a robotics application with new nested code. I chose David’s FSM issue for the robotics application. Mentor Dr. José María sent the GitHub link to David’s repository. Several issues arose, and one is still ongoing, which I will discuss in the Challenges section. Through this robotics application, several loose ends were identified, and I resolved them this week. However, one issue remains that I need to address.

+ +

Goals

+
    +
  • Solve the Robotics Application with nested and composed version (Found Issues)
-

Checkbox for global input output - dialog box:

+

Sub-Goals

+
    +
  • Understand David’s FSM circuit and issue
  • +
  • Replicate David’s VC Circuit with a newer version
  • +
  • Run the FSM on a single level
  • +
  • New issue: Nested parameters not appearing in the build file
  • +
  • Resolve the parameters issue by modifying earlier version code
  • +
  • New issue: Analyze the issue of nested FSM; unable to run single port with multiple IN and OUT.
  • +
  • Update the blog page with about, home, sidebar.
  • +
-

+

Images

+

Older version FSM single level circuit: +

+ +

Recreated working FSM circuit with nested code: + +

+ +

Output of single level: + +

+ +

Parameter issue: +

+ +

Single port - Multiple IN and Multiple OUT issue: +

+ +

Accomplishment and Challenges

  • -

    Solving the nested block with different approach

    -

    In this approach, I didn’t use node.dependencies but instead created blocks and wires for internal dependencies. This solution was suggested by ChatGPT, so I tried it. It involved creating internal wires for dependencies and making the linkages. I spent around two days on this, but it didn’t yield the desired results. Additionally, it was suggesting editing many internal components, so I dropped this idea and returned to my nested block solution.

    +

    Replicating David’s FSM Circuit

    +

    The nested issue was opened by David around a year ago when he faced this problem while creating the FSM circuit with VC. My first goal was to recreate the nested FSM circuit. You may wonder why recreate it? The circuit was made with an earlier version, and the internal blocks will not have interdependency if I build with the older .vc3. So, I had to recreate every block and circuit. There was an issue when I ran the parameters; they were missing, so I checked with data.json and found missing parameters.

  • -

    Solving the nested block with last week approach

    -

    In the previous week, I encountered blank dependencies. I noticed that the interface dependencies contained a single dependency, so I modified it to include an array and used recursive calls to add internal dependencies. Additionally, factory.tsx had not been changed, so I modified that as well. However, the issue of blank dependencies still persists. I need to consult the mentors regarding this issue, as I feel it can be resolved with some more effort.

    +

    Parameter Issue in Nested Code

    +

    The earlier code was developed for one code block dependency, similar to nested blocks. The parameter IDs depended on the “type ID” of the dependency, but if multiple blocks are inside the dependency, this method will have the same type ID, and the parameters cannot map to the correct block. This type_ID needed to be changed in nested code. All blocks in data.json are at a single level, so the types are basic blocks. Initially, I thought to create a random alphanumeric string of 30 characters as the parameter ID. After implementing it, many issues were found, such as if parameters are used in input and output, leading to more confusion in wire mapping. Then, I implemented a new ID not dependent on type_ID, and particular wires will map with blocks, so the issue of mapping extra wires also won’t occur.

    +
  • +
  • +

    Single level FSM Circuit

    +

    After solving the parameters issue, I proceeded with the single-level FSM circuit. The blocks such as laser_ROS2, motor_ROS2, and screen used by David were not from the block library. Initially, it didn’t work, and finding the issue took more time. After analyzing the internal code of the above blocks, they were customized. After modifying and recreating, the whole logic ran without any issue. I ran turtlebot3 in an empty world inside my local machine and ran the FSM logic with VC.

    +
  • +
  • +

    Issue in multi level FSM Circuit (Major issue)

    +

    After running the single level, I was confident it would run with nested, but as the saying goes, things don’t always go as planned. David used single port multiple OUT to different blocks and took input outside of the composed block from multiple blocks. However, I wrote for single IN - OUT, so it could not map the multiple blocks; it was taking one block and connecting to another block. This is a big issue as it requires looking again at the mapping of wires and adding conditions for such situations.

-

Previous PR Updates

+

PRs Created

    -
  1. Merged - https://github.com/JdeRobot/VisualCircuit-resources/pull/12
  2. -
]]>
Pankaj Keshav Borade
Coding Period Week 4: June 18 ~ June 242024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w4In the fourth week’s Monday meeting, I showed a working demo and discussed the previous week’s tasks. The mentors suggested working on block composition for global input/output. The other nested issue is quite complex and needs more time, so this task is postponed to other week.

+
  • Open - https://github.com/JdeRobot/VisualCircuit/pull/325
  • + + +

    Issues

    +
      +
    1. Open - https://github.com/JdeRobot/VisualCircuit/issues/324
    2. +
    + + +
      +
    1. Midterm update linkedin post - https://www.linkedin.com/feed/update/urn:li:activity:7226124206420180992/
    2. +
    ]]>
    Pankaj Keshav Borade
    Coding Period Week 9: July 23 ~ July 292024-07-29T00:00:00+05:302024-07-29T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w9During our Monday meeting, we discussed the progress I made on the nested and composed block issue and outlined what needs to be achieved in the upcoming weeks. Essentially, there were two main goals for this week, but the nested issue had many internal problems. In the current version, dependencies could only have a single code block, and wires and blocks were created for whole dependencies. If there were multiple codes, it would only take one code block and generate the data.json. Therefore, I also needed to fix this and make all links and blocks from multiple levels into a single layer in the backend processing. This is why resolving the nested issue took more time. Additionally, there were many errors that came up during the process, which further delayed progress. However, by the end of the week, the entire nested issue was resolved.

    +

    Goals

      -
    • Complete the first Selenium-based global test
    • -
    • Modification of VC block compostion for Global Input Output
    • +
    • Solve the nested issue completely
    • +
    • Integrate nested code into last week composed block code.
    • +
    + +

    Sub-Goals

    +
      +
    • Understanding backend processing for single-level dependencies.
    • +
    • Creating sample tests to determine necessary wires and blocks for the built zip file.
    • +
    • Fixing the issue of missing nested wires in data.json after backend processing.
    • +
    • Addressing the problem of missing nested internal blocks in data.json.
    • +
    • Modifying the current version’s single code block dependency code to support multi-level dependencies with multiple code blocks.
    • +
    • Writing code for processing wires, including filtering and mapping to required blocks.
    • +
    • Removing unwanted links between global inputs outputs and testing the nested issue code with different examples.
    +

    Images

    +

    Level1 Sample Circuit: +

    + +

    Level2 Inside test_second_block Block (nested level 1): +

    + +

    Level3 Inside test_first_block Block (nested level 2): +

    + +

    Before modification of nested issue - data.json: +

    + +

    After modification of nested issue - data.json: +

    + +

    Python Modules Scripts after processing: +

    + +

    Output including printing at every level and code block: +

    +

    Accomplishment and Challenges

    • -

      Pasting .vc3 file and opening the file in VC

      -

      I first tried putting the circuit file in the Selenium Docker container through a Python script, but it wasn’t a great solution, so I decided to put the circuit file through YAML using Docker commands. After solving this, I needed to open the file from a particular directory in the file manager dialog box. For this, OS-level control was needed, so I used the pyautogui library for opening the file in Visual Circuit.

      -
    • -
    • -

      Building and solving inseure download issue

      -

      There were many errors when building the project as the backend was running on localhost on the local machine and had to be accessed from the Docker container, resulting in fetch errors. These were resolved after modifying setting.py and .env. After that, the browser wasn’t allowing downloads as Chrome considered the HTTP frontend insecure. After some Googling and searching on StackOverflow, I found a solution. Finally, the whole process was completed automatically by Selenium. The complete process is shown in the GIF below. -Selenium based first automated global test:

      +

      Modifying the Current Version to Support Multi Code Block Dependency

    -

    +

    When I completed writing the entire logic, I found that multiple codes were not supported, and extra wires were created that couldn’t connect. Additionally, other code blocks of inter-dependency were not included in data.json, leading to improper linkage. I modified synthesize_modules and changed the logic for adding internal blocks, so they were not treated as whole dependencies. This way, the blocks were added at one level.

    • -

      Improving fetch Global Input and Output function

      -

      In the previous week, I was able to fetch the port data from all blocks, but it was using more iterations and not proper internal functions for fetching the data. So I improved the global input/output function and also added the submit and checklist handlers to pass data to other scripts.

      -
    • -
    • -

      Creating input output blocks automatically from checkbox data

      -

      Depending on the port chosen by the user, the particular global input/output block is generated automatically. It checks the port type, and according to that, the input or output block is generated with the same name. Initially, the global input/output block position is the same as the initial position, and the links are null.

      +

      Understanding Backend Processing by Creating Sample Tests

      +

      To understand the process, I created a sample test and added blocks and wires in data.json. This helped me see how the internal file structure of the zip file works after building. I drew the whole connection and tried to replicate it by modifying synthesis.py using recursive and iterative techniques until level 1 was achieved.

    • - -

      I researched the internal structure of the model and tried to access the links and respective link IDs of each block. After this, I wrote down all possible cases for creating a circuit by the user. One case is where the global input/output has zero links, so one link has to be created, and the source and target assigned. Another case is that there is already a link connected with the block, so according to the port type, the particular source or target has to be removed and a new one assigned. Apart from that, there are other cases that need to be tested in the future, such as if there are two links at the same port, which one to choose. I want to ask the mentors about these cases.

      +

      Fixing the Issue of Missing Nested Blocks After Backend Processing

      +

      I created the process_dependency function, which is called inside synthesize_modules. This function iterates over all blocks of a dependency and creates module Python scripts depending on the block type. Only code block type modules and block values are included in data.json. If there is a dependency inside a dependency, process_dependency is called recursively until no nested dependencies are left. This method ensures that only code blocks are included in the modules directory, while other blocks such as global input/output, dependencies, and constants are filtered out.

    • -

      Saving and retriving old blocks function

      -

      Before generating the .vc3 composed block file, the old model has to be saved so the user can continue working on the circuit without worrying about the blocks global input/output. The model and project info are saved in the stack, and whenever the build is completed, the old model is loaded. There were constant errors, such as storing the data in the stack but it was changing with changes, as I was storing this.activModel directly in the stack, causing changes in the stack. For that, I tried several methods using deepCopy, custom functions, and cloneDeep. Both deepCopy and custom functions didn’t work, so I used the cloneDeep library, which worked without any errors. Similar to the “Save as” functionality, I used that part of the code for generating .vc3 file.

      +

      Writing code for filtering and mapping the wires in backend

      +

      After obtaining the proper blocks in data.json, I focused on the wires. In the current version, level 1 blocks were being added to data.json, so I modified process_dependency to include every wire. There were wires for packages and global input/output, which required proper filtering and the creation of new links between the required blocks. I iterated over all wires selected from process_dependency and segregated them based on the wire’s source and target block ID. After that, in another iteration, I checked each wire with the filtered blocks in data.json to determine if the block was present, adding the key pair of ob:absent. Then, I created process_wire, where all wire mappings were handled. This function contains nested iterations:

    -

    Normal circuit to be converted for block: -

    - -

    Global input ouput port selection : -

    +
      +
    1. The first internal iteration iterates over all valid wires, checks for global input and output, and either saves the wire in a dictionary or removes the entire source-target link based on the presence of the absent value.
    2. +
    3. The second internal iteration checks the wire’s port, replacing package-type wire with the corresponding source-target dictionary generated in the last iteration.
    4. +
    -

    Generated block: -

    +

    This way, new links are created, and the absent value helps the code decide whether to loop again or exit process_wire.

    -

    Internal block structure: -

    +

    PRs Created

    +
      +
    1. Closed and Merged - https://github.com/JdeRobot/VisualCircuit/pull/322
    2. +
    3. Closed and Merged - https://github.com/JdeRobot/VisualCircuit/pull/323
    4. +

    Commits

      -
    1. https://github.com/JdeRobot/VisualCircuit/commit/f9bd5007fa83a4ee2503e1780006a425c1994372
    2. -
    3. https://github.com/JdeRobot/VisualCircuit/commit/51c82737938e5370e1e3047b5ee9d9bdeb117940
    4. -
    5. https://github.com/JdeRobot/VisualCircuit/commit/0d3759b154f110318e6b6b7e29fa61012262238a
    6. -
    ]]>
    Pankaj Keshav Borade
    Coding Period Week 5: June 25 ~ July 012024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w5On Monday’s meeting, we discussed possible cases for a composed block. Last week, I created the composed block functionality in that whenever a link exists in both input and output ports, the original link is removed, and a new link with the input/output block attached is added. However, this could cause a problem if someone mistakenly selects a port with internal wiring, potentially causing the robotics application to malfunction. Therefore, blocks with existing wiring should not be shown in the block selection dialog box. Additionally, an input port cannot have multiple wires, as this would create issues in determining which link to use. However, an output port can have multiple links, allowing data to be shared across both links. These changes need to be made this week, and I also need to refine the messy code. Dr. Jose Maria also discussed creating a demo application this week.

    +
  • https://github.com/JdeRobot/VisualCircuit/commit/a367ffb4f22dd3b2396633ef6e909108777e0376
  • +
  • https://github.com/JdeRobot/VisualCircuit/commit/3afffd77ab40766c36ebbbcb1bb603feb38b70eb
  • +
  • https://github.com/JdeRobot/VisualCircuit/commit/91ae5f1a8b4abe80ce3c2edf128467f6376f4644
  • +]]>
    Pankaj Keshav Borade
    Coding Period Week 8: July 16 ~ July 222024-07-22T00:00:00+05:302024-07-22T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w8In the eighth week’s Monday meeting, we discussed the issues I faced last week and the major issues encountered with the demo application, specifically with the composed block feature. Mentors explained the concept and showed the workflow to address the problem using an encoder and decoder example. The major issue was a nested issue, similar to the hurdles experienced in week 3 regarding nested blocks. This week, I completely focused on the nested issue and achieved significant progress compared to week 3.

    Goals

      -
    • Modify the composed block to follow specific rules
    • -
    • Refine the previous block composition code
    • -
    • Create demo applications with composed blocks
    • +
    • Solve the blank dependencies issue - nested issue
    • +
    • Resolve the issue of nested Python files not appearing in the Modules directories - nested issue
    +

    Images

    +

    Nested dependencies in .vc3/ .json file Level 2: +

    + +

    Nested dependencies in .vc3/ .json file Level 3: +

    + +

    Modules directory with all nested python files: +

    +

    Accomplishment and Challenges

    • - -

      As discussed above, we should not have more than one link at the input port, and we need to hide input ports with internal wiring from the block composition dialog box. I modified the globalInputOutput function to segregate ports based on links and port types. In last week’s code, only code blocks were supported, so I made changes to support every block. I also observed an issue with the text being fetched from the package, which was taking a 40-character name. I modified it to take the name port from the labels of the blocks.

      +

      Analyzing the Week 3 Code for the Nested Issue

      +

      Dr. Jose Maria suggested in the meeting to revisit the basics and look for solutions in the internal architecture. Therefore, I recreated the issue from week 3. I wrote two codes: one where a new node is created according to dependencies and new wiring was made. However, this approach was not sustainable due to the potential complexity from multiple dependencies. I dropped that idea. The second approach was recursion-based on frontend side, aimed at getting all dependencies, but it resulted in blank dependencies. After analyzing this solution, I changed the recursion solution from the package level.

    • - -

      For blocks with multiple wiring at the output side, a new link needs to be added with the respective global input/output attached. Unlike the global input block issue, this requires the parent global output block ID and the respective link ID so that the existing link is not modified. These changes were extensive and altered last week’s code, so I refined the overall code. After refinement, the entire global input/output block was tested with all cases and is working as expected.

      +

      Blank dependicies issue

      +

      Upon deeper analyzing into PackageBlockModel and factory.tsx, I observed that I had created nested dependencies that were not present in the interface of PackageBlockModel. I modified the dependency array for every script and added internal dependencies to the respective interface and methods. The solution was close to being resolve, but I took a different approach in week 3.

      +
    • +
    • +

      Python script in modules directory issue

      +

      Initially, the circuit was not building, but the Save as function was working. Due to nested dependencies, the synthesis file could not be processed. I added a recursive solution to get the nested dependencies from the frontend, which was very challenging. The files were being created but not at all levels. After debugging, I found that the issue was the missing internal dependencies at each level and the improper assignment of keys. The above images attached show the progress made this week.

    -

    Commits

    +

    PR Created

      -
    1. https://github.com/JdeRobot/VisualCircuit/commit/03c0b436eaea6d64c97d34d1dd1728b4de9556e6
    2. -
    ]]>
    Pankaj Keshav Borade
    Coding Period Week 6 & 7: July 02 - July 152024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w6-7All the issues and possible cases of composed blocks were resolved last week. In the Monday meeting on July 1st, I showed a dummy example of an adder using composed blocks, and the mentors discussed the robotics application that needs to be developed using the composed block feature. In the 6th week, I was busy with personal work and unable to complete my tasks on time, so I requested an extension for the 6th week’s work to be done in the 7th week. During the 6th week, I searched for Gazebo worlds and downloaded several open-source ones. My initial plan was to develop the drone gymkhana of RoboticsAcademy using composed blocks. However, it was not available in the newer version of RADI, so I could not obtain the world and models from RoboticsInfrastructure. I decided to go with the Follow Road exercise from RA, as it was already developed but with an earlier version of VC. I also encountered a major issue in composed block that I need to discuss with the mentors.

    +
  • https://github.com/JdeRobot/VisualCircuit/pull/322
  • +]]>
    Pankaj Keshav Borade
    Coding Period Week 6 & 7: July 02 - July 152024-07-15T00:00:00+05:302024-07-15T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w6-7All the issues and possible cases of composed blocks were resolved last week. In the Monday meeting on July 1st, I showed a dummy example of an adder using composed blocks, and the mentors discussed the robotics application that needs to be developed using the composed block feature. In the 6th week, I was busy with personal work and unable to complete my tasks on time, so I requested an extension for the 6th week’s work to be done in the 7th week. During the 6th week, I searched for Gazebo worlds and downloaded several open-source ones. My initial plan was to develop the drone gymkhana of RoboticsAcademy using composed blocks. However, it was not available in the newer version of RADI, so I could not obtain the world and models from RoboticsInfrastructure. I decided to go with the Follow Road exercise from RA, as it was already developed but with an earlier version of VC. I also encountered a major issue in composed block that I need to discuss with the mentors.

    Goals

    • Develop the Robotics Application with composed block
    • @@ -529,125 +517,126 @@ Selenium based first automated global test:

    Blank script and no internal script in the modules directory issue image: -

    ]]>
    Pankaj Keshav Borade
    Coding Period Week 8: July 16 ~ July 222024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w8In the eighth week’s Monday meeting, we discussed the issues I faced last week and the major issues encountered with the demo application, specifically with the composed block feature. Mentors explained the concept and showed the workflow to address the problem using an encoder and decoder example. The major issue was a nested issue, similar to the hurdles experienced in week 3 regarding nested blocks. This week, I completely focused on the nested issue and achieved significant progress compared to week 3.

    +

    ]]>
    Pankaj Keshav Borade
    Coding Period Week 5: June 25 ~ July 012024-07-01T00:00:00+05:302024-07-01T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w5On Monday’s meeting, we discussed possible cases for a composed block. Last week, I created the composed block functionality in that whenever a link exists in both input and output ports, the original link is removed, and a new link with the input/output block attached is added. However, this could cause a problem if someone mistakenly selects a port with internal wiring, potentially causing the robotics application to malfunction. Therefore, blocks with existing wiring should not be shown in the block selection dialog box. Additionally, an input port cannot have multiple wires, as this would create issues in determining which link to use. However, an output port can have multiple links, allowing data to be shared across both links. These changes need to be made this week, and I also need to refine the messy code. Dr. Jose Maria also discussed creating a demo application this week.

    Goals

      -
    • Solve the blank dependencies issue - nested issue
    • -
    • Resolve the issue of nested Python files not appearing in the Modules directories - nested issue
    • +
    • Modify the composed block to follow specific rules
    • +
    • Refine the previous block composition code
    • +
    • Create demo applications with composed blocks
    -

    Images

    -

    Nested dependencies in .vc3/ .json file Level 2: -

    - -

    Nested dependencies in .vc3/ .json file Level 3: -

    - -

    Modules directory with all nested python files: -

    -

    Accomplishment and Challenges

    • -

      Analyzing the Week 3 Code for the Nested Issue

      -

      Dr. Jose Maria suggested in the meeting to revisit the basics and look for solutions in the internal architecture. Therefore, I recreated the issue from week 3. I wrote two codes: one where a new node is created according to dependencies and new wiring was made. However, this approach was not sustainable due to the potential complexity from multiple dependencies. I dropped that idea. The second approach was recursion-based on frontend side, aimed at getting all dependencies, but it resulted in blank dependencies. After analyzing this solution, I changed the recursion solution from the package level.

      -
    • -
    • -

      Blank dependicies issue

      -

      Upon deeper analyzing into PackageBlockModel and factory.tsx, I observed that I had created nested dependencies that were not present in the interface of PackageBlockModel. I modified the dependency array for every script and added internal dependencies to the respective interface and methods. The solution was close to being resolve, but I took a different approach in week 3.

      + +

      As discussed above, we should not have more than one link at the input port, and we need to hide input ports with internal wiring from the block composition dialog box. I modified the globalInputOutput function to segregate ports based on links and port types. In last week’s code, only code blocks were supported, so I made changes to support every block. I also observed an issue with the text being fetched from the package, which was taking a 40-character name. I modified it to take the name port from the labels of the blocks.

    • -

      Python script in modules directory issue

      -

      Initially, the circuit was not building, but the Save as function was working. Due to nested dependencies, the synthesis file could not be processed. I added a recursive solution to get the nested dependencies from the frontend, which was very challenging. The files were being created but not at all levels. After debugging, I found that the issue was the missing internal dependencies at each level and the improper assignment of keys. The above images attached show the progress made this week.

      + +

      For blocks with multiple wiring at the output side, a new link needs to be added with the respective global input/output attached. Unlike the global input block issue, this requires the parent global output block ID and the respective link ID so that the existing link is not modified. These changes were extensive and altered last week’s code, so I refined the overall code. After refinement, the entire global input/output block was tested with all cases and is working as expected.

    -

    PR Created

    +

    Commits

      -
    1. https://github.com/JdeRobot/VisualCircuit/pull/322
    2. -
    ]]>
    Pankaj Keshav Borade
    Coding Period Week 9: July 23 ~ July 292024-06-10T00:00:00+05:302024-06-10T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w9During our Monday meeting, we discussed the progress I made on the nested and composed block issue and outlined what needs to be achieved in the upcoming weeks. Essentially, there were two main goals for this week, but the nested issue had many internal problems. In the current version, dependencies could only have a single code block, and wires and blocks were created for whole dependencies. If there were multiple codes, it would only take one code block and generate the data.json. Therefore, I also needed to fix this and make all links and blocks from multiple levels into a single layer in the backend processing. This is why resolving the nested issue took more time. Additionally, there were many errors that came up during the process, which further delayed progress. However, by the end of the week, the entire nested issue was resolved.

    - +
  • https://github.com/JdeRobot/VisualCircuit/commit/03c0b436eaea6d64c97d34d1dd1728b4de9556e6
  • +]]>
    Pankaj Keshav Borade
    Coding Period Week 4: June 18 ~ June 242024-06-24T00:00:00+05:302024-06-24T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w4In the fourth week’s Monday meeting, I showed a working demo and discussed the previous week’s tasks. The mentors suggested working on block composition for global input/output. The other nested issue is quite complex and needs more time, so this task is postponed to other week.

    Goals

      -
    • Solve the nested issue completely
    • -
    • Integrate nested code into last week composed block code.
    • +
    • Complete the first Selenium-based global test
    • +
    • Modification of VC block compostion for Global Input Output
    -

    Sub-Goals

    -
      -
    • Understanding backend processing for single-level dependencies.
    • -
    • Creating sample tests to determine necessary wires and blocks for the built zip file.
    • -
    • Fixing the issue of missing nested wires in data.json after backend processing.
    • -
    • Addressing the problem of missing nested internal blocks in data.json.
    • -
    • Modifying the current version’s single code block dependency code to support multi-level dependencies with multiple code blocks.
    • -
    • Writing code for processing wires, including filtering and mapping to required blocks.
    • -
    • Removing unwanted links between global inputs outputs and testing the nested issue code with different examples.
    • +

      Accomplishment and Challenges

      + +
        +
      • +

        Pasting .vc3 file and opening the file in VC

        +

        I first tried putting the circuit file in the Selenium Docker container through a Python script, but it wasn’t a great solution, so I decided to put the circuit file through YAML using Docker commands. After solving this, I needed to open the file from a particular directory in the file manager dialog box. For this, OS-level control was needed, so I used the pyautogui library for opening the file in Visual Circuit.

        +
      • +
      • +

        Building and solving inseure download issue

        +

        There were many errors when building the project as the backend was running on localhost on the local machine and had to be accessed from the Docker container, resulting in fetch errors. These were resolved after modifying setting.py and .env. After that, the browser wasn’t allowing downloads as Chrome considered the HTTP frontend insecure. After some Googling and searching on StackOverflow, I found a solution. Finally, the whole process was completed automatically by Selenium. The complete process is shown in the GIF below. +Selenium based first automated global test:

        +
      -

      Images

      -

      Level1 Sample Circuit: -

      +

      -

      Level2 Inside test_second_block Block (nested level 1): -

      +
        +
      • +

        Improving fetch Global Input and Output function

        +

        In the previous week, I was able to fetch the port data from all blocks, but it was using more iterations and not proper internal functions for fetching the data. So I improved the global input/output function and also added the submit and checklist handlers to pass data to other scripts.

        +
      • +
      • +

        Creating input output blocks automatically from checkbox data

        +

        Depending on the port chosen by the user, the particular global input/output block is generated automatically. It checks the port type, and according to that, the input or output block is generated with the same name. Initially, the global input/output block position is the same as the initial position, and the links are null.

        +
      • +
      • + +

        I researched the internal structure of the model and tried to access the links and respective link IDs of each block. After this, I wrote down all possible cases for creating a circuit by the user. One case is where the global input/output has zero links, so one link has to be created, and the source and target assigned. Another case is that there is already a link connected with the block, so according to the port type, the particular source or target has to be removed and a new one assigned. Apart from that, there are other cases that need to be tested in the future, such as if there are two links at the same port, which one to choose. I want to ask the mentors about these cases.

        +
      • +
      • +

        Saving and retriving old blocks function

        +

        Before generating the .vc3 composed block file, the old model has to be saved so the user can continue working on the circuit without worrying about the blocks global input/output. The model and project info are saved in the stack, and whenever the build is completed, the old model is loaded. There were constant errors, such as storing the data in the stack but it was changing with changes, as I was storing this.activModel directly in the stack, causing changes in the stack. For that, I tried several methods using deepCopy, custom functions, and cloneDeep. Both deepCopy and custom functions didn’t work, so I used the cloneDeep library, which worked without any errors. Similar to the “Save as” functionality, I used that part of the code for generating .vc3 file.

        +
      • +
      -

      Level3 Inside test_first_block Block (nested level 2): -

      +

      Normal circuit to be converted for block: +

      -

      Before modification of nested issue - data.json: -

      +

      Global input ouput port selection : +

      -

      After modification of nested issue - data.json: -

      +

      Generated block: +

      -

      Python Modules Scripts after processing: -

      +

      Internal block structure: +

      -

      Output including printing at every level and code block: -

      +

      Commits

      +
        +
      1. https://github.com/JdeRobot/VisualCircuit/commit/f9bd5007fa83a4ee2503e1780006a425c1994372
      2. +
      3. https://github.com/JdeRobot/VisualCircuit/commit/51c82737938e5370e1e3047b5ee9d9bdeb117940
      4. +
      5. https://github.com/JdeRobot/VisualCircuit/commit/0d3759b154f110318e6b6b7e29fa61012262238a
      6. +
      ]]>Pankaj Keshav BoradeCoding Period Week 3: June 11 ~ June 172024-06-17T00:00:00+05:302024-06-17T00:00:00+05:30http://localhost:4000/gsoc2024-Pankaj_Borade/code-w3On the 10th of June, during Monday’s meeting, Dr. JoseMaria explained the Global Input Output issue. Whenever the user creates a Robotics Application circuit, if it needs to generate a block, the user needs to modify the circuit, which is very time-consuming. Therefore, we need to implement the functionality for generating both the block and the circuit without modifying the circuit. This functionality will improve user performance on VC. Additionally, the tasks from the previous week were only partially completed, so they have been reassigned for this week.

      +

      Goals

      +
        +
      • Modification of VC block compostion for Global Input Output [In Progress]
      • +
      • Create first global test workflow [In Progress]
      • +
      • Solve the issue of nested block [In Progress]
      • +

      Accomplishment and Challenges

      • -

        Modifying the Current Version to Support Multi Code Block Dependency

        +

        Understanding the VC Block Composition

        +

        I went through some frontend files such as menu/index.tsx, project-info-dialog.tsx, and editor.ts. These files are responsible for editing the project information on the frontend side. Initially, I thought of adding Global Input Output functionality within the existing project editing interface. However, as I began implementing it, I realized that it was more difficult than anticipated since it required changing the Project Info interface in every file. Therefore, I decided to build a new dialog box that can be opened from the “Save Block” option in the menu bar.

        +
      • +
      • +

        Implementation of Global Input Output on frontend

        +

        For choosing the Global Input Output, all inputs and outputs can be shown, and from there, the Global Input Output can be assigned. I created a new script for the dialog box and modified editor.ts and menu/index.tsx. Currently, all inputs and outputs are displayed. Next week, I will work on assigning the inputs and outputs as Global for the block.

      -

      When I completed writing the entire logic, I found that multiple codes were not supported, and extra wires were created that couldn’t connect. Additionally, other code blocks of inter-dependency were not included in data.json, leading to improper linkage. I modified synthesize_modules and changed the logic for adding internal blocks, so they were not treated as whole dependencies. This way, the blocks were added at one level.

      +

      Checkbox for global input output - dialog box:

      + +

      • -

        Understanding Backend Processing by Creating Sample Tests

        -

        To understand the process, I created a sample test and added blocks and wires in data.json. This helped me see how the internal file structure of the zip file works after building. I drew the whole connection and tried to replicate it by modifying synthesis.py using recursive and iterative techniques until level 1 was achieved.

        -
      • -
      • -

        Fixing the Issue of Missing Nested Blocks After Backend Processing

        -

        I created the process_dependency function, which is called inside synthesize_modules. This function iterates over all blocks of a dependency and creates module Python scripts depending on the block type. Only code block type modules and block values are included in data.json. If there is a dependency inside a dependency, process_dependency is called recursively until no nested dependencies are left. This method ensures that only code blocks are included in the modules directory, while other blocks such as global input/output, dependencies, and constants are filtered out.

        +

        Solving the nested block with different approach

        +

        In this approach, I didn’t use node.dependencies but instead created blocks and wires for internal dependencies. This solution was suggested by ChatGPT, so I tried it. It involved creating internal wires for dependencies and making the linkages. I spent around two days on this, but it didn’t yield the desired results. Additionally, it was suggesting editing many internal components, so I dropped this idea and returned to my nested block solution.

      • -

        Writing code for filtering and mapping the wires in backend

        -

        After obtaining the proper blocks in data.json, I focused on the wires. In the current version, level 1 blocks were being added to data.json, so I modified process_dependency to include every wire. There were wires for packages and global input/output, which required proper filtering and the creation of new links between the required blocks. I iterated over all wires selected from process_dependency and segregated them based on the wire’s source and target block ID. After that, in another iteration, I checked each wire with the filtered blocks in data.json to determine if the block was present, adding the key pair of ob:absent. Then, I created process_wire, where all wire mappings were handled. This function contains nested iterations:

        +

        Solving the nested block with last week approach

        +

        In the previous week, I encountered blank dependencies. I noticed that the interface dependencies contained a single dependency, so I modified it to include an array and used recursive calls to add internal dependencies. Additionally, factory.tsx had not been changed, so I modified that as well. However, the issue of blank dependencies still persists. I need to consult the mentors regarding this issue, as I feel it can be resolved with some more effort.

      +

      Previous PR Updates

        -
      1. The first internal iteration iterates over all valid wires, checks for global input and output, and either saves the wire in a dictionary or removes the entire source-target link based on the presence of the absent value.
      2. -
      3. The second internal iteration checks the wire’s port, replacing package-type wire with the corresponding source-target dictionary generated in the last iteration.
      4. -
      - -

      This way, new links are created, and the absent value helps the code decide whether to loop again or exit process_wire.

      - -

      PRs Created

      -
        -
      1. Closed and Merged - https://github.com/JdeRobot/VisualCircuit/pull/322
      2. -
      3. Closed and Merged - https://github.com/JdeRobot/VisualCircuit/pull/323
      4. -
      - -

      Commits

      -
        -
      1. https://github.com/JdeRobot/VisualCircuit/commit/a367ffb4f22dd3b2396633ef6e909108777e0376
      2. -
      3. https://github.com/JdeRobot/VisualCircuit/commit/3afffd77ab40766c36ebbbcb1bb603feb38b70eb
      4. -
      5. https://github.com/JdeRobot/VisualCircuit/commit/91ae5f1a8b4abe80ce3c2edf128467f6376f4644
      6. -
      ]]>
      Pankaj Keshav Borade
      \ No newline at end of file +
    • Merged - https://github.com/JdeRobot/VisualCircuit-resources/pull/12
    • +]]>Pankaj Keshav Borade \ No newline at end of file diff --git a/docs/_site/index.html b/docs/_site/index.html index 4ca7ca6..1e290ea 100644 --- a/docs/_site/index.html +++ b/docs/_site/index.html @@ -183,9 +183,11 @@

      Mentors

    • Toshan Luktuke
    -

    Official Repository: VisualCircuit
    -Github Issues: Summary
    -Pull Requests: Summary

    +

    Official Repository: VisualCircuit
    +Project Summary: 🔍 Explore Summary
    +About: ℹ️ Explore About
    +Github Issues: View Issues
    +Pull Requests: See Pull Requests

    Recent Posts

    @@ -239,6 +241,45 @@

    +
    +
    + +

    + + Coding Period Week 13: Aug 21 ~ Aug 26 + + +

    + + +

    + + + + + + + + + + + + 3 minute read + + + +

    + + +

    This is the final evaluation week, where ongoing and new errors were resolved, a demo video was created, and the summary report for the final evaluation of G...

    +
    +
    + + + + + +
    diff --git a/docs/assets/images/thirtyeight.png b/docs/assets/images/thirtyeight.png new file mode 100644 index 0000000000000000000000000000000000000000..c0378cd5f1e4ac72628483473a59b590438f2402 GIT binary patch literal 107129 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 z z9Ri2Sut^oIMtuyJ=t`j1ZqcU(o>K>Oeimso#9b`%^G+sYQ8~G|a7m%h5l>G~UtV5* zO-Pu^IR?2g(BrDG-H=)Ed~mmDzA^w(3Sx?i*y7^idnT^iWBG=kgia5a+A%S3vLffa z=I9Fzt;YXQ%qFW_R@CiPhw`dtlI8e2}47aWT5ELF5g$wzeSAU1{@mFBy$IxLHtL z-8B7pJSQUqijtBN#A~2s$nt|>J3$8`@97@^=c~+wz9Zi+W|3+7lH0+X=&g} zvuWSrupuIuQu`Sz{Do>4u&uer49TwRF-xOZUYMBjD*f5mpu~&TDAK9^yz*18y+zt^ zW`SeM7+FG%HcqBggYK~oKPmnX+zvVs025Cx8cNE=HKXI+*XoO)SFXZED6m8Sa6Q?g z0s?N(0k8tX(u|A@uRnjZbEFd6fY!szD^j4qIm%z0Iey>Xw}Tl_HTiI$iuy2sRikOBi^{o^EEM1 zTv_>fd3pJ!9TyTZG9oJKcW@BCdi6?9WBx7sSVJ#3D(isUmrAV_8H?dy$KMRO8AzHL zrll&5~4wh4n zkNX&GA$FwKg<{7=1OiZq%os%Sp;(4w4nKSN7dTRTK{yD>bpa@oRbQXf-!BD`=nFKP z2WrDW=qsMl_1x^#g%{MhKvT#UkV@Bz|5STA?B2g!(u1;F;8HKK68hdMWxr}kHn~eR zHf+Zve}52`e%u61U{`Z^&LdvU!A=ciV-1rR2hP?NiJF=myv>VIDyQdGEWOMvn^EC~ zB5LUVSG_(8QdtYDe%IAVdDfNi;>C+}d%Q11*1J>X3;Ti%AgFjoLNWyOtbr@Z1POdc zhw%BqA_Kd1r}M!-%&|X>mmqt1lhNKz2tN!SKm`!uI4}SphP<_u7CgAQ*uoFaMj}nI z7o?zj2ibM(&ZFV5h91$NV8G-#p}K&b-H-P3b>^1@h7xUC{U1U)N6h|I)NN_0&rB?! zxH_X#9?ZJdo8y5(;d%-~y0!2PEIj=3%F3wzS5S(21XU?_}3# zGtzK8q<_&1Ft0u+D^GlW06JFA0n8z_VWYbRHiEz7y(EY9*rr;o;k4lVQetDe^2`}r(NM&!Tm|h%7XD) zqUj%cCY=6V9{c-%KaPm?7M*{u|BNrr~DD z2XRpzJH681*H^4lssdLVyCp2vEqp@$LQ16};K%yM<8@&^Dnf7glx80-z<@`QIWg7|ou$ z%0@%%ZVQY+zu#5DGQ93_2(sqNShlYMgxb-nXsEW8*F^gxamUt2Js)OmNq&hgw4XIy zSUr}7i%Y}*PZR{uVmJdjg8w5SRMx3;Ip8(e#+VvnS}Dw^-tw{%AK(c;=ig z;%IgwOv5Njt|m8l=R1k5uQsVH61f5z;ylF+teqRec}Yq~=i@bhjxG7_Mm*fi@-;8G z|9Ig#R(Trh^70M2O9R29Ll#V7QEZxr{#$tl$T|Hz%+o|SqCrjXrukUgHfi>GVNp@| z*=lpss=1FBT77S^bnA=e6SH3u`KS^pscG~@Yu)xj{w$2K$db+Ay%AZOS1ccJOfpunS*`e7{ZzQp@mjS>v9ZS$_N@MfXq zUS1{<{k6J7CCmR_!&r03ZkG@T7x&lc)+o4l@uQ0yZ+v1l$jtIrCfg|oRU8y_xn>n) zbXnhOSaxeO+miCW@ZuK@w0GtwNaA=E3Wd(TaJ_Z$|1kCzP+5gd+vo!*D5Z1?CL-P4 zC?ZIQl%&$#k_ytT5)vZaB@NONDj|{rlG5EEb!MyY`<-u{^PhEC`Yb@)?C0M1J#)=9 z*UVU3WeM*5a*F3Prgx&_oLE;_8+4W@jkf!cjjQJ}WNkG+mUZ2-SNkKs?XB(P(Xr7a zfcHnkn^dsG%q9U7+qlVv0j1YUd72ki{W6rbdOxDc^gLwD>c*!Nemyfib zmTR$d5#g?yZMWgy;%<0(l7$|UddG(M3K<^lr<#+`s)LknwStdjIFET^8th1#7#K+< zZ=KIM(l|S`SGVqbzlYnN>(j<=zMlF%Z9-Tvfce&y?Czprx=tbyyn3ipT~dm`vrKF$M#mavCTF0d_G>iK^#qa zro^czSgUNeb>a5l$MBRfyPt9iFvJJCmk~hDN5G>SMU;xU@ognY==Wj|b(g>u$A*(> zSC(*!&W}SPX!=VV;$xnR=keRUP8ubS)>%DDgC-)Lj?gxgxYA9Xj_HFIk zU7N7)^PK|I3L7*UYoRYiUCSmuFjh$QOwh{MI4yAaOwTkMq}CwtX2`rhzsgAD=)1k^ z=4juK5S4&S)4}YL7xwnv59&Yhc4ImFSr(BRyo8^u(qeJ8zrOFBjc;)nAyl!U=A4$L z*ZI)8_Kf6o&7N1`I5H$7dPY@zCQfundb+Zfeqmu>K-J)3{hqyY#qm`{iMntLCbc+| z-DQomBbz?H_D`I8ts4X43b_iX`v+{H0D2fwS&PbLclmpBN;^$T%xf-!h9d_%^2wqGMA^s<7|KY~0D z+I2e{-?}Jkzq$7#Xb($v%mxzd~9VY9SM^-MwHFF$82H2BLejYCv2p7(QiwlglhE#B0RQ;+P8yW{7$g; zP8NLIaaFH=G~uq-GZHd9s*dwfDRLwDJN?_=Q)P>_3OpKEgFY+?wBcgU)qka%Ojp|e znlf{xM*h;786n28(4n)!^~0xX2TPC11^Heo>h+Lfq_Sw;Hg1#paECpq8S{l~Y3rBF zG_%g|khc5l5_V6+JoSzzFFVRp@=(i{+thMFhl$LHTX(V|&#XoQA`);)r&EKL=D*f4 zdM$iA(`!pp^5#=ckwe+uItg2 ze3!S$ZN@n;^>|&^(iCGRj>so|nO}J4NVNacP%URAz3yPRdOQ`*y(nAC`Q;Mp!3p^6j#tQi(sah%pWpHhxe zksER|OBcn|#_f*mx|E5x_D`g{!;4V#0>@No>nE3!Q-}nKFRzN45ipb!-B%a7Yo!!Z z*RAB@DYo!t`N8q8ive5yUkt+wye{Ue=YDvtWcD~PZkzXG8tZ#LJ1W#v>{zf&!PKN+ zrOKn2OJd_|>*OCcG$mMTqK;2Q#eK^~8JhW;*@aAR7!@N+>G>Gk!&psE+sXSn^RA|E`OvEB)PgXz}w}qmR;g|Ov529!Gh#N)2r)+6JZ%|%hfL>bsBYz-~5g(6NHB|9e{D?*nWY} z;8Zshd)b85W%v9ITjf00JNudAAWnC zva=|Hb*>kemc?`D9*yRkPQ7u)*{y)nwkjjp>fO&L#0od4wfjD z*XlwPIGE_IjpEI0@E`1Z`fZm-*gABq3pxD}oD?7Am?-`sDFo#522zKXZ(SV;SlD$d z)3UO0k-X4*?|?vq_i^Ed*(7$3Ps!#KExfBs#M1itA zhwp60ir&ueI#Tm%NDHK_&MKGhl8##o{C2Oc^b(IZ;Lsd8m(_7)O9;<25Q%Q0nVa{^$_tkZGTYOqZ;VOD zH4mdRZ1EZK6!~^szE0@Rkc-PwRn4$4&GOX#r$YWQdlIF}`5-;-_NijmX%9-QC~n+Z zSAlnhEV7L@oj41szM>-5!otD@ zM=)vOh#mV+Kr^2L43&_O(C{DWb*s2qH#?K@4eKT-3z+boZ|sdTXWXRbi*J^svc(C% z=`!Tt=QLoEwcV@>;7o&F6Vs4uPuFxmrQlW*wvD|Ejd+5 z1>bNEsOqy*+3jUt>JV^0pPJo&(E6~I)!4jr)m%rInub@`yFW%LFMHM~x$8>-*0Wy< z-oI88PCtEaR)$%n!%jk94OYMV|9)1@DZ=qap^~;)-&`d92|vlrvh%y0S?JGvhS$5FzE7q(4+fNk4eN?=VI4ggYVo3%|bzANK9KOAzQiu{tE~5l_qc zA}_VNA~l=C^xb+DOP$hK#X0!<7FQ~>QVyjju?jK3@{k`3#r)pu`@1SLJZYKld);DI ztFArL(t^%{E;inn2HH6SwvTH@n?iL?x5jxxuk5*w?n>+d^1$ZbGc%mZI5Y$wQr)~ z?agw9qG_edRQJG`s5ab$|BYI9gFJ-8)ZLvnCEXL@nRYF|dLL3!cDHL^;xLmYhig## zek6)BRP5*xslMp~HyyOKtrfT?vYo779Owz*)>Q z)AZ5#FU0r6K}l7j!It38lRPoV^SswoNOG|-3n3{o9-)6VFQ*KX@@>+Od|z?dGw|VC z#=q>+GpW1*4%cD zZZjU9!(;Bb8iqt+jD!`3J(wk#-=Z_a$6ZhwYou9F3zH&K3(G{_t3HYk7%-ITHO=XK zXt|eMT{shhZv5m4lpS2e$6vF(!jq{&5!EdpF0PwAIC#3^Z^seOoULYZ8mO&lq2Cgv zI{y3F?aKOny!)ltRhFv6VJ%_0g#s*;Jdw$lu4H|vaQNXofO%uUNeW$fEPe%N!#1tk z^h2eRqOPBeQha{W(h$8MN5e<#($?VDQgX`j2Bl}Ycycz@6}tkn(P~>i$8YLtmHO45 z*2Yl!MnNW`ualIGFa zv~@W5NaT{Y+f>kg#SHRVt&X_7nf}%E+z#i^+xtpOkV5^h_XN57*7`0Dj2iZf`a9<5 zW4}EZb6vjmG8ZikEiL4dNFk+aaL^5^%G7sW7~28QQj`)eQrAX~&P$~+A1BE@kgS?s zigGnmt-`DKIZ8gknGq&w3~WkoZ`Tgc$|xIq_o``c_1^JRuq?$S?m{!UAcM5^>7R5+ zpoqda5zZe%#STW328yNiLej8*^s$*b#6x9k^#>7&Qa?89ROd5%QYS_2Da%_m@m0Q7 z#4<}~4;(qFxs0YW?V{FFTD~3bRoXZ}3~e+?|D_L~N0Vqk@HaYFP2aM{?}$W9v1dyn zD5f?onTXXkmxCud9+L58^D6@-<;1He%#1fc3j?R#F_-3f>X+XZG!(ACUw|QcJcqMi)Lv9Xx+&3;F$3#JAa?RG+6-$GWDSt0v4<9iF zVOf@7jHOa3Dj8O$jQq^-2a?TKezUQ=p#*N@VR70g^lR#>1T;Od-lH7ma#vp@=dJihfOp!?lb@!-5C8<7dCM)kU~p1;>*MpubAb%G!5+6tDJ-0i)kRk=kr|9PRzeC*5Ns*38LCR{W>J&4w!~-*dUN zxLDR)Uq+m3G|bN67`0>Q%UyZGM2B&5n;HF{Urr`99DkDAwJwz7`Erb#!Q?H)t*lYC z+uDsXlX05*<*%w2)97Xkj5%AZJ^YS6mu>epZZG&$s~X=@cJqj+d-ywIoozbPn`1hL z_w&TIF!#N;rawLHE?o%^(YxS2QB|+vIsWk(=a7yA9^}-Z<+NkfJEFr|#BUzi4FFDe z{;p`m#vyFXR{b>kW!dF)fmd&PJ{}m1v6*oNaBc%(Ox?qp0>}#GeTmmyjJ1D==(+fd zaXzzt)Dz+uWnGnd#reHouXT9YV~$u88h^heBJVN|e?r2SfB$e@v}fAZSmZPRy*ESs z1Oq*>qWE|wGf}GUVuVXWNs0Unueu&A$_CX!D@ zXvU7$hUCKeK>@rz(^UFM&PY~SfWq%-9205VegEnCwJ*0v@df(1%Nj%_eNHs?`qr(m zt5$_#9;hX~z)8cjWxG-Ipe^f%;q2=IEEqSW@vhcQ0AS%%n#)sX9WFRh$F3XX<6dZT zOFv(|=}x~k^($5_N<~XtEh*~fZFz;&(Ss3MdTZ~tqQwnC9q&!Sf;Yv=cE4m}#y6k# zJ$8EF;c=$sVL72FyHqn&?ecS3E;t^?dE+!q(6!;gF3HMak5%Vk&!QZ2W$c#`GV7;S zc_ugiIG4K<*Z)h=+z=5FIXF6UfHXXfUO;vMF3G+A=-D)S26OD?p(ZBb3aYc=kQ|{! zzQ=3dT3J)+vp8G9R^e(N6Qa1!FH*Z6sRwLjj>st2d%XA-Vy(YHvY(dCr8=K9IqAK& zFzAr`MYy|{Ye=TxtRhi3IfVuLor8)>^6IAZS6Ys=fbaGH{wiKPVcK|`XiJ_GtPYh zYKP^rlD!E%a5q+;!!5Gs-l%VE#WOR-lYdR(oK_+1_<_86I z4IhJ}weh(=qbIR*p!1qA=k>7RS-Pjs#cmwr?jpMv2yN7)hAw;2S#i>vvFiaJ&JLV8 zdF6tP+&cA(o9EIUd2VMq%>3%bpS71|d^VZpq$BKg&YPMrJS&egW1u{-gK^3`VUK$> zg7a}!YOp!{G!f_3$U7~Vh9w%GnONor%C&zaE*#tn0g{qFC)dCzEyqUNkV|_w{!LS8 z6oIA8LyL;e8jL&S4~+}SIbVt@gr^Of8qRM%1e7HTUio7J|D11_yPb00+mis(vBYxV zH~FEEPwxn0V%_iWf$1?mN5Oy#a7CwEoCD{p^^Af3#s?b#0^L##wURQMkp{$QkPN zvwlFG-8G*o#j;?n>M91UklJt=3+?h2CHI0W&NZuRb*nwvS{4J-mL=vz!D-(GmYajo z8GMKpF+T935pEr|B)mb18`HGSpST@f7vkriPneh8xHggK5R(SE64%XEGQ88;oQzk2 zt;2lY*I#iul(?;5OldJI5%{4!lQ;iPY$1n!rB-#nc~dqG%fONLlF)vaE^+MOnbv#B z0Q`R@-8(_9FI50yhDf1w}0`DhHKg zR~E|qMQuZe>_DnrSom?CjBt%7oBYrGt-Jk-IvlY`*OBZnsBdh9*40-X$@_!Bg&2)h z*+~TSrjGS6_W$U6ZBFVrFOs_6Z*>dBt1av3;?x+Z``EzRFjVqUF6#}sKkaGy6E%=| zF@NsTxNqVo32P{2V1BdV@%+O1u{S2zSN^sPEazlG#>2t~g|yk4XQEyg#oPXR>Kc2T zfWk3C0o*?qFmJC4_}kb2&riZjx#qwB7S-hH>e|@fue!kYr(X)({1pT7KP|@peH|D$ z!bFPnJ^r7M>@LIq9mmFy+q>dFUF=9l<6 zpB)#!pNDiTxv1C2aUOYjc|QAJ7yR+4)MrjWh0f=^LOwP&7SH&%o0_>vx&+prmb`cS zM?67!!^X}o-r#k@28sTZmK0KJD7)F%-E9S#S0w1&o0}z4BssF7Fz4E>Tjya=%l)u@ zy^pR0pplLf^%jA#omP_zf8I?t^S?Ke9adaY()3>3cXDL~mxzdnn3VLohzJeH(|nb4 zhy_0Ktb(=&h0@m6esLpZuyJUJ%%nT933|4@#BZGhDcR<*QN&bfkBBeG`bMqKPER!I zJ@^G27oI~uY6>=qzfU0~oiHf9JM7+d0%+iP_qr0Nzv|I2N>NG4U}KX}bbaL1)S|G2 z`wUl@$DunBhn=S}k&5uYpS_CYzugk``AHndQ*2cR5<^2nXgrS&dK+9yt_$Je;e2j8 z+25`a5} zwX8PgSx7_5&t3|xcUBv;8+X5TkTigols4mTy!#!AucsW>$FH=twef*APgxn7p7C0b zJ+H3jAN%>!z|hbKMgYD@vrNj*&)q%dYOaG$# z5jmjIj}K2HWik%-Ms1vepTP9SIBpA4ND)s?PCideq=vJtKi{1+U@U}n?wtNenc2c{ z$qm$1Zf>McJhM6G98{SQ5EG}Lc!A_APQZx)b(No=0;)?)6&n!C1k$;X$jHl3f@AP| zXVKQdK@#+I&CSh@-Qvk2o``tG)!iM8+6>6YU}zl<^mos&QW^3e*L;U_JVE$RB+jEAaLR^FvwL zC#XPR1r^K`NMofRK73hMCrsnHqXh4B2A;?6ngcvKX=&+3@3SMlUvqPynI(du0Fqhq zNifiq(n^quiVCVI@L{0F!D3djqN?gSI5nY=Z>6K76S&s|G+JjOKM~lXz>pAM*kwh! zb(71>qmw@LD6ox)>I!+7Datt;Aa*ny$W?O%Ss=_6MWJBFwnM9K+uu88$52TDGOmE+ zWZD=eO>{6JN$78(E(rSW+JO%JVH_Kpu>0O8khijfdXh<_SWNqJv`hvv%NBfB`8_We z7ng_0B3Hl?9>BP$GEaPRHq_Tx*7j(|N5y7+bg+)d%|K-c9z&p(mR9rk?;i$v{QUet zgje*a0mPZ@AZNWAEmH#HVG~6>5g|0X;)&DfWl4Wr@mQ9}mq|(e!OT0ZjZyIM@CfWT zfI1dd^Aq&-MMFV7;{l9O-vE&n6cAB}oopRK@yN{Q+sU6`Q1^@MZ2Fz$p-V+|d-3Ds zR+g6EsvS%cMZN3gdlo?lO3r6{b!BxmDmr=~vQN1y@|xs`r+C@5A^ng37T!a);C-!4 zk(Y&%w_s%yg(&tA=>Ir7A<HP?>U1O3J^x1dIq$(*lbot)PH~+FAQa#qk!`VyLhc zB>ZJol9G~nC+z&L8~PwM)o<~~8$sqMSbX~)7ph$51BcewX zl%!xd%yssXN~29e8O{Nm5_V8+C!xnnq%>yAB|uNxjZZ`hlW^+!plSd{*TQh~byFNY zadGj5AEmd!yA-Gh$tozc!{*$CVgoZ1iKD|q@f=k{82u_BI*;eM1~aqn+S=L{Si!-C z)^ag!yNt14uf={fu(ZUTY5{FDJlsja4 z-k5{KFkEIv1cRx=0B9&uJ$k%l_Vg*zv1|rz4Vh4inw)I%)u^_=b$onm9$ErQ=Me`b zvUq0*5#`h`uY#p}y(9StYZTz%{2dNp)d-VVZBLJ%32k-UKs?QJtmHr;?^7XA1fLHt z+}+yWZ-*KRr{EOSd*vLM={@>hgpo{=+dUpce`qLh*=6T@U%etkiGd3wprXoSHXJD1 z56MKWEiDDZ?n~mMnt{qTfz5F+q^QY-g>2zWMS4eLKA8;VRr`EcLYRm-61Tm*ouZzX zqROD8s`?T%eyetqO)H)G`Ap}|okN}vOvlQqczyu|+qxN6d1_`RjX98k7+X3+d1rls z7QSu1;~?t!yUe*FT_k?{+bcK_HCic;(`+W{!Ox4Enr82r;G^Ei+=8)p{@}&UM+do+ zJ%8`KP-SRcZ#XOD90a*?X64n~wNrl?qdsQ-%{cJ=>)pzJVY zrXZO9sKmrjm~Dz68vv)Ew>xiWWaNimG{DZy?N?C147I@VWfSj&-3{A9DWD|9zr36q z8Ru31rL}?aQQ;)ae~W{$GBBRnc6(0lQ(N2gke+t|kG3_4d0b)oNeS42^z?M7GsK_o zNiN#{p8i{v`L}tD<|`Sevp3ZI_BZJs#ytlQ*#rn^Uc|`A$m&IbeUx&BvYCmadAP-I zCkF@L=x7p959%4|sH>}wjAG$aHv-r#HXmRBsXTIJ@S=QP$9zz`uym5BqO4rjIym@i zyw2Ti-NDJ}JPOJc&cQ~^arPddXm|RYHw)xUaB-(EpM4d&GjnDuWU;I6eI)__2%BPnY}OxF$v|CKi%#_Gc zO?6oxkK?t`Ew=-kfM;W4g9~QS^JuS?vq#7m_PPU!%NAxUoWyLak!2Dq%9|1^$vmYtt*^eF^xW0V( zvVXX6%c1AXmu66kvgtRXK%=cc+4y1u_C6dsWQy{Tp!dn|T}eQo=2l?oeWCQARQH6Z zvgTtwujTM_Fg9AF{oKhQ6yz4Eukf(IUU7PCt<@*b`MT=P#{N|Vgex6=^7#YFm8ibu zJz}LN4mK|>hqpdCHH8KW(6M???e_~>xBVnu0BESHt%Zmqp5o2#y&`H64?cj8NNHTs zkJ$0?akrz;kPt~79ct&*5kExJ3}%KL_5uP5Mo3_;#6hsc6_#VCaI$K;?+5&Zj%l*1Js?*c0AyuxM*Fnqc-kB^) z3pV85{@Ty-uLMJC2;6{Cy;`F${rt+Sd`zvlzS76W#)|GF!dZ%c`#w5Wp>Xl&3%n=r zRDA#JaqvjEhCew;{FE_U-$eMt=%CpZxOb;(JX#H>kmKz` z6TLPVY!1;^8i4T2L3g{fF017Y0MPkH(bCn0=ZlGFZkvq2csO@|@cY5$jKIF8wl>VA zR;|Ug8JNcx8a^VHh|Ei!l{EMypH7DJ^Hhi+-5qyewBop2sc0mSyk>k3ux6k zx>i98xd7U*?%%(^GFn+Qe%|(P)Ij^+H3F%sft3{=pqGwW`_)abUFeOHIM}MCpg~7= zC}JZJumQD9&E4JjQ1jacc*AaOj6Z1)`rSy&$+bd=f}^6MLQF=6*x@RtWm426_*P^D z0XVKO0K!e5KAkga3+=rVX%6)rm|&9m-1nG%+4Db?lVb;k`J33-8JJ`!UgwY(ex^AMZ+`-#CJw}8)ud36%2J%{jb2vh~jc$Jfr2z-2;&@+x-_RsQI!(p|r zUA>BeqJl7nKp4Sb0KVN73R^aJhxBg1e&^@shf3*Ii07cXB2Yo}gjnq7wx*6wC|Kzm ze0=2Vb^A16jlUJ?HE5X#Vl*!HWwApgk%pEQX!^x$1RWe4K)8qn`^Ix&n+otvjpL#Z zNZZSPCqf-JoZjvK*nT`vGfM#0Vsl>60E?YkRYeZLiWGoPNFk_N-Fcjw0Oh+-5<*;R z($fZSj)0sz5RSA?y+?IhbBIhvGl^t{d+wu2ND_g@E*&ywtd>IfS(y znP>=(dJ?t=C{6w3^`HtD{6||L!3}*QBVVZI9;}6Jz7+baa^a!>M~K@)Se>yj?^gvxPA6sRNPtV_EO4`Aan8ZW~h5c@7Kf20T$% z$?v1x5b?oM0Eu8TM)Y?C9{N?SGE=3bA$ge33(*xE;^#6M=G|30;dsY&tP$59{F$x* z(TDM4Ynh2*h}oY$eTqq&z;Dv+M^2^RjTiLa&mIIOLJhPqT8OHPXYaGf;vyHx>zzk51tK`iy!K_a7Ank44fX zlZ-$~w(Qxq@k@Vy!{K5BK8Lx7bn#{Upa|GxhJ z_anDR{@sE(C5Ru800W*8%&ve^l%S3d>9JZDg@wQUec`>HYx#F~R?nf{6VQ{sl@$48JP@1 z_%#rAq2ImtZ|!di<$Oc?)Bav*W_EtQrMH&=wmkgmJ{lKiXG|1u8W%|@kxMEiq$<)Y zs;fg;$N6$CW=FpMPcRt{AV6qXn1Q)DgCpPF{=5JEmDb}QFM@~!;Xb0GqM)#KV{`L` zpWk_u7~BE%wLceJex#uh2tXA`u2gV!3%1#B| zX`9;GFcH85z#4@D+X_t!J^^ZcugY*fJQ7)?Y$p|ZVtN)9DRuRjZz+nLjLggfq#rYs z@0bJ=mZSY=^$5sVbw3T{Ju)yc!OBn$g3=qr$Ts>aeE4frTcV?*H*0E=?l3XE%*nX} zF^Sc4aPZlGD6@3sJ1{~TFhT-5(}@wzz3Wk8Hwj^qHkHR?*Py%Tz>0rP7{ z*a?~heqN!uu?-;3;D+v*o9FHw0lV}*KOYzPUUVsV7R>iN$FaUo{tvlf!OZ_CM^%Te zGU*O8vme-)Z)eHeQ_CM`8@dxH9mehLSqi}TIAFnQl8}&$c>AYQP(5#I9}F!D5)UK` zolC^w=W(ze{&yd59a_Q>qC_H;`O~x8EihC>fPZgeLkxD@Wg?=MF?iq4{U7^oQWl;( zZb7(^l=7HFDghpIihgsa*L5rh0yc+5+jG?LMplN^99YzHRCkxe`W|@F3=wk~VXz$x zM;pO2_Bn39-9P+antQ6 zP6VLMUv)m&zr9~>@!w~CTj3qCz@OPOU`0|%+lvLO{_@oSew2XX^1q<---)=}Z(MTq zFOmMA?^u!kKYrwaA3id5?9ay%OP>hQV)$Z5=@;MTyJ+Rocu`vC`jk~P=Cxbyv|Pm3 z#Fq$ofLyEJu=u}M?#Cw9AiY{|A!Ki5pZ7D1G)Ku$%ZIR!Fr7c6iEao}*ZW!1heqY+ z(tikVEmD@Ze>;l9MVgI2ba zUGzJ!?z8>!y%8C&&0RCWZqzneyI$V{$ew_P2H)HJjB>ONT6Y{k=K@OMcOuBNX$bfe z3cSOhg3Yiio_p783}S7ZUXm7ro;{y{uGBX%x$Q`=>Z_C{bxlZ!TG(ypvcMZ- zq6zN$@m58=a_O*x!c95qKhH*Kx%uyOslaSGJFh1~Isp&;jw6KWYA4~`1M zf`Tr-^VoWD_x}Bvk#Y-6sz+(iE$g6N^z;QXJQy$wCT;R*j9Ieg{8Rhg&*h)*WqQ&j zPL17F`g3dLEdSYG`e02FxD6L;Uo}zkRob^{v@{h zYmd>clZBVx_kJ^%etq^JlWw{1uk{Bn&i(G_3l9WtFhIKIbDOmlLcC-T;3a$>Bv%mH zJO{Wt;p0^S=<-xmU2Op4X5>cJTfkyo1tbYU!R7p`l+XctVPSz(@AApX{)8Puwa3Qd zT#+f2c6n&?!OLxa$NJS@)s}X3)Iu{^B*p-#ml`@)9u@RjR6JDC|BEYpd7lf$aj8X!m1%$eu+l@_HaB+ z8o%!0->~f3zjN5{17~~+kRuSA?cfo2Nbf#|uF@7%B&=dB20`vX#X^E7lcspKHsLcu~@!&9%Idge4SyTiPQ$&UL3R z))eaVwyUnuQumIBA6sI+X+7Kx?)~xw8+P>||K4_wcY8H-BU-JlC@vP$(1_cs2Z;JG zp6h{4GA#Ua4JIjl{i~f_U3MqGojeX_V-YIA>@33j7y~MjAp-EzVQB}3a(S29+|b4* z0;&+FqwdqZc>9(D0vdQ@0TA#E40|EK7Fc>qD=WLBJuAzxDgr3A6tF_3X~TA2-3Pzb zUmIcieC9dee0=!ArH+}+`T^0}-f z?z!iv21D3k1o5D)qvK176ft{y4v5(=Q&4DHc|f8G@r|O#8}`m4fPQ^tRdsi%l5GVSM%{{9G$@B zfK5xcT81`JKz~pJ$N2*IX=N3a68C*;guWJ-0rKPO?c4VS!{-iHA>f7HQX|Q`fIFef zFQTH9>XJkJ0TGED{vzTN5I{gG z?DV^0VyM%@9&ZHX0+092Y<+h2JS!_J6pqs}L}Nq5_6bZ$iD~ck^o$I%(bb6tJ#Fg2 z#DI8URL&t0F!Fn#69h^O4iR$ckKk4W=F3ca-f1*=3CqaJBGp?6e*&ijQFY)`^F4=H z6L7V8yEatI2L}f`2Dd>Wk-!XWGb6~xLCAI=m?(%4-FBDG>*-BU;-mswcmBEg`N=Q3 z-X~5#;7|O+oFdJm)5R(dVzZ-3q0-P7<7=;hPw+E~r!a~BAg>?-}>*s)F zgWf>oeU()BO)&O`1&FNEl?onV&xOpkmeWgTTE8oa$B0aQ9zfh1@kg}eb9l-FG+Jz0Z^RN$pK z1DPfx14C|?{dt<>0_JELi;oK1p0lIBjlZa~TtI+pltIbWk#Gb|L+}q78G2@B5&>#+ za6WXApPwi)M8m5@0K&9mf)Tm|-M4{yOqzN7_U*>b&da2vE5O9uR&=b<36S^gSM?w6 zl2x+Z7f0h|-NgRgd4@fEkAKA3Fo;0NC+0mpH(E(Tti>E@tmKZ zp8;kj0BU9cH~{bX0%j>U4i1v?^Iz(2Likl5AM}rha|t8t4)*qJ5WZuIW|bJVH$z4S zS-NlLNrkkWv~ImT#Rkr=XtS5R!IC>jV+7c~(czbK^X0;t(>{!MFUiV4+qg zIKlFbY-d0)1lD5ND*^Z|sfQ17!EwJA25TrHee)INDBLCmYKMjYC-l%kHrxJ$cRL6V zuu(v)T!myDJMc8Fz#fT+=-LQzgG0baVmL-dMpPqkLl&O$utgx^X@#6QN{F6t4~#Ih zeR}ANof=OO6Tb=ja5sE?ejbTmpb6E&@z{c3vYecQ^%ZJrnh|HyS`Uqk8F2Fh z7JU=PbBe*7nQ{EhQjUSl3~#qI?@qnBwMG3Pm%Caim)-218gz2YS3rw)&U~roc)7r3Gn`6v-50 zbuF!2PhV+S7;bI7E^PWzm)vAz!vMJf0UMbK zNZFw#fzSgQtK$g=0<_?L_uXlv0WF8p`CjOO2%uzHygxKk5q8A1l>5E6iUavsAUhXkozxxKwy zxnuVf3^?Sw`&gLsQfzu2b&Z#RIDmV+i2qW<>F>PmO(cmAjvQJYc-P^i;@M3#pI^0t zw-0;)Lh?hpBTPW=Qko(?BuRT4yc_ohUH_v6@YbnueBl1^)>=wJY;4wcId@5SrS&VH zY^Qo|)Ky;INAp$EH@}k(Bfx3%OC@)aCY-Cj`lZz`p6Y9oDz5n>nM)e0;%M2EP%`L9uhg=-##GGOTRqK#tTN?E9>sm)hz2n#^~nspXK^%J-WQyET1xikr~4fIviBIG9ozC* z8(NQP{0^)JggjgY8r-O^ry75=A16sMhQ`!Y53L1Nw6sPT&W3@sO!ZgFQ3a=jxuNeI z9~OoOMm_-kVm$A*kCDhz9Mqxj-LF{D3#gaqJ^3_;BaOP`j!{`*sBAReI7m#qB%?Rl zMqG>7wx6%Re*>->46qKUO;R8sMlR&ahK_+zV$wqcg0*Tbce$w%kOPd^_eXQj;T^WE z<*mJz7xkKc@z=9uGB`SV)MgRFmR`HK=pZnhxWw7 zAGv-*dx|f)KW*nJ^p>AMjL!!7Lf@%+Jh=C2(cNL-tiw)X5pNeP0s z(tbO+xCB7I8+oO^&x=jfMKwYNbFKqM@f4A}DVnJjA3y4tXpWDJI0I`wJ|px{TpSJ1 zFOYd?07nsEM@09q5z_Rzk42%w4TdY55o}nFu0wlg=Rr-Mp&vgq=e;JIwn;-;**G}9 zlQMuH3^a1NU2FxH0M$bNCq3gt*jMp&sn-#kW&#_@PPHoqeIMUne?Jb-wcdq|RK$zY zhW4Sm;-@#xEjxa%do`5)d@8oaImbsoezUl*LVEjD2x& zs#wirQgHz-X_|pR$-$!Tk>DRHC>@Bw^AM~G3JNC8#NQIMNcd@N`YZ^L?;uIc6?gN9 z&to+$ohh&7Yma}Kz9E}$vRdE@411XCj6sw@Dl(8m0FIyF%9SuEuP_Z6L2ZCok2`k) z=w5I-`XH|!F@l6anp7AJakyqZQD4wE-rK8WVxs^=84{2qNeUXl|0em&%bTe;TnGqI z2pICZ*LGH?dp%Hf&JhB~^5nDJCme6P_rZ>XEMNzkv z3)Gizar>)j4{G_AW_Mi-%pqUxR#`=V=gteQ0qf=Akl+(ce9?6(Y5KHP_{Ixr!fCzOg;-ljn{>FJAG9)(9@>4kc| z_tQz6=4&o7;V>oK;V?Ik*9-#M5-7uwQ6Qz^4+yeGir@v9XGt@&JH*)M;ScbH2(my9 z5ujS=as{3ip}lo=X<(ij$UZ{A^*=E&xdGe-*p`lt4l!ss0`*X!0rCTIOH54szPR`@ z&>Bdh)61)VFK({o5u|6~4T?W_a1r?xva(9*>i&?RwaRCRmO0WHF=SUzQ5+;L<}M8m z17;hfFaWlIWihSfhAaDmauCT8zy4fy2AVQt{J%Lii(Qj@^U|b(x5|{ z0y+rJ5X4E%kkHxN+XIzWKvGgtMFCv4f)$d;09t?wX@rb1()5g%cc?8jsB3tbTuMp` za!Vug?|-ao0~$$A{?RHK}NFd1c%luz&BLEA~frV)m?tw@!j?eBoDYMo~B(DXE z8#FYug|TYRddLo%%jVBP=m3#v6VP>Fju3eiw2jsWVr-YD7RYrf9?M3+ePKYSAsLL0 z&z}*d0a~%Xgw|C^KkJb_hzCfZV_pOjJV4qQcF^;L1S+Xe@)xnXZaE`|q0nd>7z=iA zdZ4Bd1AYHPEJpwqZaxXn*#12YC+im@GFl-wad#LI_w)8 zvtI*q92c5}dm8O_84h?1cx0z8S!#G5)mKFSDBSHO z41UeMx~z5RI#8q*OJC@r{hGI{b2vVRv(QbOKCO?kp{O)78OE~FE#_56>rMnk-e@Ti z>7ZrpqzeA3T~Ivvww_Ie&ai#xD6exzHEm&9{+L*p5a&p~Riy=gx<%zsQMT4VWS9aX*<&$K~uD$U!ev0^7o4Lwm{>d#9-e;PrPqg z3bgRlK+u^APc2gVCg@O7^*4v^0>96uyZ|8(`Frv+WucM1IECFmlZWJK$^6ScPo&B-E@ll6*3 zK=c_LA@chI@P?o_qFEcS3jqn?^lIgVwQV9q9 zS7&BspwF*nXFN9!SRzD<3K2Dx(98koBwUvZDiN7FB2$C}A41!JKQG_38LN5$&)yL7 z@vg8_3}8XZ%D7$z1T1%Y^bgm$^MWNqVpXBTU$0TmL7+GZLbnkf;CY^d#Ps+6`Xz{= z#~Qq8fut)Zb-hF*6bPq)3X~xI-Cp@C5ZK>`bp+YTMQ?9!=vk`|bn{kvjX*sP z(=1v{l0E$)u1c!+I@x{1Cn$J>jqNhh9U0MXBf15IQxAU(Sw>_@foW_4EyuNJnJ5rr zK$6;GG?C8^9pbfC(1d_RM>PAOEHZ$@!|jEFv|b9J8OSEKLGS1tk@Xtn$O5^P=3qJ1 z>^CwBa%Dv8O35uH`$SVe2yF=S>i<_BXtC*C%3bFEmS8Q0=-l3;Hg#RMs;!cE>|!;X zTu>8eUmhGPw4eALbK81ZOJY+~ucRzo$cs33} z^{!x|+m0}~TJi$#CzF2!U9G*DU6!+_z z_|)N*gF7|-8$B-qM}%R0LzX<$QVw6n82`YR%spN#o;!Fl(qbB;Xx{0kVbm5QlMyyj zgb3ipkB$|W=T=s9vTju{%q)N0t?#A^{=X|3Dx)nTpoe6NR?tOZ4PiADycl!%adVrLSAN%n=t@ z#A&A!yzzZ9E@XEI`A4&Q`IJ6$)4hHDzEHh2QOw~TyREc{sNemRolCA*wJ}VM`*!|k zb>GSHPR>f{j(?8-_O2WvLvpj-|AYX{8tUq#h_4bTS7V5VB#P)pJFPdDgX&%G*Povt z3Q#w-{;S%Xgi^m5BlxtXlGmdGaCKcIh;xF&+}B&KTT@H2FuQFTr9LgdFC`ovg&;iIW}qu zm->?M^TmixiN^1j6s@m|kAGf0I8&8QWFzCc-?i`>T&vlz%$Zg=6k5SwiJR?MqXZI0e!n?`O)pGO%{^TEkIc_)_c710;CXP=Afws7!oR#s@1 z-0hE%mV5YcX-orB|JS45r>08OI{KuTwqd^1yrfsUB6;tgU(=8P1Xc)+QxGK>xbLYu zgVLK{-E`{ylZMA*oAB4G4pYnS3!CapgUxn)( z`Ix~oo4e1U^lXzd98M{o+(M#7x4V^*#agYQ#puoRy^IwVVQVe=ck#(jzEkh;vPzD{ z;0+f)^8YT9Y&fz(wt3w9^BqM`f1!L*V)2e`S>&!&%Kwy5|`C1!hoC7Kn z1aAY?7}lo@V{=93lH%O8d7p+e(75~G)${7Pzn^-E9$BM~5Rw|^gvkrJdfjjyx*_abG`D{j39<` zLSAO(AD_K?b>55dXICxmsO0*1>Hb^oZyOZawn%;rlVX!S*OW3LK&i#Iv72^%ccWnk zYxMO2!C+;{6(mw?^(S^)wZHn~2rzJX^ey2Gx74kqLPl?a#wHh*qDdkBGp~l?4@mIZ zhh`Nu=6uspUO5h(1MEggONz13SfK5`>+n6>>9?T~IX*e*|1EefmUCeIu2V z{NfuO4$BXdYZ%z$+=xZW8$oqu( zF6#Ox*9XY{Xf)hZ^ZpWui_7uJg-=lllOMdRN@!`V<2EwnkD?)Boz(t{nWo`wov}f@vZSQ&3=h z?W?GrK0p`aLCg71Buzn?OyaBW6!KhwTe~I4JHwAI{Te))e6yrXIfe7h(l~!q;MWS} zPaFrgak%cH<_q8DzCL_ucsbmlTh)9op5(BT!1CrY4o0ogOA8 z>F)M}ZB0S&^(ISY#phqY@BJ<#J$ieVob2lfzH`qq_$~_z{iNEo$@$=+y8$SbD9Au- zZ}5z?&Hr61d)9S-EP5~`aSs-(qPZb^2!Q#9ni}JAj=TPm1EROL=&4BGtk1mBL(^8` zbp6PdlKSVui?SD;gU9aem6E!?ZS7seHd}GCeIQLt4EP7Djf(rf z+?D<6RcA{2DfNt$j{=&S*|!ajoqomX0|fNJ%*YmK9s~siPjk@f;C`d)i*3k+upcBb zMM!Aqty{O8U%lD`h5L<%vF{SE99Ox0;O>^s%>Vql_@1}Qev*8J<0=K)$Bb_~Ll*j& zIRfv~nvN7~^Zj<_kFY4?^xCm?CGEi}-rekP-yXOkVP8||n3L1AliuA|Ts(wxK>}Hu z5X7Caw&u66w1f^VCTkS#K9I>~z^(xb>^)JQS&42=UTk`g3nl$JJ3BiR&z&e=n{q6V zLiRe`rlp{;b7^_G1|BE?2@tt>CBb*oTh{F`d!3DHd>&Rbg-ZxwRVdTw`5bHxceaSlr$MeL*!` z-(m{37xp6;5R~i4z}jOoaR#-@$96elCbFyDF`vh_sEWtx;|6Uz8mGz?fIUwH}1fd_>_~v3?7?y^jx|^hUJ^>u*graV|Tv2R^1jsB<~|C z6=J)IPusYOYeGVgN`#~nv=6vCRvsQ|AS;A|_~+>8b4YmV^Qu+S^icPcuP%=}c?Sn? zgE8|`F#mSKw21B@ebmUv=)FmsFqCJ1oWNJEP{S^C0)t|K@eJ&ddi3ZK545i6fDXci z0vA`ogXw<|-1=x+1dv#Q7ANa`F3|q1r3wfqnm20b0N{9lB=R|A6mUGgMKusZ+)aXg zRL`;40Ga~b_CL6m1RwYMpI8_N(R+7{AA+7XB+RgKHK|GzD3Z;~c+836Ia;tP@G#!+zeGpKe>v7ILa z2-oPTrlb^|)rLg}0OGw-^GSHiDaeRr1_NZr*TmFIndlJVZ9+2on`_^U?}T9UJYsKe zf7f^lDi6XPwtXmkZFByykyh$mS-`U!&dZ1_y3|42nzudclv7I$>v8ldxEI z8JWOEh}N`@R+79EJ6kp;DP%;XoPG1~`tfrp=*@xEpD)dU+yUENOUUSosW!2ps{u6P=@@+YJp3;oKZ`C@FDr%Krr*SrEnu zy{Zs*=!%Gw150}jo&|IsQFZ;`*M7m8O%UM-{yGC81uT(XQ~lKf1|xjtW@aC>oR&fJ zJ$UdSL8cQdf=Nk>b1zhje^P6GhW5b?DUJ&8TwNPA>q|*I{xp zF5_Kt^uVLol(<4YMk38&4vm)g%a{KEd?WnK0GA=jE6KN=ihG`i=}g$nbYQX^XvyLx zW{g}46Qu{ce_l^7I@1`0U|&_}Hpun}3nxMBLy`h$o zkNCz9rKOvoDtug2Byrx0wOqTPI~yPIQ+7up6%D{(A{HaWrI{p3vwX z)}X9c@c0hA%!|A+yPx5TVT|p;oM?ep(-{so?7S~TUSo<^4~ZAmtk+p6i5us^wZMNm z$5j+6uTUl=zE-YVo~D1xHUD}O({Re{ZOfT6-xan#`QtaSu}PlN!5&IJ(6JkXgMMNK z--pWPo?q+q%uGXzK5i!%Q(`OY6xj#~i;O#*G=7Ba>+h#@h8}U= zA_=1-F2N5^P)s_Cvxw>zTK3tA^SU~lw_8>6cA7G#U+K(7R z=&KxNPE~`VjD08JU8klt=-uP?bd%uB!n5vDeUtv;%del<9AtoqAoNx`)o=c_NjIEO1um9>ngoJ@RQKAG>LEX}oCyyu9zB@f+t zHMUFgx|OA-zZz2aY^|Epd_kqbRp7m)s3^#p`d0d}>LbR(7sc)ESPXagpPJOUqNr!4 zmtp79AZ?<+75FjmUgV5CiIfv>@xnUV>?@CDV)StQwu-9nvw=yL_TvLB+9@GCcjBUl z%d`H~0t_y=ROnhVCEs6VDjl+P8djCGGNwszcRS?-Tk&nE_0%5>Msbm<8C=fbM1~QG zYm|A>2`7;+teFheYUY`lNG2dGg|*QbcLo9_cPUgD83+n|X44q)`1kVQ9^L0>SZ`=Zak(!LdZ(()z_ZwH1yEp66@!(f& z5Zg`~s?=|WpJem*t}9~{_+@NyqF|Fo1&x#a*3~7Ez=?VDk%u+>etDX|{+EJDt0a$mrc?SW z3lrq!h6!b^9wlNV51TJH=WTi8i*86?QP}gyi8riNhr4HdR=g_ptz6!=A@^@-9j2A$ zVd6p#4EA=?3fCtrj~h zncK2NtJJ)9^pzNLcg1I2RiELQ7Rw0=tXnPfQi`r?KaWXrKwi?sXxO3Q7l5oei3v4jM34g96V-(E}EDM2oWGr zcoU;x08ESMKNTkCF3ED`{F!Fd+xrD)K%j^X7cpG$(fA^akHeD(GVsyD?8b!1cCd(k z#dkZ`$xc^c#u1#v#Pl2pz2`BX;XwfsAKpD;idtMj`ANh?sgo=G5Ps@ zUYt+Y%7>8c8zO4IR@}?$Ra9!dIvrGNRefT{NqKU(B|>S&e&I+*Su^e~uP&&)|eDJhPtHhrhnXok9ORSzjAd})`H}U)P z{rdUtk#;!lD4xitrrJVmn`sOJo{}>tj6Uo7p|@9=?rJ^1VT^^7)w@Kl(NSxWBR*yH zo{Bpt7}@tHBqcrN{m5);FQ7!G>|a`D#4jRQ7OgIx8ePaqyA7UZlkt`mj*LpZc>Wj0 z$K#7X&5fq$=sS2eR8?1d!FEL^Y&Eq0H24(4_YKY$QcU5NnSq)|D0%uV1u+sbJG*Z2 zX-rgbFhW_(=gu=N@>tD(d856q&{Ng8|Ii6UUuNR z@&4h4ZM5It8EZUe5=yNyhMhH@Lu;{FKU~pZ7V7&ce1%&XkLmFTPhjjL$l@OzKLH8e z4mVnR`V2JpxLrJ$=2K)t(=k%@E;U)-cIeG<*?K=;rOUJ=HcpD-#;(a?gB_l?zJt4A zeZ$@MsO4tTi+ST;|iPAs+=PoUVVF#)bFZu#P_)ACdLC&=Ur~H`g}W+b&@Bu z%U4sqQ~&0iO~kd=^pn5iF%Ke zkxB7PNjvqP&r}BvJXcpFp=M-+v2ws70Rka1ux7dIBk*yN!P90d#K!j3wgubTh6vU_ zp&Asw5cZJ@iSF^n>L5N39O-1x_I6g)uC+vwJN{fC@4V@QD54+_NCiud+Crxdv4W^ zc#_q2{8>aYQ8-bEDecDP)nk)Vf=Uzmb!}dG7YunsSpQK87SKuRx2(9kx5CryPDGrl zA7qeVE;58OGz#r)cPk&P&4oMF$8Nl!(KcuD>X#kRyo-Vm`7pSwxaPr&w7s(bcx6c7 zw)5>JrXsYdW6cs%pUbuM!-A@Y<*taetMM&neW4S{Irl|TFL~Wf_UPCq&jMY}>LrsS z9sIrL-(=kJZ%n$fuEyFnW>%e4Rh85@s%k0NR~B{ZoK%%!89BKqHFM=|5t{~~JsAue z<)x&3n09{qT<@OF1y6}o=#NB9ghOW*ZQx;W0L`|#-mS(%oSc>0>(_Rb3zEln`s!6( zYMjc`PGvb{+acq>zwXz}$2^zB6P11CcC$AIYS`E9yC`V!>&|qV@+f^IbA_v>nEUg| z-WJZVd0m?u=l7O=sxm3!E4BSiNk{G7*XjCV=NR*ehnS0{uP$yQt*|rgAnP8Nr>C5A zH%1Uu1%CAhmA~`8z^ijmK!h$YhmnqI3&wVGTSx9q&Z{KeYQ1C)8gP6HiDpWNj}-Gc>vq@5arA2OV6D%tgt z=B$FrH)n~@7~xdQ}IeA z-+Ykv>g3X3jf6{5$+64L9|c}BJ8#q#6iL7K?TB-r>2JNo5-HD?VmJ4FA8c1PjLeOT zB#5g_SvVZd>zl0IRI_BfG=AUYGNnX9%g35pvZ`?>dJ3*ztn&q4?{jY*u6Ik{%s<=m ztS#0_-=%FotDIeuyW54S-;x(LOFSNs6j{5NtgKz)Tcx7B>DT{eDh~*&*HX*na?hFG zD)mOx_`vF-*)f|HbIL6R+&X51TV6I6eR(!})h$rmT{eOIanOOcOa6>a9?g?O_mpgk zLe*Tg&J^9`-ddN1F~N5qp_Z#}m?@60{zQ{?kODzM3~{i+S1eCzJ->7ysp&1GS7 z0?coia15u*Ed(RKZ#KG-SU>iuNteli0s@Ad3{$eS=4ZF|BDr(KTHq3O!uPB%+Hca+ z(?2@EQ*8-$_YMBUoc)@bTl-35ZH>V<$od_gfHs2H<}JZw(S<-{oA8> z8UySiOuq%>`5Y}-QnwvVG1XcY|9V)z;jJ_krY|1DBnHP(*4k97!P+O-#?uybz~%q6~1r-``y+Wm8mX7N^&yc28Ldq(_`+L1LRppEDA z@}8K$H>|7{mw7{Nwk12xuste>)6`$DUdbz~rF;Focnzq@CX9UmvzSr~2?k!p^g)=^a6CZs{D2;)^s?>Rmyas#KNzg)*k8jRpIj?lE`) zFoGA_f_B?}W_XTn7`9;B@<+XDj=_T2?{XVH;$-D6ocn~C-d$e^-+WxH2?lmT?p1}O zGk^yec`YX&%8?7hNK=rtogdtugDvIMwckvA-QADSBpd%ohyA3nuGj6tL52NTZ!(nLDVg<-mupjNo`U z9=sbq!=dl-1@K(5w4d{tct|i zveNCRmvd^S@~6eB`TD|~TE&{PO7f?tM`u=?nhzHDa;}rriZ0{}or%xfX;E($@z2u> zD@!zCLCXhKtl!^b`4n2W^40X9$W5-M(sBXK&Z2lvZHg05%$vU#@mk&3GkQ7dz4lC6 ze(n&P@6nKj>1@AuP74(NT0QbLE8_uEwN7(=3h!FRtaWfzSTSi4lpkUUPXu1#P)!H^ zO6iZnGUF{y&U@(NK72S0-4&D?x{wC(xm;l7Bx=d#LI=C&jgYbXgoRx;GD={K-(?WU zFsXVv`KM?{mS$E~VIf~%Wu7T84CE~_M466qHi^#A-lG$%R;!xIKeo^iV3%ns>(EeS zZGZBUUfM1G;NXZ7-kH(4_O?q$e9|`BtiHt9*(!<43!lBeD?2o1H~zg?43_f0iGPJ< zzHf>lP-J)A=x&zKlYVcROD8Hij#{)$%2kMcbLXLwd)w$IJr`bdqJ5s{diM{-UOZM6XMU(#@2g(zl~+%*+o-i?^}*e@qhv=U<~OaQt?291tL)S(*RP|~{F;ZaFzsHi|6?E`sRFVpBHiyF zkWykuDTNBN84`#uUy7oOK~eoIVKmi6+{#v|>VLjy|4hmo>xzp{`lOwLs3ASL05Sjh zvTr7u`Aea~zF_Rb(dz&D>AG(cD9UxA4rpGo(Z3L!2MjGx#Xp5drDHy?1`j#f3nEuz zWzxS$a5gUW2FDV>^rI-5?Z$FkA(0WPwwtb3<^_e2Ydv}qN=jhdU3l4qtNI8w!x-2W zfTnMO7h^|w37bW`uou5-Wx0vaBVuzUgH=)< zD$Dx=Z(P+seZzb*LSp4O_j41}+ULRR07n!?R>uP64_N>_O%pRhURl7vk;b{ZRRYf8>_ zoD)#)XxMY&HEIW#;3(3uae$P)9m90SoSR_hjHBI`E3z8tfRi2=@#oMokTY~#*<0gKlp z{9Kb*<$_+O?fHSQVm-lOG=WP&flQdw0Bg|#+caz;Opd4S%tvb$Jea_2*ZLoNczJL> ziS7M=uZIE0)<20Ck@N4@*TVd5U;Ioyuj+T<F?kA9-%|PXYY49Z^EE0WR>}&%gk<_5h$A9P6jO2vYGJ&CnsUu1GpaQ zd?+16!NY{C;&B zvl|wcz1w$xcKVFy5?m*Dgg<)r8a9P7xM)4xV)4<@f_pG@tgFc5!R{L`KBpE*kR~Zb z)?XhuXtRCQp7rtKn1joP*^DR-ODe5u+b3@mIVfSq-H)NUVCG(eOdGUNO~;;-tZeZpVU~vfTw`0>a$U4iij1MX}lI`_+n;@*dhb zIz7;9Em~C^d^}IG)%`xH#eKx_6R(X^ZRZa)VZeNl2cH3LNI>U$X|}nMw3Q~wj-$P` zwY9?GZ!KDas#HR8T=iE}!=4VBR4M9t{oUSVr)9&8eohXKdpU$6Hx2QaP$Emg%S|YI z1zOE02;o~PqKAjn=}se`xY(5{IYSP0ButLC3#!&?Jl5I(fZIf879yFSpHFC1y#K2ASccmnf2kI#B-ywX>qt-|h z3^B(4fUWJb5r5-i$~<-$Ttun=+ftFLBF98dNZ@ueF;xKZ!CC4VBP*?0HEP7q2=4~#{{0UT;uH8r(sdWUwP2@ib5mrp?JAB3;mhC;-S-^aFYXk5n>SgDs^ zP>`aUcq6glZnBO2-w^Zb(QD60Bt5CTJdV%Jk}x4N#!*i^gC?KHq*aiXTeG5QWjgtI zV~1^jDA8t7_^y5L1=-hY-zy~*6xG$GJytNQ*^e<@BX?Uk(Mmw4Eyyi0qrOInQIr3@ z2CTK0@DTK;e#;O-as#3v%p}jPEs5G)fub7!1={>UelA?Qvj4}$y)HiocYUTfHMaKe z{`_A1Ea(-Nh1IsfX7Dw7fNmzbRkAo{PE=RW5Nab zZ=2jdC9yE@7LpoQ6lVf@%~zj8Tt-OR`+E^J@e)B($_4@m#0Hr|PDJ(MNW7=^eC-YP zGyHpNDqFz=3^pe3!zKtnQ!q^L^8SbP2SErOJ$B3;B=dE<<&M=A8)S7Ci_Nw^YBsVq zHUIl6d;eSHC>~MqL%p(l*RFq1qCw=1K-KK@VZ?ja)YM=vs0Bg`iBMU2xi(4?CK2lj z$$D8G;wOVx>_xywVul7z9h~9O`T4DKzA}(WZxIUf^-UJcIBGzB7 z{$+4YUSR6IxnN!o# zy?w!^dPu5AP6}efe6>o560m|lstI6oEBR; zh{kCi$LPa22|DC(-iGTe-LTOU|N8rVCq!r10{uhvOT^@&BE%^1$7Q;4C*z?UEyq@qxvt#Ww8V0*cZ(A zSUYbK34AZm>gY5t`a!T%pMB)T%TV}*lp;=fd{@x(eG)9(j)k-z|J4F;bF(gM)*}P3eXJh%iP< zEdRciVI};-1=+$6oJu^IJ+Q0c?%7nS6P4B~;;+>GbY~_fyKsAmTS^4M$JcKql1pH8 z*@0xNe$ZQ1LbLGJ421Xwg@jx}m4GYC4;`cUK82=OE09Zv?@ z(qxN8FhTvZcp?vApc=Ht!W6e2V!}I*d6(2$=VorsgH;DLSsL=R_0^=^)U+T+cJOUZ z_GK2g&pz{S^ZGxFs2SQ%IIli*bU-(^8Tohhoi}4MupvZYdp7DQENHL>wUln$;)m;d zJ!cG`7qPh1J9l=be!lzV1dZ8PnnB8`QKuS!j?k#ZTP(po$mM(ot~au5wBtGWice48 z+b2vQxxE(f)cP*gL0}5#O~`8KdZHD2u|U+*C`{Bxr{U798i$Bl=YY zv%{p;p@8WCh7$Ec_Xb|@8m$!~-jhWxha{F>Iyj-4}6yBs0vXKD-87x_*7 zYh|#ssUhI}tbj|=!r>oIP%@2*O-ObR>D6e<#(&j#Anl0|$c z7lBB|0F2G^I$EkO8lRsZf+HSbjFKo*(VqOiC&PIWD+JISxKrF%1p0&sTRkQE$($rK zd2qU7_QN+R#fECw(>8D07H=VX>eTn%N%%mW>(WGhUcO{VT*WC)a1}qt$F+uaUIH=3 z0Xo!bgCz_(l`h&AB3K7OX6`uK5QM$sd0+Buy8% z)DeK4908%)bo>ET?^Fa=2dFX0^433jYX%f`=62Tcv7Bq+L5v=idc`Lw6O`gxHdUeK z%4#{r&OY^Z_xZJN{)6`Y55y|e*JbN@SQY`Zd))XxAd-(BW;=Lrj{)_6JC%KFFBhqE z49_k~D?oEyt!gQ}D89$Pz~9(u)n_@bTm2IbL^kbq}F=u~aFsK}}D9kobJ5 zFv9}0Q?IH+Rv2vE#LPJ5}MVbp7mnUH+cEm|VfTh_uo06DO znW8nKxXzd)Jfmy;b=PMUYC0HqH(eNdLAK^a<4y2D3!24$K;~!wn|XPr1ca<{s;^SN zBEvP7*t)(7?dRY?_6eo`sxI-EV!OsnO^uo4SGkCuW|y&ey(?+ysb# zs9#iIk0!&eq7UJsDEf6G#~BBsRilP$n~6S9OF2~?$b52secI++ck2KFA7Fd>FxY#$ zuC9(8{nZu%QN*sDZRu2n1)|)%nugOKj|f5lC^a3X712}4;KYDRS{slue)=Si=Z3t7 zeU5X^#25bEwTTj{R4>LC#Rnh)Rj`q4Jq-^vM)MHES%^ZED2@;tg)|{q06XecDG-{oJQz3t zA8sj%4`gK@;pO!q8r^zjExuSK+(Q5=Bq=5t!=v=L}D9ki%aInTpH&RR1+i&Gy&A=Yryw9@<~! zx^O^%Evwwhy7;oUDfPL+b4=Sr&MTPgq&A>l-?Qod>#Kk2?7lDA_=H2E^7SVuIcPmf zqi2NuL?%B63wc&*iScAK8u9C-+(4k%^w)bP#Hw!lLyVll<|qGqJ9fay&jBD_1?~t{ z_UU2w2;(BeTaL4N9g21uu!3R*9WWC40F@-+#=5tBO7bnYpR+fU`CEal{Y=6mi$w-+AzEP|L4uu{(Ih> z;a$r`4$Ane;^57cy?BxJ*s-$hH0~F4?jtgQ{65BhsT4f0@*UQ%3_@>phzuvPnZ7|S zW$&h*MiI&kCV>L;I9DJ=;2fU};G6pQWw7Qz=G;iFK zSKF=*F}nyiZ5IJ&y>s@O`a$JCbJuDups^%w5;e8C54yts_M!|KSy@X-zS>>78}*g) z^zS(IZ0vnWA0i_y%zsspmG$Zs92{t=SX5}Q28G?)8}J8yKm|H|Pl&bl^xrN34Q|l8 z-EWREjEXu~ESxIO0a&Murv^&Vs|pIIWn|oANZv>A6cfEKk~!eTwaaCqHX!@&)38>4 zFZa;|J*N;|5|(0Y<@~N&tJLBJfADr3Bu4#n?Gwpv7YtEITs(8enE(-vv#}v7 zTiH4G!nVkN@ee7f5L9y~p50AGDI8ZPbll}_y#v+tEmxQi#JgRPMX#T6$%GxzQUBE6 zoxVrUT1)o7F2J#lU0P4=Js5gL$8-twAm>b0;$BbTbyrJAzCSHx-;}`0Iu=bok?2#R z5qbN6zw-=|VI!OKoxFVO4}(!FOuVO=(@wK%Cf#q%hhvDSHQiD%vu2gxbs|NUYYls2EqIfF&OKgWbWJl1`3x->2R%O9YFG2KR0<80m2 z)rO;;3CRmp;v3@HhSMh#zCY!?N`M@H{mYcq+IO8IS;N zLes7pwoIi@?karF{5q_%wxE7PG))n)x~gvfUDZ_wAacd&It9j;P{a#KKhb@{_Ure4 z>H9bQ4;#gAyTs1bre;ffS0}zYhkauVO;LrOrSHxRE?GLFzdCjF-`Al=_6re!U=O+? zjEh(*AB5P`xPHFV8NVj2a2Ksm+8K84{^7YSp87pu3kwTME$t~;@!jG|0>jsNG3LYV%-_A{e5IOL$b02Kuq$$Z-%WA5Y)ELkc=82Q2?+Z6b<9JhAr%EB~3+$ z)3$eY(UY1%+fP{5Fegt{w}+cAYWcq~*ksSu{d3-@%+ZL|G;pjZF=pLd^|+R#C(U3UJCdCGJ(K`H^uFy_TG5xM{!kpm3l4v&V!tEdB;Ms zv#aih(n%+*URCOA;jtN)liy`4R=<_bHut8GvY=m%RYesCMnYs1=+NHjJ#5Fm&yaF@ z%Vl=1Ml~Uh#H9k<^pM5>emLq6d!W{eo>Y5JJcMkiaAAlYvUV|rK&*`bF`u?P-kcoy zLz*Q1s||$`bgss?H7pL%%}(g`dPSv=*L!rnGL<<#eJ`aph@e|Yr0S+B>K96MVZxpQ zw99hg^wu*zN|c7?K*u`|FW1pPrsf2E}AQ6yHXD} z2{OAeI5+;Pm^3^d`sMPNKMR{?B>C};&md;YP>pY+O7A*Z;9Fc<-pH4^z(JlMMm#J* zRDYLeB_U0~h&$CsCX2oP4>qYwMIKJ;Kb$(;FHsvKe=25y<@Quw&MST6TduRA>aFZv zu`_n_qEY#07nASz%yOrGwEcRvBd_CDbhvamoxw>fjcB^qT_M6NiDU68e7e=w=B)S= z5AJM8z|QEM7W3aJ8Yz^zT#@v7m&=Ovp&nyB85d@w#iq$?YyxdNOKmr0rb??xd3-OY z=4c=mvUUog%7XxZUER}LcXg`76Z8Aufoy(mY^WNMHJS31JU+YQc3_~oW7m2I`LILj z*?S*SYH3+#7?uvbKjFA}%Y@kzR@OwXs7#6XzW<`~d}T4wL$z5kcqaQjSZug;AWgzh z@TO7gtl7jhjh=iB(SEjNm9#DsDkMuh)FL~D;pZo3mM18>Y$K;=bf!8T7u)9Qi zl4u^)H3;`TpBMG2sMZH;kdl+5n6!=iIBR~aTL+6siRbJ6deTxan0A^eExY%h>KQ*a zV6&L>OEj7Luc%1;nC@PeQolQ9zqjA-sgv`h;|{ygSk%=$RtC6WY?KfnLGHp}IXmw)ek|6T-u}eS7$kpVp@{gAClqL?uRE}hnm|HZG5AlzWDsQ*teBEf4IL;SRl5e7; z*%%n(D_I-lH#Xf97DGdE6{0u)@VxT0%fYM)caG_329r+m+G_V-uCNl6HZtK#<2UVd z9~jURQ~Q3$hR;du*M5o}MWk2n#=ZL{hd+d~>vMH_lWJ{k%CEOu=G5;0?c#rbb*1po z@~qR`RH^htq4p7vee#`i|18dRhZNMWEKgp%|M;Bzj^6M3R40CRh{U#hY6`3Q*71Cy ztvxloUmqApYk`9@i>0i_s+q{;PC*$5lg7Qr9fQi-9F!B@L|3*}*Z+Y|*1Ct;__cl+ z63jd;`R6&rmc+c6a&Bq<$GN0Z3;(Hsuf1HQ zpXc*Svqw2;Y&0#sI?@t1Zk2a;n zbWK=FOF9V*+1QaB!ouZ>7^eDo`hH0Msq%?KSSpep4~3OuU4Ew6Wpp$&uDmMzF zDr|jwBLuZu=x^R|8`$?~RiC}gMs$7O)BsKM#;pQrA{j!}Q+vD{q?}`M!Pb6V*mfOHpz)=z&q75{k5@xDE5sph z_Nv8l)bEjc`Z~WyA&$Co_eMLsPN*^D&A8O&$vZ{lE2pOP{7!skEjC!+{Fu+2PUZ^> zhn7_2y8o#{q1k@_^vx{-G92Ds{6Sl2St+IdZsIOKrL5U^I>$;%Gz+sVG`5ev)xM)D zbR%(YgP?vizpmFul6*+4jd6YGTicBh3IVS!1o1gk|A0TX@mxXnH|>LB=2Xr7T@P|tYgzw-!qo2w%jQ1&U*ynV^**8! z|8-BOw&MR}>>x~GFak)3>mstB8kz*ATYuiqvm>l(;D0qtEa$n6;UP*RM z>!Z@IA4H4Yko2f_lxr#xl=e9$f7|9NkItrW&5brK2N>HOxT3vGsq^^9qX%y6XsO%o z*vRcNvu%g>IWljtyqm{6D#v=R$}4lTcKzF0^>7ffRKUIcy~Oknl)fir-@kwVZFf`- zk=J+hIL9FEzCRQf!olR>3AbU982m}Ul{2cU97qp6@;LE5e`?1_m9&=88;MC%8xxh- z{~Uvc8c7W))dt40bLb4D1MVi3PUgzldPZOS+}^gBqRDdRx|G^8$n8IW*>%J3bKmHO zro?wfE#9O`<(Zh|j{XF$yce+^`6ODejMF0ZsJ+NX)Q4zciD>vw*}^gU{D{H0s^#s5AS)Wd+U!EGK9 z5by_A{rv~wN7TK2JBKM=F#a+_p9`bOO<-;4t|70Bd4YAeMp#l0<}mA5&_!nr{we(A3h|*HxWz`fADj#;Sd&8 zVOntjrs#nH2pyE`c5}^Tr>Oue_5+Qsi=$#1+b3j^WpOGc< zkt{3u8sS`(frtdO8{u-y2i(Y&X79S4u>{Z`G16c!ztLXkD4}Ki1s;70!zvY3v{Nuj zjsWY30jMVfF$U6Ng$b?CsaHB3)#Xk$&^16z0x_4WevI&^tEID^Dlznhg^%fILKThi z2Ysu>Xr-{+;K*y;+4=h1!ZsWS$Lt@4)0uP+a8uo`sp1?twz!>V*>30kSi1gT+2$0H zC#lEvQ~z}_W!QNW6)6K*}kvnp&o^7Z9mSy2TIMVDJd z;va^~HNiejsMR2?!lXnZg(A}V4uJ9MCSrVVMj^FoC^7(3G2sNjdnrKByT*((G+$tu z&+hgVx&QMC-Hr4+)ObrhAeVcf$?1bCh>X}i5oY-dc{7AP7%zJf1$Dtt90wPdr|Uk) z0N9Rs^sAUCi(gB7u>jIjW^`)@WR2!D4Z1zVN)YljRQ<$#tKx^wix}`=kL5^6haet6 zYM=}VT8M3qe({}=%mYFhAmJpAAyNdlE3q=+g+6JD(1*4VW@uuTAOTzh9i=z{WS5wp zv+_Ge!azowntCE&$ZugoQ+-mK%BBdyAR6Bykn^%&q+PknSL~pBPLs#xYqTVR7-31d z#WH527E^ugOHN!9!_NNGC-P={6h*dOm->9|zx(A&@g(;S+EAtVj5Arjach_)D<}do zg!=O!Ok|CL^^`Vj!5t#Q8iWetCV%i2O3Fjr+*I-PP&z!86_L*yNhKkuu@kZjt1TbJ z7X}W3{SHna2f-YYQi+>0Trgq`n=pu6ko_SkqqrxSB7X$J8$A64uMJ-bJw~yDizdcI z{~m4e2fc}Of)DU+Z2AE2F_EY^q^Nw`U)^F0wquN#s5^W;!GQh)xS>gmyeEH;sgFe1 z9u|uFx*F(s(=P4|4}tF@kXPoyg`2(QzFdtki8Tn>@q>3Kgye+V7=y4aCVONcLL`{O z<}A~F1e07im=9$fLK2I?J;L@nrXscjXV!CLs~dZZ#7LvZlw6GAByPEU}sdbxF8DDZOSoTSOC)z3$vTM*I-eoFet|HS90yzuJu@@)gr(w7b3IX?{EzVq|m z<{`upS3s(fJ(fGn&}#F4Fu45_K{MKFkVcbw5gxRWieDx;` zj=!qZJ18X7EVMgatH=?XDdv?*=|VJHrj7DAXUVHn7oEr7@)YgQ%jpnbY( zV%0daU7(O-7%^VFWmHj5Qz`3^g#+P_hQgB=zl90AP0;SPWSRCO`u3f*l99D_Ch4~H zYt<`It3o?D9!j!R4ly1Y9o6U!@eP;t6o;IZ{Eu7_0uTv&Ir+9U+6d{O6SN6rrv8{v z8O+l-W$IghB4C*`oZXjnZ=CBT$%Xe@{IkeP5w_TS%A}W>scB}1l;_lBnhRX7Eu?X> zRzB-r-Na3x5Ul#6Sh#SJRP;81nTH^S67zYl?teggH|R{GI;a`*Hmk;4dp8ot=f{6G zw3-!f2LOBzx)Tv9<$>~RZyJoV+N?|XK@Lte-Dh<9xs-K`1@o^sqA!PDMDzwUSQs7s z5E5<6dPU`l4-{0_2kZ3W9Rfv=h)-lKK`5w_ZT7}8GZn`l!ch~ZR<2*Swbd-`Eq7i9 z!GjrG#$Vg^U`KQ7c}N!K=Go_tKyId|s@oqOjd&}wWAmM^AqH15Zuif{{2RlBq-scUq{TdgaYjN9kR;sQRdsX+@tdgpy=DH<31S&T8 zF+O4=BfCBn<*!*z=>0*2iTL>Vcog!p${K>`KN@=PDhz3}(aPPNCEy(`NSs+cVDOz9 zk~D%*pS9#*rf(Vy0SOv;GqK70gn4+pd8-5u8n^U4q06W0Kz5%iSSFl%M1UCLcxq~o0m@ZmYiB45WuFTRG!0Pj_Fa$)#V371|^TKKXN3@Og`z3f^-U8VF?($J+ELQDG+C>C*I6Wr#G`F`mk=%y;dSLeg~ zGa5BXNVK|t-D}!(b;dLY)0d_uyqrXxrj?znzDkIoxKEqioLpcfXp;TY<*?m|&LCVw zRf$>cLBmOTCM&A(xNSL5a(B%1!$x%6rqx{fWsleDoL3rl2!Xc##Pb6a?4@2kqv55= zY|Hh^e(m?_L7S6|f_TeyhU1KZ|SR z^KSWyJEww*#txH8=SI(ZS;ww?;db-}BiNJWIGi=9?=+(?^AdWzLs|>9{*%y`-A43- z^z>YT=6FB|uMEFwdkC_B`XRW(?F;dN80i#{*&H0(sVG*KdbL)1ujs!@*Q*S|zy)y` zi&~kZhh-oc@kgTgAsOgLeDSk5hIq0}+JX>B)I+t>Nd+N75Y`EA4o;Ew3Ez0)1#!`R z4x!qeRofAvwbVst`Dx419%un7FD74E%-wxRVl23z6(04KvHxLgUgp*8@I{l$G zn#2bL1ul+~aAZI?KXkTW+(G80(?X1s@KEUkygN%c68bUXPG+(so>Ka4&6Oez6APni zA%^FZ&rR(Q3bft3M%;b-p=;sgI0+|lpL$TYNeq>8k3z#;y>Gc@AM>OR1O^UJj4m81 zL+I&ftHW%YhhrBbo27W;9#4iXg_XZwY^aPh9J-vy{grtFGl?Q)=; z$KVYgqJbb*(i999v(mr&iw%wLem zP;Lwi4do0=v<$WJ4jsrp6gr&mF(TD}*s5k8hjIvpdDE7uUX)lKl+P1C3on{4WOIjP zEFhHZOGv9K#|Alx?&vm}h-NSuFMEg;3+S8>Y(cHjiw3<4WOFznblSH%vCnHk@t@Li zY?J|5p9yoy3H)+CF!vordUnNSCnuehTjAn~kqX}GieoYVS9@0) z*3`8{FRxE|ZBg1+k)bGBsUrnM6bO^HDvcDWKCN0IU=;z8LFUPX)>f*h)Sv=^pcO>x zfJka6D1uUm3CxG?Y$-ck!eqX-t-sI-qn{)PAYwexA&q>Z| zJuZv*?r4v7-No&5Xhw9Iz(sah5uqLvkj6SbJ4Ggt_9#5sA_oE=Xq=>|%mWt~c{Kdf zLu(Qk=Ji(Tlk_B+Y9$iPWXMh-zsHu9cNM^^BaC;H?Li(&Au}r7 z(?m8n%D(`v)oh_$yl z$(*;rGQKGjT7)Be-rq2%iG6-^w&7`R@WOc->Wu9XusX)YUljTGB=)Peelr>Jz1hxeXo?(SO{WZ7tKV2Fqi|) z$aOS3o$OyKt`C9lI>40-a1lwgL?W7ln7;}2XTVIa*Cxy;Im}Xj(q{GR`&YFmORFmt zj4mseu!^1xd~ogUmZ1A86R3yuV%B@3A09{BW)jDS2xi)XkuZJnC|&X@@qKNHLT~AH57HG03J>v zP`rr@$MqYWkD^Yb32KMbloO@{I0WxrjxR*5CPU)HKY*SD*`N@T2rpw)3sHy?PoRg8 z7Aib*ZQg<%7FlMU{~$bC8nqzB>~Y&TS7LJL|n<{*R2AFmes8$E zM_4GlZI%kP^e)QM@NCt63+H+$gjNMz0x}RZuuhv~X7*O;NOmsEQ#I5pwQ??MbV_@B z18eP6ellN#lr_YkWN>5Vhpf&6WpS~FQL-oPTyhk zVoo|eUsBQ3l(ulnp{)~@J-`~4v0Adq49g%TuPJ_xwoM-CLUuiP4AaE$3aeENY^4i( zfmXKwmyH#4>d+6py}hqba&xHOW~`OwEgrCUJz^qUP2}83QOTRNF5aBioJZ%Ah+2i0t%vt35|P^O9ABd!agWpp;;DTb)cjU@Q^0je~x z4vPiUtWpZVdkzD?T0Yi+?lLRB9pCMh-=Bg8p<&Smza>6(2~fy4zO?JAC^SB5<>JLB$`=G7FM<#m!pisPG{?Czt* zItTw%u&cvkSWP?j>v+as@d9}^xtz<8q`QMx5!@a8DMc;S&dX4Tfm4}xinq4ulWElHjEF;wkd=9c$B*T>$8Z6;b3@fwm6 zXb4n4I3TKE*7Pk@8GBlaI=guKduC`M{5i5k{;_3=MTB`$VY~y`Xxv^9UmKD>a*FompP zqW)RKPzAH;fK|}?@hP^N`1nwE`2?JX?W`M`{+GR<61+I+?XxH<|AwT3qRy`)_IxM@ zAdY$QGGbLIMHR*rhI6f896!uko(xke%7v4dSb|lmMn6`|wZWzP5)lf9D;%c}|7-^; z7H@a$qg>rM$iy72?&Bivl@a?AMR5s5X6lnc1~-pbHegHp;7Vt`m#L4AqxxC>)NSdfPs=2<5U@@tGhgCZZK^#vx=2-o=Yn3614iAW5)(^HaY@{Ia>u7-=r}RcWik{=^6m39;*4{U5xYP;0RGmmQPVOF-eilEvs z(N5UW6ui#uLGFbVM!TTL5xG_#`Sz*StTB%v?j~~-Mm3WbDW69kfVnv>7H!w zqz1q5*2y9T9r~Nf6Jw9^y{k&P=O6&R?zqc3@m78~1nvJ=X)$K>`trduzA)KK8@)$3#7r>1d0$XSs z#^5M01K>vk{IofZSy)vL9)!3K`<}qH1|b0D_7rgc0^xtRJ)I969H#YilZX~|6!SgB z!7s=5^^53L?MEfMBJvmzsbW5;w1}s=XBj7b-mgOt&qB@kSp60D>uZ+_h12_A8jp4? z(w!WCKUto@)dzg6;Kij$NczQ;ocR;J?g;O=eX{r#uh@+=x!(I>`Oe~lvYp-9ukP%>Att!CB%;9^KxUMb_cNcs-YrI`nBd%R zdwOA_=lOcSe{0;qv`2FCuQoLfQ3%n^R1HS^rIuQJM#e)#;m-6VD`7(o2^(4wbnWZ_q)g1t|9_g87BIF5F@X?A^-hvJvj&Dk|JNuuKrJi zk>`8E^MF~E9_tidau}7K^KdSpV_a$fS`Qi7!Lkq_Y9=ZhD5DED0;aaN=&aUfX z{w+Uqr?Uaqwg$5eTFM2h0KA;pg$#{+m(1UH&T!GV$Thlln4 z?UA?nol3U~oI0GEwkw$3D3U6=v~xpm9AMqLQeHEvv||X}DDUvRZ$ujFPS)(Bq^g_B zD=eoLi|G5^jjRg&%ncY$@fS3MXcVQgguZ;)x=|4ZCroyq;2C__zoec1cCOkG>!h&h V!*eG-HX_(dU$J_5#=EYc{TH}5*XjTO literal 0 HcmV?d00001 diff --git a/docs/assets/images/thirtyseven.png b/docs/assets/images/thirtyseven.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae1221d51aa15aa47fc7a5bdba6dd4e08e81ef5 GIT binary patch literal 50071 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 PseI2nq literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 6f83409..45a427b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,6 +31,8 @@ This GSoC Project focuses on adding a global block composition feature, resolvin - [Toshan Luktuke](https://github.com/toshan-luktuke) -**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/) -**Github Issues**: [Summary](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+) -**Pull Requests:** [Summary](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+) \ No newline at end of file +**Official Repository:** [VisualCircuit](https://github.com/JdeRobot/VisualCircuit/)
    +**Project Summary:** [🔍 Explore Summary](https://theroboticsclub.github.io/gsoc2024-Pankaj_Borade/summary/)
    +**About:** [ℹ️ Explore About](https://theroboticsclub.github.io/gsoc2024-Pankaj_Borade/About/)
    +**Github Issues**: [View Issues](https://github.com/JdeRobot/VisualCircuit/issues?q=author%3ABkPankaj+)
    +**Pull Requests:** [See Pull Requests](https://github.com/JdeRobot/VisualCircuit/pulls?q=author%3ABkPankaj+)
    \ No newline at end of file