kandi background
Explore Kits

suro | Netflix 's distributed Data Pipeline | Architecture library

 by   Netflix Java Version: Current License: Apache-2.0

 by   Netflix Java Version: Current License: Apache-2.0

Download this library from

kandi X-RAY | suro Summary

suro is a Java library typically used in Architecture applications. suro has no bugs, it has no vulnerabilities, it has build file available, it has a Permissive License and it has medium support. You can download it from GitHub, Maven.
Suro is a data pipeline service for collecting, aggregating, and dispatching large volume of application events including log data. It has the following features:. Learn more about Suro on the Suro Wiki and the Netflix TechBlog post where Suro was introduced.
Support
Support
Quality
Quality
Security
Security
License
License
Reuse
Reuse

kandi-support Support

  • suro has a medium active ecosystem.
  • It has 758 star(s) with 176 fork(s). There are 464 watchers for this library.
  • It had no major release in the last 12 months.
  • There are 26 open issues and 71 have been closed. On average issues are closed in 101 days. There are 5 open pull requests and 0 closed requests.
  • It has a neutral sentiment in the developer community.
  • The latest version of suro is current.
suro Support
Best in #Architecture
Average in #Architecture
suro Support
Best in #Architecture
Average in #Architecture

quality kandi Quality

  • suro has 0 bugs and 0 code smells.
suro Quality
Best in #Architecture
Average in #Architecture
suro Quality
Best in #Architecture
Average in #Architecture

securitySecurity

  • suro has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
  • suro code analysis shows 0 unresolved vulnerabilities.
  • There are 0 security hotspots that need review.
suro Security
Best in #Architecture
Average in #Architecture
suro Security
Best in #Architecture
Average in #Architecture

license License

  • suro is licensed under the Apache-2.0 License. This license is Permissive.
  • Permissive licenses have the least restrictions, and you can use them in most projects.
suro License
Best in #Architecture
Average in #Architecture
suro License
Best in #Architecture
Average in #Architecture

buildReuse

  • suro releases are not available. You will need to build from source code and install.
  • Deployable package is available in Maven.
  • Build file is available. You can build the component from source.
  • Installation instructions, examples and code snippets are available.
  • It has 27407 lines of code, 2192 functions and 274 files.
  • It has medium code complexity. Code complexity directly impacts maintainability of the code.
suro Reuse
Best in #Architecture
Average in #Architecture
suro Reuse
Best in #Architecture
Average in #Architecture
Top functions reviewed by kandi - BETA

kandi has reviewed suro and discovered the below as its top functions. This is intended to give you an instant insight into suro implemented functionality, and help decide if they suit your requirements.

  • The comparison function
    • getter for tokens
      • Creates the runnable from the given message .
        • Creates runnable .
          • Stops the message processor .
            • Poll for messages .
              • Start uploading a file .
                • Sends a message to the producer .
                  • Start the consumer .
                    • Create a runnable poller

                      Get all kandi verified functions for this library.

                      Get all kandi verified functions for this library.

                      suro Key Features

                      It is distributed and can be horizontally scaled.

                      It supports streaming data flow, large number of connections, and high throughput.

                      It allows dynamically dispatching events to different locations with flexible dispatching rules.

                      It has a simple and flexible architecture to allow users to add additional data destinations.

                      It fits well into NetflixOSS ecosystem

                      It is a best-effort data pipeline with support of flexible retries and store-and-forward to minimize message loss

                      Build

                      copy iconCopydownload iconDownload
                      ./gradlew build
                      

                      Running the server

                      copy iconCopydownload iconDownload
                      cd suro-server
                      java -cp "build/install/suro-server/lib/*" com.netflix.suro.SuroServer -m conf/routingmap.json -s conf/sink.json -i conf/input.json
                      

                      react two json object merge and result: empty slots

                      copy iconCopydownload iconDownload
                      const covidResults = [{
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010402",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010384",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008948",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008900",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000131",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000153",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000165",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        }
                      ];
                      
                      const infoResults = [{
                          codcentre: "17010402",
                          name: "Llar d'infants Municipal La Bòbila",
                          address: "av. de Can Caramany, s/n",
                          codi_postal: "17121",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Corçà",
                          long: "3.014146876",
                          lat: "41.98864073"
                        },
                        {
                          codcentre: "17010384",
                          name: "L'Energia-C.aut.ens.art.pro.de Música Palafrugell",
                          address: "Pi i Margall,114/Manufactur.Suro,51-67",
                          codi_postal: "17200",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Palafrugell",
                          long: "3.164713218",
                          lat: "41.921198948"
                        },
                        {
                          codcentre: "17008948",
                          name: "Llar d'infants Els Nins",
                          address: "pl. Onze de Setembre, 1",
                          codi_postal: "17493",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Vilajuïga",
                          long: "3.094177279",
                          lat: "42.327433814"
                        },
                        {
                          codcentre: "17008900",
                          name: "Llar d'infants de Cabanes",
                          address: "c. Colon, 8",
                          codi_postal: "17761",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Cabanes",
                          long: "2.977203057",
                          lat: "42.30876845"
                        },
                        {
                          codcentre: "08000131",
                          name: "La Presentació",
                          address: "c. Pompeu Fabra, 2",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.547075835",
                          lat: "41.585754015"
                        },
                        {
                          codcentre: "08000153",
                          name: "Escola Joan Maragall",
                          address: "c. Riera Sa Clavella, s/n",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.54631495",
                          lat: "41.582404768"
                        },
                        {
                          codcentre: "08000165",
                          name: "Escola Sant Martí",
                          address: "c. Generalitat, 2",
                          codi_postal: "08358",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Munt",
                          long: "2.53853995",
                          lat: "41.609034581"
                        }
                      ];
                      
                      
                      
                      const tempResults = covidResults.map(x => {
                        const y = infoResults.find(y => parseInt(y.codcentre) === parseInt(x.codcentre));
                        return { ...x,
                          ...y
                        };
                      });
                      
                      const output = tempResults.reduce((a, c) => {
                      
                        const item = a.find(x => x.codeRegion === c.codeRegion);
                        if (item) {
                          item.totalSchoolsByRegion++;
                          item.totalCovidRegion += (c.estat === 'Confinat' ? 1 : 0)
                        } else {
                          a.push({
                            codeRegion: c.codeRegion,
                            regionName: c.regionName,
                            totalSchoolsByRegion: 1,
                            totalCovidRegion: c.estat === 'Confinat' ? 1 : 0
                          });
                        }
                      
                        return a;
                      }, []);
                      
                      console.log(output);

                      How to remove images with specific WRS_PATH and WRS_ROW from a landsat 8 surface reflectance collection?

                      copy iconCopydownload iconDownload
                      var geometry = ee.Geometry({"type":"Polygon","coordinates":[[[-98.01249999999999,41.430123208731864],[-98.01249999999999,38.809492348693325],[-92.03593749999999,38.809492348693325],[-92.03593749999999,41.430123208731864]]],"geodesic":false,"evenOdd":true})
                      
                      var sd = '2015-01-01';//Start Date
                      var ed = '2016-01-01';//End   Date
                      
                      var suro = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
                      .filterBounds(geometry)
                      .filterDate(sd,ed)
                      .map(function(image){
                        return image.set({'WRS_PATHROW':{'path':image.get('WRS_PATH'),
                                                'row':image.get('WRS_ROW')}
                      })})
                      .filter(ee.Filter.neq('WRS_PATHROW',  {'path':25, 'row':32}))
                      
                      var filters =  ee.Filter.and(
                        ee.Filter.neq('WRS_PATH',21),
                        ee.Filter.neq('WRS_ROW',32)
                      );
                      
                      var suro = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
                      .filterBounds(geometry)
                      .filterDate(sd,ed)
                      .filter(filters);
                      
                      var geometry = ee.Geometry({"type":"Polygon","coordinates":[[[-98.01249999999999,41.430123208731864],[-98.01249999999999,38.809492348693325],[-92.03593749999999,38.809492348693325],[-92.03593749999999,41.430123208731864]]],"geodesic":false,"evenOdd":true})
                      
                      var sd = '2015-01-01';//Start Date
                      var ed = '2016-01-01';//End   Date
                      
                      var suro = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
                      .filterBounds(geometry)
                      .filterDate(sd,ed)
                      .map(function(image){
                        return image.set({'WRS_PATHROW':{'path':image.get('WRS_PATH'),
                                                'row':image.get('WRS_ROW')}
                      })})
                      .filter(ee.Filter.neq('WRS_PATHROW',  {'path':25, 'row':32}))
                      
                      var filters =  ee.Filter.and(
                        ee.Filter.neq('WRS_PATH',21),
                        ee.Filter.neq('WRS_ROW',32)
                      );
                      
                      var suro = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
                      .filterBounds(geometry)
                      .filterDate(sd,ed)
                      .filter(filters);
                      

                      Community Discussions

                      Trending Discussions on suro
                      • react two json object merge and result: empty slots
                      • How to remove images with specific WRS_PATH and WRS_ROW from a landsat 8 surface reflectance collection?
                      Trending Discussions on suro

                      QUESTION

                      react two json object merge and result: empty slots

                      Asked 2020-Nov-09 at 16:57

                      I have 2 json objects (covidResults and infoResults) and I want to merge them if codcentre are the same in both objects. I want to get the result like this (finalResults), where: totalSchoolsByRegion: is the total of schools in concatResults and totalCovidRegion: are the number of schools in each region that their condition estat==='Confinat'

                      finalResults = {
                      {codeRegion: "01", regionName: "Baix Empordà", totalSchoolsByRegion: 2, totalCovidRegion: 0},
                      {codeRegion: "02", regionName: "Alt Empordà", totalSchoolsByRegion: 2, totalCovidRegion: 1},
                      {codeRegion: "03", regionName: "Alta Ribagorça", totalSchoolsByRegion: 3, totalCovidRegion: 2},
                      

                      But in newObjectResults i have empty slots, and I can get all the information, because I have undefined results

                      MY CODE

                      const covidResults = [
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010402",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010384",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008948",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008900",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000131",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000153",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        { datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000165",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        }
                      ];
                      
                      const infoResults = [
                        { codcentre: "17010402",
                          name: "Llar d'infants Municipal La Bòbila",
                          address: "av. de Can Caramany, s/n",
                          codi_postal: "17121",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Corçà",
                          long: "3.014146876",
                          lat: "41.98864073"
                        },
                        { codcentre: "17010384",
                          name: "L'Energia-C.aut.ens.art.pro.de Música Palafrugell",
                          address: "Pi i Margall,114/Manufactur.Suro,51-67",
                          codi_postal: "17200",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Palafrugell",
                          long: "3.164713218",
                          lat: "41.921198948"
                        },
                        { codcentre: "17008948",
                          name: "Llar d'infants Els Nins",
                          address: "pl. Onze de Setembre, 1",
                          codi_postal: "17493",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Vilajuïga",
                          long: "3.094177279",
                          lat: "42.327433814"
                        },
                        { codcentre: "17008900",
                          name: "Llar d'infants de Cabanes",
                          address: "c. Colon, 8",
                          codi_postal: "17761",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Cabanes",
                          long: "2.977203057",
                          lat: "42.30876845"
                        },
                        { codcentre: "08000131",
                          name: "La Presentació",
                          address: "c. Pompeu Fabra, 2",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.547075835",
                          lat: "41.585754015"
                        },
                        { codcentre: "08000153",
                          name: "Escola Joan Maragall",
                          address: "c. Riera Sa Clavella, s/n",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.54631495",
                          lat: "41.582404768"
                        },
                        {
                          codcentre: "08000165",
                          name: "Escola Sant Martí",
                          address: "c. Generalitat, 2",
                          codi_postal: "08358",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Munt",
                          long: "2.53853995",
                          lat: "41.609034581"
                        }
                      ];
                      let concatResults = [];
                          covidResults.forEach(function (item) {
                            return infoResults.map(school => {
                              if (infoResults !== undefined && school.codcentre === item.codcentre) {
                                concatResults.push({
                                  estat: item.estat,
                                  codecentre: item.codcentre,
                                  regionName: school.regionName,
                                  codeRegion: school.codeRegion,
                                  name: school.name
                                });
                              }
                            });
                          });
                      
                          let newObjectResults = [];
                          concatResults.forEach(item => {
                            if (!newObjectResults.hasOwnProperty(item.codeRegion)) {
                              newObjectResults[item.codeRegion] = {
                                codeRegion: item.codeRegion,
                                regionName: item.regionName,
                                schools: []
                              };
                            }
                            newObjectResults[item.codeRegion].schools.push({
                              codecentre: item.codecentre,
                              estat: item.estat
                            });
                          });
                      console.log("newObjectResults", newObjectResults);
                      
                          let finalResults = [];
                          let totalCovidRegion = 0;
                          newObjectResults.map(item => {
                            if (item !== undefined) {
                              finalResults.push({
                                codeRegion: item.codeRegion,
                                regionName: item.regionName,
                                totalSchoolsByRegion: item.schools.length,
                                totalCovidRegion
                              });
                              item.schools.map(it => {
                                if (it.estat === "Confinat") {
                                  totalCovidRegion += 1;
                                }
                              });
                            }
                          });
                      
                          console.log("finalResults", finalResults);
                      

                      ANSWER

                      Answered 2020-Nov-09 at 16:57

                      You dont have to use loops to do this and your undefined is cause by unmatching codcentre which starts with 0 so i did a parseInt before comparing.

                      You can do a map and reduce which would give you the expected results like below.

                      const covidResults = [{
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010402",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17010384",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008948",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "17008900",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000131",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000153",
                          estat: "Obert",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        },
                        {
                          datageneracio: "2020-09-23T00:00:00.000",
                          codcentre: "8000165",
                          estat: "Confinat",
                          grup_confin: "0",
                          alumn_confin: "0",
                          docent_confin: "0",
                          altres_confin: "0"
                        }
                      ];
                      
                      const infoResults = [{
                          codcentre: "17010402",
                          name: "Llar d'infants Municipal La Bòbila",
                          address: "av. de Can Caramany, s/n",
                          codi_postal: "17121",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Corçà",
                          long: "3.014146876",
                          lat: "41.98864073"
                        },
                        {
                          codcentre: "17010384",
                          name: "L'Energia-C.aut.ens.art.pro.de Música Palafrugell",
                          address: "Pi i Margall,114/Manufactur.Suro,51-67",
                          codi_postal: "17200",
                          regionName: "Baix Empordà",
                          codeRegion: "10",
                          city: "Palafrugell",
                          long: "3.164713218",
                          lat: "41.921198948"
                        },
                        {
                          codcentre: "17008948",
                          name: "Llar d'infants Els Nins",
                          address: "pl. Onze de Setembre, 1",
                          codi_postal: "17493",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Vilajuïga",
                          long: "3.094177279",
                          lat: "42.327433814"
                        },
                        {
                          codcentre: "17008900",
                          name: "Llar d'infants de Cabanes",
                          address: "c. Colon, 8",
                          codi_postal: "17761",
                          regionName: "Alt Empordà",
                          codeRegion: "02",
                          city: "Cabanes",
                          long: "2.977203057",
                          lat: "42.30876845"
                        },
                        {
                          codcentre: "08000131",
                          name: "La Presentació",
                          address: "c. Pompeu Fabra, 2",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.547075835",
                          lat: "41.585754015"
                        },
                        {
                          codcentre: "08000153",
                          name: "Escola Joan Maragall",
                          address: "c. Riera Sa Clavella, s/n",
                          codi_postal: "08350",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Mar",
                          long: "2.54631495",
                          lat: "41.582404768"
                        },
                        {
                          codcentre: "08000165",
                          name: "Escola Sant Martí",
                          address: "c. Generalitat, 2",
                          codi_postal: "08358",
                          regionName: "Maresme",
                          codeRegion: "21",
                          city: "Arenys de Munt",
                          long: "2.53853995",
                          lat: "41.609034581"
                        }
                      ];
                      
                      
                      
                      const tempResults = covidResults.map(x => {
                        const y = infoResults.find(y => parseInt(y.codcentre) === parseInt(x.codcentre));
                        return { ...x,
                          ...y
                        };
                      });
                      
                      const output = tempResults.reduce((a, c) => {
                      
                        const item = a.find(x => x.codeRegion === c.codeRegion);
                        if (item) {
                          item.totalSchoolsByRegion++;
                          item.totalCovidRegion += (c.estat === 'Confinat' ? 1 : 0)
                        } else {
                          a.push({
                            codeRegion: c.codeRegion,
                            regionName: c.regionName,
                            totalSchoolsByRegion: 1,
                            totalCovidRegion: c.estat === 'Confinat' ? 1 : 0
                          });
                        }
                      
                        return a;
                      }, []);
                      
                      console.log(output);

                      Source https://stackoverflow.com/questions/64754753

                      Community Discussions, Code Snippets contain sources that include Stack Exchange Network

                      Vulnerabilities

                      No vulnerabilities reported

                      Install suro

                      NetflixGraph is built via Gradle (www.gradle.org). To build from the command line:. See the build.gradle file for other gradle targets, like distTar, distZip, installApp, and runServer.

                      Support

                      We will use the Google Group, Suro Users, to discuss issues: https://groups.google.com/forum/#!forum/suro-users.

                      DOWNLOAD this Library from

                      Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
                      over 430 million Knowledge Items
                      Find more libraries
                      Reuse Solution Kits and Libraries Curated by Popular Use Cases
                      Explore Kits

                      Save this library and start creating your kit

                      Explore Related Topics

                      Share this Page

                      share link
                      Consider Popular Architecture Libraries
                      Try Top Libraries by Netflix
                      Compare Architecture Libraries with Highest Support
                      Compare Architecture Libraries with Highest Quality
                      Compare Architecture Libraries with Highest Security
                      Compare Architecture Libraries with Permissive License
                      Compare Architecture Libraries with Highest Reuse
                      Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
                      over 430 million Knowledge Items
                      Find more libraries
                      Reuse Solution Kits and Libraries Curated by Popular Use Cases
                      Explore Kits

                      Save this library and start creating your kit

                      • © 2022 Open Weaver Inc.