├── src ├── css │ ├── products.css │ ├── title.css │ ├── Authenticate.css │ ├── mainBar.css │ ├── connectWallet.css │ ├── distributors.css │ ├── distributorform.css │ ├── sidebar.css │ └── home.css ├── setupTests.js ├── App.test.js ├── components │ ├── Title.js │ ├── MainBar.js │ ├── VendorForm.css │ ├── Dashboard.js │ ├── Distributors.js │ ├── TrackProducts.js │ ├── Home.js │ ├── SideBar.js │ ├── getStarted.js │ ├── Authenticate.js │ ├── DistributorForm.js │ └── VendorForm.js ├── index.css ├── reportWebVitals.js ├── index.js ├── logo.svg ├── App.css ├── App.js └── utils │ └── AssetTracker.json ├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── assets │ └── images │ │ ├── qr-code.png │ │ ├── distributor.png │ │ ├── light-theme.png │ │ ├── manufacturer.png │ │ └── qr-code-scan.png ├── manifest.json └── index.html ├── .gitignore ├── package.json └── README.md /src/css/products.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/css/title.css: -------------------------------------------------------------------------------- 1 | .title { 2 | color: #551a8a; 3 | text-align: center; 4 | } 5 | -------------------------------------------------------------------------------- /src/css/Authenticate.css: -------------------------------------------------------------------------------- 1 | .cam { 2 | display: flex; 3 | justify-content: center; 4 | } 5 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/logo512.png -------------------------------------------------------------------------------- /public/assets/images/qr-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/qr-code.png -------------------------------------------------------------------------------- /public/assets/images/distributor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/distributor.png -------------------------------------------------------------------------------- /public/assets/images/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/light-theme.png -------------------------------------------------------------------------------- /public/assets/images/manufacturer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/manufacturer.png -------------------------------------------------------------------------------- /public/assets/images/qr-code-scan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohit-raje-786/Fake-product-identification/HEAD/public/assets/images/qr-code-scan.png -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /src/components/Title.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "../css/title.css"; 3 | 4 | function Title(props) { 5 | return ( 6 |
7 |

{props.title}

8 |
9 | ); 10 | } 11 | 12 | export default Title; 13 | -------------------------------------------------------------------------------- /src/css/mainBar.css: -------------------------------------------------------------------------------- 1 | #box-container { 2 | margin: 0px; 3 | width: 75%; 4 | height: 93vh; 5 | background-color: var(--light-bg); 6 | border-radius: 40px; 7 | padding: 1rem 6rem; 8 | box-sizing: border-box; 9 | overflow-y: scroll; 10 | } 11 | 12 | #page-title { 13 | color: var(--lightPrimaryColor); 14 | margin: 2.5rem 0px; 15 | font-size: 3rem; 16 | } 17 | -------------------------------------------------------------------------------- /src/components/MainBar.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "../css/mainBar.css"; 3 | 4 | const MainBar = ({ pageTitle, children }) => { 5 | return ( 6 |
7 |
8 |

{pageTitle}

9 |
10 | {children} 11 |
12 | ); 13 | }; 14 | 15 | export default MainBar; 16 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | .env.staging 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /src/components/VendorForm.css: -------------------------------------------------------------------------------- 1 | .VendorInfo { 2 | width: 80%; 3 | height: 30px; 4 | margin-bottom: 2px; 5 | } 6 | tr { 7 | height: 90px; 8 | } 9 | .cell-input { 10 | height: 40px; 11 | text-align: center; 12 | } 13 | .label { 14 | margin: 10px; 15 | } 16 | .info-container { 17 | display: flex; 18 | flex-direction: column; 19 | } 20 | .getAssetById { 21 | display: flex; 22 | } 23 | .btn { 24 | cursor: pointer; 25 | width: "140px"; 26 | height: "50px"; 27 | } 28 | -------------------------------------------------------------------------------- /src/css/connectWallet.css: -------------------------------------------------------------------------------- 1 | .connectWalletBtn { 2 | text-decoration: none; 3 | /* border: 3px solid FEF8F8; */ 4 | color: #551a8a; 5 | padding: 10px 60px; 6 | font-size: 28px; 7 | font-family: sans-serif; 8 | letter-spacing: 5px; 9 | transition: all 0.5s; 10 | position: relative; 11 | cursor: pointer; 12 | background-color: white; 13 | border-radius: 20px; 14 | } 15 | .connectWalletContainer { 16 | display: flex; 17 | justify-content: center; 18 | } 19 | .img { 20 | height: 30px; 21 | } 22 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | import reportWebVitals from "./reportWebVitals"; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById("root") 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/css/distributors.css: -------------------------------------------------------------------------------- 1 | .styled-table { 2 | border-collapse: collapse; 3 | /* margin: 25px; */ 4 | font-size: 0.9em; 5 | font-family: sans-serif; 6 | min-width: 600px; 7 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); 8 | margin: 0px auto; 9 | } 10 | .styled-table thead tr { 11 | background-color: #551a8b; 12 | color: #ffffff; 13 | text-align: left; 14 | height: 50px; 15 | } 16 | .styled-table th, 17 | .styled-table td { 18 | padding: 12px 15px; 19 | } 20 | .styled-table tbody tr { 21 | border-bottom: 1px solid #dddddd; 22 | } 23 | 24 | .styled-table tbody tr:last-of-type { 25 | border-bottom: 2px solid #551a8a; 26 | } 27 | .styled-table tbody tr.active-row { 28 | font-weight: bold; 29 | color: #551a8a; 30 | } 31 | -------------------------------------------------------------------------------- /src/components/Dashboard.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Outlet, useLocation } from "react-router-dom"; 3 | import SideBar from "./SideBar"; 4 | import MainBar from "./MainBar"; 5 | import "../css/products.css"; 6 | 7 | const Greetings = () => { 8 | return ( 9 | //
10 | 11 | {/*

*/} 12 |

13 | Navigate to profile to view all your registered details 14 |

15 |

16 | Navigate to Track Products to track status of all of your products added 17 | to our system 18 |

19 |

20 | Navigate to Add Products to publish a new product to our system 21 |

22 |
23 | //
24 | ); 25 | }; 26 | 27 | const Dashboard = () => { 28 | const { pathname } = useLocation(); 29 | const arrURL = pathname.split("/"); 30 | let currentPageURL = arrURL[2]; 31 | let isLinkPage; 32 | if (arrURL.length >= 3) { 33 | isLinkPage = arrURL[2] === ""; 34 | } else { 35 | isLinkPage = true; 36 | } 37 | 38 | return ( 39 |
40 | ;{isLinkPage && } 41 | 42 |
43 | ); 44 | }; 45 | 46 | export default Dashboard; 47 | -------------------------------------------------------------------------------- /src/components/Distributors.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import "../css/distributors.css"; 3 | import Title from "./Title"; 4 | import MainBar from "./MainBar"; 5 | import { useNavigate } from "react-router-dom"; 6 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 7 | 8 | function Distributors({ contract, account }) { 9 | const navigate = useNavigate(); 10 | const [distributors, setDistributors] = useState([]); 11 | 12 | const getDistributor = async () => { 13 | try { 14 | const di = await contract.getAlldistributors(); 15 | console.log(di); 16 | 17 | setDistributors(di); 18 | } catch (e) { 19 | console.log(e); 20 | } 21 | }; 22 | 23 | useEffect(() => { 24 | getDistributor(); 25 | }, []); 26 | 27 | return ( 28 | distributors && ( 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {distributors.map((d, i) => ( 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | ))} 50 | 51 |
idNameAddressEmailPhone
{i}{d.name}{d.add}{d.email}{d.phone}
52 |
53 | ) 54 | ); 55 | } 56 | 57 | export default Distributors; 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asset-tracker", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@fortawesome/fontawesome-svg-core": "^6.1.1", 7 | "@fortawesome/free-solid-svg-icons": "^6.1.1", 8 | "@fortawesome/react-fontawesome": "^0.1.18", 9 | "@testing-library/jest-dom": "^5.16.2", 10 | "@testing-library/react": "^12.1.2", 11 | "@testing-library/user-event": "^13.5.0", 12 | "axios": "^0.26.1", 13 | "env-cmd": "^10.1.0", 14 | "ethers": "^5.5.4", 15 | "qrcode.react": "^1.0.1", 16 | "react": "^17.0.2", 17 | "react-dom": "^17.0.2", 18 | "react-form": "^4.0.1", 19 | "react-modal": "^3.14.4", 20 | "react-qr-reader": "^3.0.0-beta-1", 21 | "react-router-link": "^2.0.2", 22 | "react-scripts": "5.0.0", 23 | "react-table": "^7.7.0", 24 | "styled-components": "^5.3.3", 25 | "web-vitals": "^2.1.4" 26 | }, 27 | "scripts": { 28 | "start": "react-scripts start", 29 | "build:staging": "env-cmd -f .env.staging react-scripts build", 30 | "build:production": "env-cmd -f .env.production react-scripts build", 31 | "test": "react-scripts test", 32 | "eject": "react-scripts eject" 33 | }, 34 | "eslintConfig": { 35 | "extends": [ 36 | "react-app", 37 | "react-app/jest" 38 | ] 39 | }, 40 | "browserslist": { 41 | "production": [ 42 | ">0.2%", 43 | "not dead", 44 | "not op_mini all" 45 | ], 46 | "development": [ 47 | "last 1 chrome version", 48 | "last 1 firefox version", 49 | "last 1 safari version" 50 | ] 51 | }, 52 | "devDependencies": { 53 | "react-router-dom": "^6.3.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/components/TrackProducts.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import Title from "./Title"; 3 | import MainBar from "./MainBar"; 4 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 5 | import { useNavigate } from "react-router-dom"; 6 | 7 | function TrackProducts({ contract, account }) { 8 | const navigate = useNavigate(); 9 | const [assets, setAssets] = useState([]); 10 | 11 | const getAssets = async () => { 12 | try { 13 | let a = await contract.getAllAssets(); 14 | setAssets(a); 15 | } catch (e) { 16 | console.log(e); 17 | } 18 | }; 19 | 20 | useEffect(() => { 21 | getAssets(); 22 | }, []); 23 | return ( 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | {assets.map((d, i) => ( 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | ))} 58 | 59 |
Distributor IdNameDescriptionCostQuantityVendorConsumerAddress FromAddress ToIntializedArrived
{d[10].toString()}{d[0]}{d[1]}{d[2].toString()}{d[3].toString()}{d[4].toString()}{d[5].toString()}{d[6].toString()}{d[7].toString()}{d[8].toString()}{d[9].toString()}
60 |
61 | ); 62 | } 63 | 64 | export default TrackProducts; 65 | -------------------------------------------------------------------------------- /src/css/distributorform.css: -------------------------------------------------------------------------------- 1 | body { 2 | min-height: 100vh; 3 | width: 100vw; 4 | } 5 | 6 | .form { 7 | height: auto; 8 | width: 600px; 9 | /* background-image: linear-gradient( 10 | to bottom right, 11 | rgba(255, 255, 255, 0.3) 0%, 12 | rgba(255, 255, 255, 0.1) 100% 13 | ); */ 14 | background-color: #F7FAFF; 15 | position: absolute; 16 | transform: translate(-50%, -50%); 17 | top: 50%; 18 | left: 50%; 19 | border-radius: 10px; 20 | backdrop-filter: blur(6px); 21 | 22 | border-top: 1px solid rgba(255, 255, 255, 0.5); 23 | border-left: 1px solid rgba(255, 255, 255, 0.5); 24 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset, 25 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px; 26 | padding: 35px; 27 | font-size: large; 28 | font-weight: 900; 29 | } 30 | .form * { 31 | font-family: "Poppins", sans-serif; 32 | 33 | letter-spacing: 0.5px; 34 | outline: none; 35 | border: none; 36 | } 37 | .form h2 { 38 | font-size: 32px; 39 | font-weight: 900; 40 | line-height: 42px; 41 | text-align: center; 42 | } 43 | 44 | .form-title{ 45 | color: var(--primaryColor); 46 | } 47 | 48 | .lable { 49 | display: block; 50 | /* margin-top: 1rem; */ 51 | /* font-size: 16px; */ 52 | font-weight: 500; 53 | font-size: 2.5rem; 54 | margin: 1rem 0px; 55 | color: #42427d; 56 | opacity: 0.9; 57 | /* color: brown; */ 58 | } 59 | .input { 60 | display: block; 61 | height: 50px; 62 | width: 100%; 63 | background-color: rgba(255, 255, 255, 0.1); 64 | border: 0.75px solid #000000; 65 | border-radius: 3px; 66 | padding: 0 10px; 67 | margin-top: 9px; 68 | font-size: 14px; 69 | font-weight: 300; 70 | } 71 | 72 | .button { 73 | display: block; 74 | width: 50%; 75 | background-image: linear-gradient( 76 | -45deg, 77 | rgba(9, 28, 60, 1) 0%, 78 | rgba(67, 46, 103, 1) 100% 79 | ); 80 | color: white; 81 | padding: 15px 0; 82 | text-decoration: none; 83 | font-weight: 900; 84 | text-transform: uppercase; 85 | font-size: 14px; 86 | letter-spacing: 0.2em; 87 | border-radius: 5px; 88 | cursor: pointer; 89 | margin: 0px auto; 90 | margin-top: 3rem; 91 | 92 | } 93 | -------------------------------------------------------------------------------- /src/components/Home.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "../css/home.css"; 3 | import { NavLink } from "react-router-dom"; 4 | 5 | const Home = ({ account }) => { 6 | return ( 7 |
8 |
9 |

10 | Wallet Address: 11 | {account.substring(0, 4) + 12 | "..." + 13 | account.substring(account.length - 4, account.length)} 14 |

15 |
16 |
17 |

Welcome to Asset Tracker!

18 |

19 | A Blockchain Based Fake Product Detection 🕵️‍♀️ 20 |

21 |
22 | 23 |
24 | manufacturer 29 |

Manufacturer Login

30 |
31 |
32 | 33 |
34 | manufacturer 39 |

Distributor Login

40 |
41 |
42 | 43 |
44 | manufacturer 49 |

Authenticate Product

50 |
51 |
52 |
53 |
54 |
55 |
56 | ); 57 | }; 58 | 59 | export default Home; 60 | -------------------------------------------------------------------------------- /src/css/sidebar.css: -------------------------------------------------------------------------------- 1 | /* .dashboard-container { 2 | min-height: 100vh; 3 | width: 100vw; 4 | } 5 | #sidebar-container { 6 | width: 90%; 7 | position: absolute; 8 | top: 20%; 9 | } 10 | 11 | #menu-item-container { 12 | width: 100%; 13 | display: flex; 14 | margin-left: 5%; 15 | justify-content: center; 16 | flex-direction: row; 17 | align-items: center; 18 | } 19 | 20 | .menu-item { 21 | margin-right: 100px; 22 | background-image: linear-gradient( 23 | to bottom right, 24 | rgba(255, 255, 255, 0.3) 0%, 25 | rgba(255, 255, 255, 0.1) 100% 26 | ); 27 | backdrop-filter: blur(6px); 28 | border-radius: 12px; 29 | 30 | border-top: 1px solid rgba(255, 255, 255, 0.5); 31 | border-left: 1px solid rgba(255, 255, 255, 0.5); 32 | 33 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset, 34 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px; 35 | position: relative; 36 | width: 90%; 37 | 38 | margin: 10px; 39 | height: 400px; 40 | display: flex; 41 | 42 | /* box-sizing: border-box; */ 43 | /* } */ 44 | 45 | /* .menu-link { 46 | text-decoration: none; 47 | display: flex; 48 | align-items: center; 49 | padding: 2rem; 50 | } 51 | 52 | .active-menu { 53 | background-color: var(--light-bg); 54 | border-radius: 20px 0px 0px 20px; 55 | } 56 | 57 | .menu-icon, 58 | .menu-title { 59 | font-size: 2rem; 60 | margin: 0px 1.5rem; 61 | color: "#ffafcc"; 62 | } */ 63 | 64 | #sidebar-container { 65 | width: 25%; 66 | /* width: 350px; */ 67 | /* justify-content: flex-end; */ 68 | } 69 | 70 | #menu-item-container { 71 | width: 100%; 72 | display: flex; 73 | height: 75vh; 74 | justify-content: center; 75 | flex-direction: column; 76 | align-items: flex-end; 77 | } 78 | 79 | .menu-item { 80 | width: 80%; 81 | 82 | /* box-sizing: border-box; */ 83 | } 84 | 85 | .menu-link{ 86 | text-decoration: none; 87 | display: flex; 88 | align-items: center; 89 | padding: 2rem; 90 | } 91 | 92 | .active-menu { 93 | background-color: var(--light-bg); 94 | border-radius: 20px 0px 0px 20px; 95 | } 96 | 97 | .menu-icon, 98 | .menu-title { 99 | font-size: 2rem; 100 | margin: 0px 1.5rem; 101 | color: var(--primaryColor); 102 | } 103 | 104 | -------------------------------------------------------------------------------- /src/components/SideBar.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import { NavLink, Outlet } from "react-router-dom"; 3 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 4 | import "../css/sidebar.css"; 5 | import Title from "./Title"; 6 | import { useNavigate } from "react-router-dom"; 7 | 8 | const MenuItem = ({ iconName, title, isActive, url }) => { 9 | let menuClass = "menu-item"; 10 | if (isActive) { 11 | menuClass += " active-menu"; 12 | } 13 | return ( 14 |
15 | 16 | 17 | 18 |

{title}

19 |
20 |
21 | ); 22 | }; 23 | 24 | const SideBar = ({ contract, account, activeLink }) => { 25 | const navigate = useNavigate(); 26 | return ( 27 | 28 | 65 | 66 | ); 67 | }; 68 | 69 | export default SideBar; 70 | -------------------------------------------------------------------------------- /src/components/getStarted.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import { Outlet, useLocation } from "react-router-dom"; 3 | import SideBar from "./SideBar"; 4 | import MainBar from "./MainBar"; 5 | import "../css/products.css"; 6 | 7 | const Greetings = () => { 8 | return ( 9 | //
10 | 11 | {/*

*/} 12 |

13 | Navigate to profile to view all your registered details 14 |

15 |

16 | Navigate to Track Products to track status of all of your products added 17 | to our system 18 |

19 |

20 | Navigate to Add Products to publish a new product to our system 21 |

22 |
23 | //
24 | ); 25 | }; 26 | 27 | const GetStarted = ({ contract, account }) => { 28 | console.log("get started", account); 29 | const [show, setShow] = useState(false); 30 | const { pathname } = useLocation(); 31 | 32 | console.log(account); 33 | 34 | const checkAccount = () => { 35 | setShow(account === process.env.REACT_APP_WALLET_ADD); 36 | }; 37 | 38 | useEffect(() => { 39 | checkAccount(); 40 | }, []); 41 | 42 | if (!show) { 43 | return ( 44 |
45 |
46 |

OOPs 🙊 your company is not registerd

47 |

48 | Please do register your company to avail our services 49 |

50 |
51 | Proceed to the Home Page 52 |
53 |
54 | ); 55 | } 56 | const arrURL = pathname.split("/"); 57 | let currentPageURL = arrURL[2]; 58 | let isLinkPage; 59 | if (arrURL.length >= 3) { 60 | isLinkPage = arrURL[2] === ""; 61 | } else { 62 | isLinkPage = true; 63 | } 64 | 65 | return ( 66 |
67 | 72 | {isLinkPage && } 73 | 74 |
75 | ); 76 | }; 77 | 78 | export default GetStarted; 79 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 25 | 29 | 30 | 37 | 46 | React App 47 | 48 | 49 | 50 |
51 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/components/Authenticate.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import { QrReader } from "react-qr-reader"; 3 | import axios from "axios"; 4 | 5 | import "../css/Authenticate.css"; 6 | const Authenticate = ({ account }) => { 7 | const [auth, setAuth] = useState(false); 8 | const [message, setMessage] = useState(""); 9 | return ( 10 | <> 11 |
12 |

13 | Wallet Address:{" "} 14 | {account.substring(0, 4) + 15 | "..." + 16 | account.substring(account.length - 4, account.length)} 17 |

18 |
19 |

20 | Hold QR Code Steady and Clear to Scan 21 |

22 | { 24 | if (!!result && !!result?.text) { 25 | let data = JSON.parse(result?.text); 26 | if (data.hash) { 27 | let res = await axios.get( 28 | `https://api-rinkeby.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash=${data.hash}&apikey=${process.env.REACT_APP_ETHERSCAN_API_KEY}` 29 | ); 30 | if (res) { 31 | setMessage("Product is Authenticated ✅"); 32 | setAuth(true); 33 | } 34 | } 35 | } 36 | if (!!error) { 37 | console.info(error); 38 | } 39 | }} 40 | style={{ width: "100%" }} 41 | /> 42 |
52 |
53 |

{message}

54 |
55 |
56 |
57 |

58 | Please wait for 15 sec if Authentication messages is not appearing 59 | on the screen then your product is not Authenticated. 60 |

61 |
62 | Please reload the page to Scan again. 63 |
64 |
65 | 66 | ); 67 | }; 68 | 69 | export default Authenticate; 70 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Serif:wght@300&family=Shadows+Into+Light&display=swap"); 2 | 3 | :root { 4 | --primaryColor: #42427d; 5 | --lightPrimaryColor: #5840bb; 6 | --secondaryColor:#7979B2; 7 | --light-bg: #e5eff7; 8 | } 9 | 10 | 11 | html { 12 | font-size: 10px; 13 | } 14 | 15 | ::-webkit-scrollbar { 16 | width: 0; /* Remove scrollbar space */ 17 | background: transparent; /* Optional: just make scrollbar invisible */ 18 | } 19 | 20 | * { 21 | padding: 0; 22 | margin: 0; 23 | box-sizing: border-box; 24 | font-family: "IBM Plex Serif", serif !important; 25 | } 26 | body { 27 | background-image: url("../public/assets/images/light-theme.png"); 28 | background-position: center; 29 | background-size: cover; 30 | } 31 | 32 | .connectWalletContainer { 33 | height: 300px; 34 | width: 400px; 35 | background-image: linear-gradient( 36 | to bottom right, 37 | rgba(255, 255, 255, 0.3) 0%, 38 | rgba(255, 255, 255, 0.1) 100% 39 | ); 40 | position: absolute; 41 | transform: translate(-50%, -50%); 42 | top: 50%; 43 | left: 50%; 44 | border-radius: 10px; 45 | backdrop-filter: blur(6px); 46 | 47 | border-top: 1px solid rgba(255, 255, 255, 0.5); 48 | border-left: 1px solid rgba(255, 255, 255, 0.5); 49 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset, 50 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px; 51 | padding: 50px 35px; 52 | font-size: large; 53 | font-weight: 900; 54 | } 55 | .img { 56 | height: 30px; 57 | } 58 | .connectWalletBtn { 59 | text-decoration: none; 60 | /* border: 3px solid FEF8F8; */ 61 | color: #551a8a; 62 | padding: 10px 60px; 63 | font-size: 28px; 64 | font-family: sans-serif; 65 | letter-spacing: 5px; 66 | transition: all 0.5s; 67 | position: relative; 68 | cursor: pointer; 69 | background: none; 70 | border-radius: 20px; 71 | } 72 | 73 | 74 | .main-container{ 75 | width: 100%; 76 | /* height: 97vh; */ 77 | padding: 2.5rem; 78 | display: flex; 79 | box-sizing: border-box; 80 | } 81 | 82 | .primary-txt{ 83 | font-size: 2.5rem; 84 | color: var(--lightPrimaryColor); 85 | } 86 | 87 | .secondary-txt{ 88 | font-size: 2rem; 89 | color: var(--secondaryColor); 90 | } 91 | 92 | .nav-link-btn{ 93 | text-decoration: none; 94 | display: flex; 95 | align-items: center; 96 | } 97 | 98 | 99 | .primary-btn{ 100 | min-width: 100px; 101 | background-color: var(--lightPrimaryColor); 102 | color: white; 103 | padding: 1rem 2rem; 104 | /* border-radius: 25px; */ 105 | border: none; 106 | box-shadow: 4px 0px 20px rgba(0, 0, 0, 0.15); 107 | border-radius: 15px 5px; 108 | cursor: pointer; 109 | } 110 | 111 | .two-div-flex{ 112 | display: flex; 113 | justify-content: space-between; 114 | align-items: center; 115 | flex-wrap: wrap; 116 | padding-right: 3rem; 117 | } 118 | 119 | .wallet-addr-txt{ 120 | font-size: 1.5rem; 121 | color: var(--lightPrimaryColor); 122 | 123 | } -------------------------------------------------------------------------------- /src/css/home.css: -------------------------------------------------------------------------------- 1 | /* 2 | initiall css for home page 3 | .container { 4 | min-height: 100vh; 5 | width: 100vw; 6 | } 7 | 8 | .bg { 9 | position: fixed; 10 | top: 50%; 11 | left: 50%; 12 | 13 | display: flex; 14 | align-items: center; 15 | 16 | transform: translate(-50%, -50%); 17 | } 18 | 19 | .panel { 20 | margin-right: 100px; 21 | background-image: linear-gradient( 22 | to bottom right, 23 | rgba(255, 255, 255, 0.3) 0%, 24 | rgba(255, 255, 255, 0.1) 100% 25 | ); 26 | backdrop-filter: blur(6px); 27 | border-radius: 12px; 28 | width: 320px; 29 | border-top: 1px solid rgba(255, 255, 255, 0.5); 30 | border-left: 1px solid rgba(255, 255, 255, 0.5); 31 | padding: 60px; 32 | box-shadow: rgba(255, 255, 255, 0.5) -20px -20px 45px inset, 33 | rgba(0, 0, 0, 0.1) 10px 10px 20px, rgba(0, 0, 0, 0.06) 5px 5px 10px; 34 | position: relative; 35 | } 36 | 37 | h2 { 38 | font-size: 2em; 39 | font-weight: 1000; 40 | margin-top: 0; 41 | } 42 | 43 | .card__text { 44 | font-size: 14px; 45 | line-height: 1.45; 46 | opacity: 0.8; 47 | margin-bottom: 2em; 48 | } 49 | 50 | .button { 51 | display: inline-block; 52 | padding: 1.5em 3em; 53 | background-image: linear-gradient( 54 | -45deg, 55 | rgba(9, 28, 60, 1) 0%, 56 | rgba(67, 46, 103, 1) 100% 57 | ); 58 | text-decoration: none; 59 | font-weight: 900; 60 | text-transform: uppercase; 61 | font-size: 14px; 62 | letter-spacing: 0.2em; 63 | border-radius: 10em; 64 | color: white; 65 | } 66 | 67 | */ 68 | 69 | #login-type-container { 70 | height: 100vh; 71 | width: 100%; 72 | display: flex; 73 | justify-content: center; 74 | align-items: center; 75 | } 76 | 77 | #login-type { 78 | width: 80%; 79 | min-width:800px; 80 | max-width: 1200px; 81 | /* min-width: 600px; */ 82 | color: var(--lightPrimaryColor); 83 | font-family: "Courgette", cursive; 84 | text-align: center; 85 | 86 | } 87 | 88 | #greetings { 89 | font-size: 6.5rem; 90 | margin-bottom: 0.5rem; 91 | } 92 | #subtitle-txt { 93 | font-size: 3rem; 94 | margin-bottom: 5rem; 95 | } 96 | 97 | #options-container { 98 | display: flex; 99 | justify-content: space-around; 100 | } 101 | 102 | @media (max-width: 800px) { 103 | #login-type-container { 104 | height: auto; 105 | width: 100%; 106 | } 107 | #login-type { 108 | width: 100%; 109 | padding: 30px; 110 | min-width: 0px; 111 | } 112 | #options-container { 113 | display: flex; 114 | flex-direction: column; 115 | } 116 | 117 | .options { 118 | margin: 10px 5px; 119 | } 120 | } 121 | 122 | .options-image { 123 | width: 240px; 124 | height: 240px; 125 | display: block; 126 | margin: 0px auto; 127 | } 128 | 129 | .options-image-caption { 130 | margin-top: 24px; 131 | color: var(--primaryColor); 132 | font-family: "Inter", sans-serif; 133 | font-size: 3rem; 134 | text-align: center; 135 | } 136 | 137 | .select-link{ 138 | text-decoration: none; 139 | } 140 | 141 | @media (min-width:800px) and (max-width: 1000px) { 142 | .options-image { 143 | width: 160px; 144 | height: 160px; 145 | display: block; 146 | margin: 0px auto; 147 | } 148 | } -------------------------------------------------------------------------------- /src/components/DistributorForm.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 3 | import { useNavigate } from "react-router-dom"; 4 | import "../css/distributorform.css"; 5 | import Title from "./Title"; 6 | import Modal from "react-modal"; 7 | 8 | const DistributorForm = ({ contract, account }) => { 9 | const customStyle = { 10 | content: { 11 | top: "40%", 12 | left: "50%", 13 | right: "auto", 14 | bottom: "auto", 15 | marginRight: "-50%", 16 | transform: "translate(-50%, -50%)", 17 | width: "600px", 18 | height: "250px", 19 | borderRadius: "20px", 20 | }, 21 | }; 22 | const navigate = useNavigate(); 23 | 24 | const [state, setState] = useState({ 25 | name: "", 26 | address: "", 27 | email: "", 28 | phone: "", 29 | }); 30 | const [modalIsOpen, setIsOpen] = React.useState(false); 31 | const [message, setMessage] = useState("Register"); 32 | const closeModal = () => { 33 | setIsOpen(false); 34 | }; 35 | 36 | const handler = (e) => { 37 | e.preventDefault(); 38 | const val = e.target.value; 39 | setState({ ...state, [e.target.name]: val }); 40 | console.log(e.target.value); 41 | }; 42 | 43 | const Submit = async (e) => { 44 | e.preventDefault(); 45 | if (!state.name || !state.address || !state.email || !state.phone) { 46 | setMessage("Please fill all the fields"); 47 | } else { 48 | setMessage("Registering..."); 49 | try { 50 | let createDistributor = await contract.insertDistributor( 51 | state.name, 52 | state.address, 53 | state.email, 54 | state.phone 55 | ); 56 | await createDistributor.wait(); 57 | console.log(createDistributor.hash); 58 | setMessage("Register"); 59 | setIsOpen(true); 60 | } catch (e) { 61 | setMessage("Distributor Already Exits"); 62 | console.log(e); 63 | } 64 | } 65 | }; 66 | 67 | return ( 68 |
69 | 75 |
76 |

Your have successfully Registerated.. 🚀

77 |

You will get a mail if vendor assigns you a dispatch order

78 |
79 | Proceed to the Home Page 80 |
81 | 82 | 92 | 93 | 94 |
95 |
96 | navigate(-1)} 101 | /> 102 |

103 | Wallet Address: 104 | {account.substring(0, 4) + 105 | "..." + 106 | account.substring(account.length - 4, account.length)} 107 |

108 |
109 |
110 |
111 | 112 |
113 |
114 |

Register Here

115 |
116 | 117 | 118 | 126 |
127 | 128 | 136 |
137 | 138 | 139 | 147 |
148 | 149 | 157 |
158 | 159 | 162 |
163 |
164 |
165 | ); 166 | }; 167 | 168 | export default DistributorForm; 169 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | 3 | import React, { useEffect, useState } from "react"; 4 | 5 | import VendorForm from "./components/VendorForm"; 6 | import { ethers } from "ethers"; 7 | import { BrowserRouter, Routes, Route } from "react-router-dom"; 8 | import DistributorForm from "./components/DistributorForm"; 9 | import Home from "./components/Home"; 10 | import AssetTracker from "./utils/AssetTracker.json"; 11 | 12 | import { library } from "@fortawesome/fontawesome-svg-core"; 13 | import { fas } from "@fortawesome/free-solid-svg-icons"; 14 | import Products from "./components/TrackProducts"; 15 | import Distributors from "./components/Distributors"; 16 | 17 | import SideBar from "./components/SideBar"; 18 | 19 | import Authenticate from "./components/Authenticate"; 20 | import GetStarted from "./components/getStarted"; 21 | 22 | const CONTRACT_ADDRESS = process.env.REACT_APP_CONTRACT_ADD; 23 | 24 | library.add(fas); 25 | 26 | const App = () => { 27 | console.log(process.env.REACT_APP_WALLET_ADD); 28 | const [currentAccount, setCurrentAccount] = useState(""); 29 | const [wallet, setWallet] = useState("Please Connect Your Wallet to Proceed"); 30 | const [contract, setContract] = useState(null); 31 | 32 | const checkIfWalletIsConnected = async () => { 33 | const { ethereum } = window; 34 | 35 | if (!ethereum) { 36 | console.log("Make sure you have metamask!"); 37 | return; 38 | } else { 39 | console.log("We have the ethereum object", ethereum); 40 | } 41 | 42 | const accounts = await ethereum.request({ method: "eth_accounts" }); 43 | 44 | if (accounts.length !== 0) { 45 | const account = accounts[0]; 46 | 47 | console.log("Found an authorized account:", account); 48 | setWallet("Connected"); 49 | 50 | setCurrentAccount(account); 51 | 52 | const provider = new ethers.providers.Web3Provider(ethereum); 53 | const signer = provider.getSigner(); 54 | const contract = new ethers.Contract( 55 | CONTRACT_ADDRESS, 56 | AssetTracker.abi, 57 | signer 58 | ); 59 | console.log("contract", contract); 60 | setContract(contract); 61 | } else { 62 | console.log("No authorized account found"); 63 | } 64 | }; 65 | 66 | const connectWallet = async () => { 67 | try { 68 | const { ethereum } = window; 69 | 70 | if (!ethereum) { 71 | alert("Get MetaMask!"); 72 | return; 73 | } 74 | 75 | const accounts = await ethereum.request({ 76 | method: "eth_requestAccounts", 77 | }); 78 | 79 | console.log("Connected", accounts[0]); 80 | 81 | setWallet("Connected"); 82 | 83 | setCurrentAccount(accounts[0]); 84 | const provider = new ethers.providers.Web3Provider(ethereum); 85 | const signer = provider.getSigner(); 86 | const contract = new ethers.Contract( 87 | CONTRACT_ADDRESS, 88 | AssetTracker.abi, 89 | signer 90 | ); 91 | setContract(contract); 92 | } catch (error) { 93 | console.log(error); 94 | } 95 | }; 96 | 97 | useEffect(() => { 98 | checkIfWalletIsConnected(); 99 | }, []); 100 | 101 | return ( 102 | <> 103 | {contract ? ( 104 | 105 | 106 | }> 107 | {/* } 110 | > */} 111 | 115 | } 116 | > 117 | 121 | } 122 | > 123 | 127 | } 128 | /> 129 | 133 | } 134 | /> 135 | 136 | 140 | } 141 | > 142 | {/* 146 | } 147 | > 148 | 152 | } 153 | /> 154 | 158 | } 159 | /> */} 160 | 164 | } 165 | /> 166 | 167 | 168 | ) : ( 169 |
170 |
171 |
172 | {wallet == "Please Connect Your Wallet to Proceed" && ( 173 | 182 | )} 183 |
184 |
185 |
186 | )} 187 | 188 | ); 189 | }; 190 | 191 | export default App; 192 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About Fake Product Identification 🕵️‍♀️ 2 | An app which will help to detect whether the product is authenticated or not using blockchain. 3 | 4 | ## The App has two panel : 5 | * ### Manufacturer 6 | * ### Distributor 7 | 8 | *Manufacturer* has the right to create the asset and based upon the unique hash returned after the transaction unique Qrcode is genereted which contains 9 | asset details and the unique hash of the asset. 10 | 11 | *Distributor* just need to register himself on the platform,no further functionalities is provided to the distributor,after the manufacturer create the asset he/she assign the registered distributor along with it,then selected distributor recieves the mail regarding the same to deliver the order. 12 | 13 | ## Then how will the distributor or the consumer can check wether the product is authenticate or not 🤔? 14 | Simply by proceeding to the authentication page where the *Distributor* or *Consumer* can scan the Qrcode pasted on the product and check for the authenticity of the product. 15 | 16 | # Work Flow 17 | Screenshot 2022-05-02 at 12 07 42 AM 18 | 19 | 20 | # But why Blockchain? 21 | After going through multiple methodologies and techniques used in the market to ensure authenticity of a product . We came up with a decentralized solution to authenticate the products whether they are real or fake.One of the reasons behind opting for a decentralized system is that it is immutable, so there are no chances of tampering the data and they are public, so there is nothing like secrecy. As it will provide complete transparency to the users, manufactures,vendors and others. 22 | 23 | ### Demo Video 24 | https://www.loom.com/share/12e29a7cd8264662b218602e7e28c235 25 | 26 | ### Screenshots 27 | 28 | #### Home Page 29 | Screenshot 2022-05-01 at 11 55 04 PM 30 | 31 | #### Manufacturer/TrackProduct 32 | Screenshot 2022-05-01 at 11 55 23 PM 33 | 34 | #### Manufacturer/AddProduct 35 | Screenshot 2022-05-01 at 11 55 35 PM 36 | 37 | #### Manufacturer/Available Distributors 38 | Screenshot 2022-05-01 at 11 55 49 PM 39 | 40 | #### Distributor Registeration 41 | Screenshot 2022-05-01 at 11 56 02 PM 42 | 43 | 44 | #### Authentication Page 45 | Screenshot 2022-05-01 at 11 56 16 PM 46 | 47 | 48 | ### Backend Code 49 | https://github.com/rohit-raje-786/Fake-prodcut-identification-smart-contract 50 | 51 | # Getting Started with Create React App 52 | 53 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 54 | 55 | ## Available Scripts 56 | 57 | In the project directory, you can run: 58 | 59 | ### `npm start` 60 | 61 | Runs the app in the development mode.\ 62 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 63 | 64 | The page will reload when you make changes.\ 65 | You may also see any lint errors in the console. 66 | 67 | ### `npm test` 68 | 69 | Launches the test runner in the interactive watch mode.\ 70 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 71 | 72 | ### `npm run build` 73 | 74 | Builds the app for production to the `build` folder.\ 75 | It correctly bundles React in production mode and optimizes the build for the best performance. 76 | 77 | The build is minified and the filenames include the hashes.\ 78 | Your app is ready to be deployed! 79 | 80 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 81 | 82 | ### `npm run eject` 83 | 84 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 85 | 86 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 87 | 88 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 89 | 90 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 91 | 92 | ## Learn More 93 | 94 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 95 | 96 | To learn React, check out the [React documentation](https://reactjs.org/). 97 | 98 | ### Code Splitting 99 | 100 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 101 | 102 | ### Analyzing the Bundle Size 103 | 104 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 105 | 106 | ### Making a Progressive Web App 107 | 108 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 109 | 110 | ### Advanced Configuration 111 | 112 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 113 | 114 | ### Deployment 115 | 116 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 117 | 118 | ### `npm run build` fails to minify 119 | 120 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 121 | 122 | -------------------------------------------------------------------------------- /src/components/VendorForm.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import ReactDOM from "react-dom"; 3 | import styled, { createGlobalStyle } from "styled-components"; 4 | import { useForm, useField, splitFormProps } from "react-form"; 5 | import { useTable } from "react-table"; 6 | import QRCode from "qrcode.react"; 7 | import Modal from "react-modal"; 8 | import "./VendorForm.css"; 9 | import axios from "axios"; 10 | import { useNavigate } from "react-router-dom"; 11 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 12 | import Title from "./Title"; 13 | import MainBar from "./MainBar"; 14 | 15 | const TableInput = (props) => { 16 | console.log("TableInput", props); 17 | const { column, row, cell, updateData } = props; 18 | const onChange = (e) => updateData(row.index, column.id, e.target.value); 19 | return ( 20 | 26 | ); 27 | }; 28 | 29 | const ItemName = (props) => { 30 | console.log("ItemName", props); 31 | const { column, row, cell, updateData } = props; 32 | const onChange = (e) => updateData(row.index, column.id, e.target.value); 33 | return ( 34 | 40 | ); 41 | }; 42 | 43 | const StyledTable = styled.table` 44 | width: 100%; 45 | border-collapse: collapse; 46 | th, 47 | td { 48 | width: 25%; 49 | text-align: center; 50 | border: 1px solid lightgray; 51 | padding: 5px; 52 | } 53 | `; 54 | const ReactTable = React.memo((props) => { 55 | console.log("ReactTable", props); 56 | const { setAmountDue } = props; 57 | const columns = React.useMemo( 58 | () => [ 59 | { 60 | Header: "Item", 61 | accessor: "item", 62 | Cell: ItemName, 63 | }, 64 | { 65 | Header: "Item Description", 66 | accessor: "description", 67 | Cell: ItemName, 68 | }, 69 | { 70 | Header: "Cost (INR)", 71 | accessor: "cost", 72 | Cell: TableInput, 73 | }, 74 | { 75 | Header: "Quantity", 76 | accessor: "quantity", 77 | Cell: TableInput, 78 | }, 79 | { 80 | Header: "Total (INR)", 81 | accessor: (row) => row.cost * row.quantity, 82 | id: "total", 83 | }, 84 | ], 85 | [] 86 | ); 87 | const initialData = [ 88 | { 89 | item: "Vaccine", 90 | description: "Medicine", 91 | cost: 1, 92 | quantity: 2, 93 | }, 94 | ]; 95 | const [data, setData] = React.useState(initialData); 96 | const resetData = () => setData(initialData); 97 | 98 | const updateData = (rowIndex, columnID, value) => { 99 | setData((oldData) => 100 | oldData.map((row, index) => { 101 | if (index === rowIndex) { 102 | return { 103 | ...oldData[rowIndex], 104 | [columnID]: value, 105 | }; 106 | } 107 | return row; 108 | }) 109 | ); 110 | }; 111 | const table = useTable({ columns, data, updateData }); 112 | const { getTableProps, headerGroups, rows, prepareRow } = table; 113 | const tableSum = rows.reduce((sum, row) => sum + row.values.total, 0); 114 | console.log("setAmountDue", tableSum); 115 | setAmountDue(tableSum); 116 | 117 | const [modalIsOpen, setIsOpen] = React.useState(false); 118 | const [qrcode, setQrcode] = React.useState(null); 119 | const [hash, setHash] = React.useState(null); 120 | const [assetMessage, setAssetMessage] = React.useState("Create"); 121 | const [assetModalIsOpen, setAssetModalIsOpen] = React.useState(false); 122 | const [assetDetails, setAssetDetails] = React.useState([]); 123 | 124 | const closeModal = () => { 125 | setQrcode(null); 126 | setIsOpen(false); 127 | }; 128 | 129 | const assetcloseModal = () => { 130 | setAssetModalIsOpen(false); 131 | }; 132 | 133 | const customStyles = { 134 | content: { 135 | top: "50%", 136 | left: "50%", 137 | right: "auto", 138 | bottom: "auto", 139 | marginRight: "-50%", 140 | transform: "translate(-50%, -50%)", 141 | width: "600px", 142 | height: "580px", 143 | borderRadius: "20px", 144 | backgroundClip: "text", 145 | }, 146 | }; 147 | const assetModalStyles = { 148 | content: { 149 | top: "50%", 150 | left: "50%", 151 | right: "auto", 152 | bottom: "auto", 153 | marginRight: "-50%", 154 | transform: "translate(-50%, -50%)", 155 | width: "600px", 156 | height: "400px", 157 | borderRadius: "20px", 158 | backgroundClip: "text", 159 | }, 160 | }; 161 | 162 | return ( 163 | <> 164 | 171 |
172 | 173 |
174 | 175 | 185 | 186 | 187 |
188 | 195 |
196 |

Name:{assetDetails[0]}

197 |

Description:{assetDetails[1]}

198 |

Quantity:{assetDetails[8]}

199 |

Cost:{assetDetails[7]}

200 |

Manufacturer:{assetDetails[2]}

201 |

Consumer:{assetDetails[3]}

202 |

AddressFrom:{assetDetails[4]}

203 |

AddressTo:{assetDetails[5]}

204 |
205 | 206 | 216 | 217 | 218 |
219 | 220 |
221 | 222 | 223 | {headerGroups.map((headerGroup) => ( 224 | 225 | {headerGroup.headers.map((column) => ( 226 | {column.render("Header")} 227 | ))} 228 | 229 | ))} 230 | 231 | 232 | {rows.map((row) => { 233 | prepareRow(row); 234 | return ( 235 | 236 | {row.cells.map((cell) => ( 237 | {cell.render("Cell")} 238 | ))} 239 | 240 | ); 241 | })} 242 | 243 | 244 | 247 | 248 |
249 | 354 | 355 | 356 |
357 | 358 | ); 359 | }); 360 | 361 | const FormStyles = styled.div` 362 | form { 363 | margin: 10px; 364 | label { 365 | display: flex; 366 | justify-content: space-between; 367 | align-items: center; 368 | } 369 | aside { 370 | display: flex; 371 | justify-content: space-between; 372 | } 373 | section { 374 | flex: 1 1 auto; 375 | display: flex; 376 | flex-flow: column nowrap; 377 | } 378 | button { 379 | margin: 5px; 380 | padding: 5px; 381 | width: 100px; 382 | align-self: flex-end; 383 | } 384 | } 385 | `; 386 | const AmountDue = styled.label` 387 | margin: 10px; 388 | font-size: 1.5em; 389 | align-self: flex-end; 390 | `; 391 | const PaymentQRCode = styled(QRCode)` 392 | padding: 5px; 393 | align-self: flex-end; 394 | `; 395 | 396 | const ReactForm = (props) => { 397 | console.log("ReactForm", props); 398 | const navigate = useNavigate(); 399 | const { amountDue, setAmountDue, distributors } = props; 400 | const defaultValues = React.useMemo( 401 | () => ({ 402 | name: "Rohit", 403 | dashAddress: "Kalyan", 404 | dashAddressto: "Gujrat", 405 | notes: "Payment terms: Net 30", 406 | }), 407 | [] 408 | ); 409 | const onSubmit = async (values, instance) => { 410 | console.log("Form values:", values); 411 | instance.reset(); 412 | }; 413 | const form = useForm({ defaultValues, onSubmit }); 414 | const { Form, values, meta } = form; 415 | 416 | const [vendorName, setVendorName] = React.useState(""); 417 | const [vendorAdd, setVendorAdd] = React.useState(""); 418 | const [consumerAdd, setConsumerAdd] = React.useState(""); 419 | const [consumerName, setConsumerName] = React.useState(""); 420 | const [distributorId, setDistributorId] = React.useState(0); 421 | return ( 422 | <> 423 | {/* navigate(-1)} 428 | /> */} 429 | 430 | 431 |
432 | 501 | 510 |
511 | 512 |
513 | 514 | ); 515 | }; 516 | 517 | const Main = styled.main` 518 | border-radius: 5px; 519 | padding: 10px; 520 | background: white; 521 | height: 100vh; 522 | h2 { 523 | text-align: center; 524 | } 525 | `; 526 | const Invoice = (props) => { 527 | console.log("Invoice", props); 528 | const [amountDue, setAmountDue] = React.useState(0); 529 | 530 | return ( 531 |
532 | 539 |
540 | ); 541 | }; 542 | 543 | const App = (props) => { 544 | const [distributors, setDistributors] = useState([]); 545 | const getDistributors = async () => { 546 | let dis = await props.contract.getAlldistributors(); 547 | setDistributors(dis); 548 | }; 549 | useEffect(() => { 550 | getDistributors(); 551 | }, []); 552 | return ( 553 |
554 | 559 |
560 | ); 561 | }; 562 | export default App; 563 | -------------------------------------------------------------------------------- /src/utils/AssetTracker.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "AssetTracker", 4 | "sourceName": "contracts/AssetTracker.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": false, 11 | "internalType": "string", 12 | "name": "name", 13 | "type": "string" 14 | }, 15 | { 16 | "indexed": false, 17 | "internalType": "string", 18 | "name": "add", 19 | "type": "string" 20 | }, 21 | { 22 | "indexed": false, 23 | "internalType": "string", 24 | "name": "email", 25 | "type": "string" 26 | }, 27 | { 28 | "indexed": false, 29 | "internalType": "string", 30 | "name": "phone", 31 | "type": "string" 32 | } 33 | ], 34 | "name": "RejectDistributor", 35 | "type": "event" 36 | }, 37 | { 38 | "inputs": [ 39 | { 40 | "internalType": "uint256", 41 | "name": "i", 42 | "type": "uint256" 43 | } 44 | ], 45 | "name": "Arrived", 46 | "outputs": [], 47 | "stateMutability": "nonpayable", 48 | "type": "function" 49 | }, 50 | { 51 | "inputs": [], 52 | "name": "assetCount", 53 | "outputs": [ 54 | { 55 | "internalType": "uint256", 56 | "name": "", 57 | "type": "uint256" 58 | } 59 | ], 60 | "stateMutability": "view", 61 | "type": "function" 62 | }, 63 | { 64 | "inputs": [ 65 | { 66 | "internalType": "uint256", 67 | "name": "_amount", 68 | "type": "uint256" 69 | } 70 | ], 71 | "name": "balance", 72 | "outputs": [ 73 | { 74 | "internalType": "bool", 75 | "name": "", 76 | "type": "bool" 77 | } 78 | ], 79 | "stateMutability": "pure", 80 | "type": "function" 81 | }, 82 | { 83 | "inputs": [ 84 | { 85 | "internalType": "string", 86 | "name": "name", 87 | "type": "string" 88 | }, 89 | { 90 | "internalType": "string", 91 | "name": "description", 92 | "type": "string" 93 | }, 94 | { 95 | "internalType": "uint256", 96 | "name": "distributorId", 97 | "type": "uint256" 98 | }, 99 | { 100 | "internalType": "uint256", 101 | "name": "cost", 102 | "type": "uint256" 103 | }, 104 | { 105 | "internalType": "uint256", 106 | "name": "quantity", 107 | "type": "uint256" 108 | }, 109 | { 110 | "internalType": "string", 111 | "name": "manufacturer", 112 | "type": "string" 113 | }, 114 | { 115 | "internalType": "string", 116 | "name": "customer", 117 | "type": "string" 118 | }, 119 | { 120 | "internalType": "string", 121 | "name": "addressFrom", 122 | "type": "string" 123 | }, 124 | { 125 | "internalType": "string", 126 | "name": "addressTo", 127 | "type": "string" 128 | } 129 | ], 130 | "name": "createAsset", 131 | "outputs": [], 132 | "stateMutability": "nonpayable", 133 | "type": "function" 134 | }, 135 | { 136 | "inputs": [], 137 | "name": "distributorCount", 138 | "outputs": [ 139 | { 140 | "internalType": "uint256", 141 | "name": "", 142 | "type": "uint256" 143 | } 144 | ], 145 | "stateMutability": "view", 146 | "type": "function" 147 | }, 148 | { 149 | "inputs": [], 150 | "name": "getAllAssets", 151 | "outputs": [ 152 | { 153 | "components": [ 154 | { 155 | "internalType": "string", 156 | "name": "name", 157 | "type": "string" 158 | }, 159 | { 160 | "internalType": "string", 161 | "name": "description", 162 | "type": "string" 163 | }, 164 | { 165 | "internalType": "uint256", 166 | "name": "cost", 167 | "type": "uint256" 168 | }, 169 | { 170 | "internalType": "uint256", 171 | "name": "quantity", 172 | "type": "uint256" 173 | }, 174 | { 175 | "internalType": "string", 176 | "name": "manufacturer", 177 | "type": "string" 178 | }, 179 | { 180 | "internalType": "string", 181 | "name": "customer", 182 | "type": "string" 183 | }, 184 | { 185 | "internalType": "string", 186 | "name": "addressFrom", 187 | "type": "string" 188 | }, 189 | { 190 | "internalType": "string", 191 | "name": "addressTo", 192 | "type": "string" 193 | }, 194 | { 195 | "internalType": "bool", 196 | "name": "initialized", 197 | "type": "bool" 198 | }, 199 | { 200 | "internalType": "bool", 201 | "name": "arrived", 202 | "type": "bool" 203 | }, 204 | { 205 | "internalType": "uint256", 206 | "name": "distributorId", 207 | "type": "uint256" 208 | } 209 | ], 210 | "internalType": "struct AssetTracker.Asset[]", 211 | "name": "", 212 | "type": "tuple[]" 213 | } 214 | ], 215 | "stateMutability": "view", 216 | "type": "function" 217 | }, 218 | { 219 | "inputs": [], 220 | "name": "getAlldistributors", 221 | "outputs": [ 222 | { 223 | "components": [ 224 | { 225 | "internalType": "uint256", 226 | "name": "id", 227 | "type": "uint256" 228 | }, 229 | { 230 | "internalType": "string", 231 | "name": "name", 232 | "type": "string" 233 | }, 234 | { 235 | "internalType": "string", 236 | "name": "add", 237 | "type": "string" 238 | }, 239 | { 240 | "internalType": "string", 241 | "name": "email", 242 | "type": "string" 243 | }, 244 | { 245 | "internalType": "string", 246 | "name": "phone", 247 | "type": "string" 248 | } 249 | ], 250 | "internalType": "struct AssetTracker.Person[]", 251 | "name": "", 252 | "type": "tuple[]" 253 | } 254 | ], 255 | "stateMutability": "view", 256 | "type": "function" 257 | }, 258 | { 259 | "inputs": [ 260 | { 261 | "internalType": "uint256", 262 | "name": "id", 263 | "type": "uint256" 264 | } 265 | ], 266 | "name": "getDistributorbyId", 267 | "outputs": [ 268 | { 269 | "internalType": "string", 270 | "name": "", 271 | "type": "string" 272 | }, 273 | { 274 | "internalType": "string", 275 | "name": "", 276 | "type": "string" 277 | }, 278 | { 279 | "internalType": "string", 280 | "name": "", 281 | "type": "string" 282 | }, 283 | { 284 | "internalType": "string", 285 | "name": "", 286 | "type": "string" 287 | } 288 | ], 289 | "stateMutability": "view", 290 | "type": "function" 291 | }, 292 | { 293 | "inputs": [ 294 | { 295 | "internalType": "uint256", 296 | "name": "i", 297 | "type": "uint256" 298 | } 299 | ], 300 | "name": "getItemByUUID", 301 | "outputs": [ 302 | { 303 | "internalType": "uint256", 304 | "name": "cost", 305 | "type": "uint256" 306 | }, 307 | { 308 | "internalType": "uint256", 309 | "name": "quantity", 310 | "type": "uint256" 311 | } 312 | ], 313 | "stateMutability": "view", 314 | "type": "function" 315 | }, 316 | { 317 | "inputs": [ 318 | { 319 | "internalType": "string", 320 | "name": "name", 321 | "type": "string" 322 | }, 323 | { 324 | "internalType": "string", 325 | "name": "add", 326 | "type": "string" 327 | }, 328 | { 329 | "internalType": "string", 330 | "name": "email", 331 | "type": "string" 332 | }, 333 | { 334 | "internalType": "string", 335 | "name": "phone", 336 | "type": "string" 337 | } 338 | ], 339 | "name": "insertDistributor", 340 | "outputs": [ 341 | { 342 | "internalType": "bool", 343 | "name": "", 344 | "type": "bool" 345 | } 346 | ], 347 | "stateMutability": "nonpayable", 348 | "type": "function" 349 | }, 350 | { 351 | "inputs": [ 352 | { 353 | "internalType": "address", 354 | "name": "owner", 355 | "type": "address" 356 | }, 357 | { 358 | "internalType": "uint256", 359 | "name": "i", 360 | "type": "uint256" 361 | } 362 | ], 363 | "name": "isOwnerOf", 364 | "outputs": [ 365 | { 366 | "internalType": "bool", 367 | "name": "", 368 | "type": "bool" 369 | } 370 | ], 371 | "stateMutability": "view", 372 | "type": "function" 373 | }, 374 | { 375 | "inputs": [ 376 | { 377 | "internalType": "address", 378 | "name": "to", 379 | "type": "address" 380 | }, 381 | { 382 | "internalType": "uint256", 383 | "name": "i", 384 | "type": "uint256" 385 | } 386 | ], 387 | "name": "transferAsset", 388 | "outputs": [], 389 | "stateMutability": "nonpayable", 390 | "type": "function" 391 | } 392 | ], 393 | "bytecode": "0x60806040526000600155600060025534801561001a57600080fd5b506123898061002a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063ba1d899511610071578063ba1d89951461018d578063c5246353146101be578063c5b8f772146101dc578063c9469a4b1461020c578063eafe7a7414610228578063fdd0e4d714610246576100b4565b80631e78717d146100b95780632acada4d146100d55780633ac140e8146100f357806347bb89f0146101115780635c921eb914610141578063752493291461015d575b600080fd5b6100d360048036038101906100ce9190611723565b610279565b005b6100dd610480565b6040516100ea9190611d7c565b60405180910390f35b6100fb610953565b6040516101089190611edc565b60405180910390f35b61012b60048036038101906101269190611879565b610959565b6040516101389190611dc0565b60405180910390f35b61015b60048036038101906101569190611624565b6109a7565b005b61017760048036038101906101729190611660565b610b8d565b6040516101849190611dc0565b60405180910390f35b6101a760048036038101906101a29190611879565b610d36565b6040516101b5929190611ef7565b60405180910390f35b6101c6610db5565b6040516101d39190611d9e565b60405180910390f35b6101f660048036038101906101f19190611624565b611118565b6040516102039190611dc0565b60405180910390f35b61022660048036038101906102219190611879565b611191565b005b6102306111c3565b60405161023d9190611edc565b60405180910390f35b610260600480360381019061025b9190611879565b6111c9565b6040516102709493929190611ddb565b60405180910390f35b6040518061016001604052808a81526020018981526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581526020016000151581526020018881525060036000600254815260200190815260200160002060008201518160000190805190602001906102fc929190611462565b506020820151816001019080519060200190610319929190611462565b506040820151816002015560608201518160030155608082015181600401908051906020019061034a929190611462565b5060a0820151816005019080519060200190610367929190611462565b5060c0820151816006019080519060200190610384929190611462565b5060e08201518160070190805190602001906103a1929190611462565b506101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160080160016101000a81548160ff02191690831515021790555061014082015181600901559050506001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600254815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600081548092919061047090612122565b9190505550505050505050505050565b6060600060025467ffffffffffffffff8111156104c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104ff57816020015b6104ec6114e8565b8152602001906001900390816104e45790505b50905060005b60025481101561094b5760006003600083815260200190815260200160002090508060405180610160016040529081600082018054610543906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461056f906120bf565b80156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081526020016001820180546105d5906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610601906120bf565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461067b906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546106a7906120bf565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050815260200160058201805461070d906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610739906120bf565b80156107865780601f1061075b57610100808354040283529160200191610786565b820191906000526020600020905b81548152906001019060200180831161076957829003601f168201915b5050505050815260200160068201805461079f906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906120bf565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b50505050508152602001600782018054610831906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461085d906120bf565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081526020016008820160009054906101000a900460ff161515151581526020016008820160019054906101000a900460ff1615151515815260200160098201548152505083838151811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061094390612122565b915050610505565b508091505090565b60015481565b60006014821061099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590611e9c565b60405180910390fd5b60019050919050565b6001151560036000600254815260200190815260200160002060080160009054906101000a900460ff16151514610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90611e7c565b60405180910390fd5b60011515600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90611e5c565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600090505b600154811015610c5357604051602001610bae90611d67565b60405160208183030381529060405280519060200120600080838152602001908152602001600020600301604051602001610be99190611d50565b604051602081830303815290604052805190602001201415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790611e3c565b60405180910390fd5b8080610c4b90612122565b915050610b95565b506040518060a001604052806001548152602001868152602001858152602001848152602001838152506000806001548152602001908152602001600020600082015181600001556020820151816001019080519060200190610cb7929190611462565b506040820151816002019080519060200190610cd4929190611462565b506060820151816003019080519060200190610cf1929190611462565b506080820151816004019080519060200190610d0e929190611462565b5090505060016000815480929190610d2590612122565b919050555060019050949350505050565b600080600254831115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590611ebc565b60405180910390fd5b6003600084815260200190815260200160002060020154600360008581526020019081526020016000206003015491509150915091565b6060600060015467ffffffffffffffff811115610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e3457816020015b610e21611546565b815260200190600190039081610e195790505b50905060005b6001548110156111105760008060008381526020019081526020016000209050806040518060a001604052908160008201548152602001600182018054610e80906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac906120bf565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b50505050508152602001600282018054610f12906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3e906120bf565b8015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b50505050508152602001600382018054610fa4906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906120bf565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b50505050508152602001600482018054611036906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611062906120bf565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050815250508383815181106110f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061110890612122565b915050610e3a565b508091505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611186576001905061118b565b600090505b92915050565b60016003600083815260200190815260200160002060080160016101000a81548160ff02191690831515021790555050565b60025481565b60608060608060008086815260200190815260200160002060010160008087815260200190815260200160002060020160008088815260200190815260200160002060030160008089815260200190815260200160002060040183805461122f906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461125b906120bf565b80156112a85780601f1061127d576101008083540402835291602001916112a8565b820191906000526020600020905b81548152906001019060200180831161128b57829003601f168201915b505050505093508280546112bb906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906120bf565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b50505050509250818054611347906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611373906120bf565b80156113c05780601f10611395576101008083540402835291602001916113c0565b820191906000526020600020905b8154815290600101906020018083116113a357829003601f168201915b505050505091508080546113d3906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113ff906120bf565b801561144c5780601f106114215761010080835404028352916020019161144c565b820191906000526020600020905b81548152906001019060200180831161142f57829003601f168201915b5050505050905093509350935093509193509193565b82805461146e906120bf565b90600052602060002090601f01602090048101928261149057600085556114d7565b82601f106114a957805160ff19168380011785556114d7565b828001600101855582156114d7579182015b828111156114d65782518255916020019190600101906114bb565b5b5090506114e49190611575565b5090565b6040518061016001604052806060815260200160608152602001600081526020016000815260200160608152602001606081526020016060815260200160608152602001600015158152602001600015158152602001600081525090565b6040518060a0016040528060008152602001606081526020016060815260200160608152602001606081525090565b5b8082111561158e576000816000905550600101611576565b5090565b60006115a56115a084611f45565b611f20565b9050828152602081018484840111156115bd57600080fd5b6115c884828561207d565b509392505050565b6000813590506115df81612325565b92915050565b600082601f8301126115f657600080fd5b8135611606848260208601611592565b91505092915050565b60008135905061161e8161233c565b92915050565b6000806040838503121561163757600080fd5b6000611645858286016115d0565b92505060206116568582860161160f565b9150509250929050565b6000806000806080858703121561167657600080fd5b600085013567ffffffffffffffff81111561169057600080fd5b61169c878288016115e5565b945050602085013567ffffffffffffffff8111156116b957600080fd5b6116c5878288016115e5565b935050604085013567ffffffffffffffff8111156116e257600080fd5b6116ee878288016115e5565b925050606085013567ffffffffffffffff81111561170b57600080fd5b611717878288016115e5565b91505092959194509250565b60008060008060008060008060006101208a8c03121561174257600080fd5b60008a013567ffffffffffffffff81111561175c57600080fd5b6117688c828d016115e5565b99505060208a013567ffffffffffffffff81111561178557600080fd5b6117918c828d016115e5565b98505060406117a28c828d0161160f565b97505060606117b38c828d0161160f565b96505060806117c48c828d0161160f565b95505060a08a013567ffffffffffffffff8111156117e157600080fd5b6117ed8c828d016115e5565b94505060c08a013567ffffffffffffffff81111561180a57600080fd5b6118168c828d016115e5565b93505060e08a013567ffffffffffffffff81111561183357600080fd5b61183f8c828d016115e5565b9250506101008a013567ffffffffffffffff81111561185d57600080fd5b6118698c828d016115e5565b9150509295985092959850929598565b60006020828403121561188b57600080fd5b60006118998482850161160f565b91505092915050565b60006118ae8383611b95565b905092915050565b60006118c28383611ca7565b905092915050565b60006118d582611fab565b6118df8185611fe6565b9350836020820285016118f185611f76565b8060005b8581101561192d578484038952815161190e85826118a2565b945061191983611fcc565b925060208a019950506001810190506118f5565b50829750879550505050505092915050565b600061194a82611fb6565b6119548185611ff7565b93508360208202850161196685611f86565b8060005b858110156119a2578484038952815161198385826118b6565b945061198e83611fd9565b925060208a0199505060018101905061196a565b50829750879550505050505092915050565b6119bd81612047565b82525050565b6119cc81612047565b82525050565b60006119dd82611fc1565b6119e78185612008565b93506119f781856020860161208c565b611a00816121f8565b840191505092915050565b6000611a1682611fc1565b611a208185612019565b9350611a3081856020860161208c565b611a39816121f8565b840191505092915050565b60008154611a51816120bf565b611a5b818661202a565b94506001821660008114611a765760018114611a8757611aba565b60ff19831686528186019350611aba565b611a9085611f96565b60005b83811015611ab257815481890152600182019150602081019050611a93565b838801955050505b50505092915050565b6000611ad0600d8361202a565b9150611adb82612209565b600d82019050919050565b6000611af3601a83612019565b9150611afe82612232565b602082019050919050565b6000611b16601f83612019565b9150611b218261225b565b602082019050919050565b6000611b39601e83612019565b9150611b4482612284565b602082019050919050565b6000611b5c602283612019565b9150611b67826122ad565b604082019050919050565b6000611b7f601583612019565b9150611b8a826122fc565b602082019050919050565b6000610160830160008301518482036000860152611bb382826119d2565b91505060208301518482036020860152611bcd82826119d2565b9150506040830151611be26040860182611d32565b506060830151611bf56060860182611d32565b5060808301518482036080860152611c0d82826119d2565b91505060a083015184820360a0860152611c2782826119d2565b91505060c083015184820360c0860152611c4182826119d2565b91505060e083015184820360e0860152611c5b82826119d2565b915050610100830151611c726101008601826119b4565b50610120830151611c876101208601826119b4565b50610140830151611c9c610140860182611d32565b508091505092915050565b600060a083016000830151611cbf6000860182611d32565b5060208301518482036020860152611cd782826119d2565b91505060408301518482036040860152611cf182826119d2565b91505060608301518482036060860152611d0b82826119d2565b91505060808301518482036080860152611d2582826119d2565b9150508091505092915050565b611d3b81612073565b82525050565b611d4a81612073565b82525050565b6000611d5c8284611a44565b915081905092915050565b6000611d7282611ac3565b9150819050919050565b60006020820190508181036000830152611d9681846118ca565b905092915050565b60006020820190508181036000830152611db8818461193f565b905092915050565b6000602082019050611dd560008301846119c3565b92915050565b60006080820190508181036000830152611df58187611a0b565b90508181036020830152611e098186611a0b565b90508181036040830152611e1d8185611a0b565b90508181036060830152611e318184611a0b565b905095945050505050565b60006020820190508181036000830152611e5581611ae6565b9050919050565b60006020820190508181036000830152611e7581611b09565b9050919050565b60006020820190508181036000830152611e9581611b2c565b9050919050565b60006020820190508181036000830152611eb581611b4f565b9050919050565b60006020820190508181036000830152611ed581611b72565b9050919050565b6000602082019050611ef16000830184611d41565b92915050565b6000604082019050611f0c6000830185611d41565b611f196020830184611d41565b9392505050565b6000611f2a611f3b565b9050611f3682826120f1565b919050565b6000604051905090565b600067ffffffffffffffff821115611f6057611f5f6121c9565b5b611f69826121f8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061204082612053565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120aa57808201518184015260208101905061208f565b838111156120b9576000848401525b50505050565b600060028204905060018216806120d757607f821691505b602082108114156120eb576120ea61219a565b5b50919050565b6120fa826121f8565b810181811067ffffffffffffffff82111715612119576121186121c9565b5b80604052505050565b600061212d82612073565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121605761215f61216b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f31323340676d61696c2e636f6d00000000000000000000000000000000000000600082015250565b7f4469737472696275746f7220616c726561647920657869737473000000000000600082015250565b7f53656e64657220646f6573206e6f74206f776e20746869732061737365742e00600082015250565b7f4e6f206173736574207769746820746869732055554944206578697374730000600082015250565b7f42616c616e6365206e65656420746f2062652067726561746572207468616e2060008201527f3230000000000000000000000000000000000000000000000000000000000000602082015250565b7f417373657420646f6573206e6f74206578697374730000000000000000000000600082015250565b61232e81612035565b811461233957600080fd5b50565b61234581612073565b811461235057600080fd5b5056fea264697066735822122097566c39a073d71e138d442ea865b8a2c16913eff2e4f0705f2492da15cb47f064736f6c63430008040033", 394 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063ba1d899511610071578063ba1d89951461018d578063c5246353146101be578063c5b8f772146101dc578063c9469a4b1461020c578063eafe7a7414610228578063fdd0e4d714610246576100b4565b80631e78717d146100b95780632acada4d146100d55780633ac140e8146100f357806347bb89f0146101115780635c921eb914610141578063752493291461015d575b600080fd5b6100d360048036038101906100ce9190611723565b610279565b005b6100dd610480565b6040516100ea9190611d7c565b60405180910390f35b6100fb610953565b6040516101089190611edc565b60405180910390f35b61012b60048036038101906101269190611879565b610959565b6040516101389190611dc0565b60405180910390f35b61015b60048036038101906101569190611624565b6109a7565b005b61017760048036038101906101729190611660565b610b8d565b6040516101849190611dc0565b60405180910390f35b6101a760048036038101906101a29190611879565b610d36565b6040516101b5929190611ef7565b60405180910390f35b6101c6610db5565b6040516101d39190611d9e565b60405180910390f35b6101f660048036038101906101f19190611624565b611118565b6040516102039190611dc0565b60405180910390f35b61022660048036038101906102219190611879565b611191565b005b6102306111c3565b60405161023d9190611edc565b60405180910390f35b610260600480360381019061025b9190611879565b6111c9565b6040516102709493929190611ddb565b60405180910390f35b6040518061016001604052808a81526020018981526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581526020016000151581526020018881525060036000600254815260200190815260200160002060008201518160000190805190602001906102fc929190611462565b506020820151816001019080519060200190610319929190611462565b506040820151816002015560608201518160030155608082015181600401908051906020019061034a929190611462565b5060a0820151816005019080519060200190610367929190611462565b5060c0820151816006019080519060200190610384929190611462565b5060e08201518160070190805190602001906103a1929190611462565b506101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160080160016101000a81548160ff02191690831515021790555061014082015181600901559050506001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600254815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600081548092919061047090612122565b9190505550505050505050505050565b6060600060025467ffffffffffffffff8111156104c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156104ff57816020015b6104ec6114e8565b8152602001906001900390816104e45790505b50905060005b60025481101561094b5760006003600083815260200190815260200160002090508060405180610160016040529081600082018054610543906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461056f906120bf565b80156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081526020016001820180546105d5906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610601906120bf565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461067b906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546106a7906120bf565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050815260200160058201805461070d906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610739906120bf565b80156107865780601f1061075b57610100808354040283529160200191610786565b820191906000526020600020905b81548152906001019060200180831161076957829003601f168201915b5050505050815260200160068201805461079f906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cb906120bf565b80156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b50505050508152602001600782018054610831906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461085d906120bf565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b505050505081526020016008820160009054906101000a900460ff161515151581526020016008820160019054906101000a900460ff1615151515815260200160098201548152505083838151811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061094390612122565b915050610505565b508091505090565b60015481565b60006014821061099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590611e9c565b60405180910390fd5b60019050919050565b6001151560036000600254815260200190815260200160002060080160009054906101000a900460ff16151514610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90611e7c565b60405180910390fd5b60011515600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16151514610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90611e5c565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600090505b600154811015610c5357604051602001610bae90611d67565b60405160208183030381529060405280519060200120600080838152602001908152602001600020600301604051602001610be99190611d50565b604051602081830303815290604052805190602001201415610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790611e3c565b60405180910390fd5b8080610c4b90612122565b915050610b95565b506040518060a001604052806001548152602001868152602001858152602001848152602001838152506000806001548152602001908152602001600020600082015181600001556020820151816001019080519060200190610cb7929190611462565b506040820151816002019080519060200190610cd4929190611462565b506060820151816003019080519060200190610cf1929190611462565b506080820151816004019080519060200190610d0e929190611462565b5090505060016000815480929190610d2590612122565b919050555060019050949350505050565b600080600254831115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590611ebc565b60405180910390fd5b6003600084815260200190815260200160002060020154600360008581526020019081526020016000206003015491509150915091565b6060600060015467ffffffffffffffff811115610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e3457816020015b610e21611546565b815260200190600190039081610e195790505b50905060005b6001548110156111105760008060008381526020019081526020016000209050806040518060a001604052908160008201548152602001600182018054610e80906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac906120bf565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b50505050508152602001600282018054610f12906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3e906120bf565b8015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b50505050508152602001600382018054610fa4906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906120bf565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b50505050508152602001600482018054611036906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611062906120bf565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050815250508383815181106110f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525050808061110890612122565b915050610e3a565b508091505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611186576001905061118b565b600090505b92915050565b60016003600083815260200190815260200160002060080160016101000a81548160ff02191690831515021790555050565b60025481565b60608060608060008086815260200190815260200160002060010160008087815260200190815260200160002060020160008088815260200190815260200160002060030160008089815260200190815260200160002060040183805461122f906120bf565b80601f016020809104026020016040519081016040528092919081815260200182805461125b906120bf565b80156112a85780601f1061127d576101008083540402835291602001916112a8565b820191906000526020600020905b81548152906001019060200180831161128b57829003601f168201915b505050505093508280546112bb906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906120bf565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b50505050509250818054611347906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611373906120bf565b80156113c05780601f10611395576101008083540402835291602001916113c0565b820191906000526020600020905b8154815290600101906020018083116113a357829003601f168201915b505050505091508080546113d3906120bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113ff906120bf565b801561144c5780601f106114215761010080835404028352916020019161144c565b820191906000526020600020905b81548152906001019060200180831161142f57829003601f168201915b5050505050905093509350935093509193509193565b82805461146e906120bf565b90600052602060002090601f01602090048101928261149057600085556114d7565b82601f106114a957805160ff19168380011785556114d7565b828001600101855582156114d7579182015b828111156114d65782518255916020019190600101906114bb565b5b5090506114e49190611575565b5090565b6040518061016001604052806060815260200160608152602001600081526020016000815260200160608152602001606081526020016060815260200160608152602001600015158152602001600015158152602001600081525090565b6040518060a0016040528060008152602001606081526020016060815260200160608152602001606081525090565b5b8082111561158e576000816000905550600101611576565b5090565b60006115a56115a084611f45565b611f20565b9050828152602081018484840111156115bd57600080fd5b6115c884828561207d565b509392505050565b6000813590506115df81612325565b92915050565b600082601f8301126115f657600080fd5b8135611606848260208601611592565b91505092915050565b60008135905061161e8161233c565b92915050565b6000806040838503121561163757600080fd5b6000611645858286016115d0565b92505060206116568582860161160f565b9150509250929050565b6000806000806080858703121561167657600080fd5b600085013567ffffffffffffffff81111561169057600080fd5b61169c878288016115e5565b945050602085013567ffffffffffffffff8111156116b957600080fd5b6116c5878288016115e5565b935050604085013567ffffffffffffffff8111156116e257600080fd5b6116ee878288016115e5565b925050606085013567ffffffffffffffff81111561170b57600080fd5b611717878288016115e5565b91505092959194509250565b60008060008060008060008060006101208a8c03121561174257600080fd5b60008a013567ffffffffffffffff81111561175c57600080fd5b6117688c828d016115e5565b99505060208a013567ffffffffffffffff81111561178557600080fd5b6117918c828d016115e5565b98505060406117a28c828d0161160f565b97505060606117b38c828d0161160f565b96505060806117c48c828d0161160f565b95505060a08a013567ffffffffffffffff8111156117e157600080fd5b6117ed8c828d016115e5565b94505060c08a013567ffffffffffffffff81111561180a57600080fd5b6118168c828d016115e5565b93505060e08a013567ffffffffffffffff81111561183357600080fd5b61183f8c828d016115e5565b9250506101008a013567ffffffffffffffff81111561185d57600080fd5b6118698c828d016115e5565b9150509295985092959850929598565b60006020828403121561188b57600080fd5b60006118998482850161160f565b91505092915050565b60006118ae8383611b95565b905092915050565b60006118c28383611ca7565b905092915050565b60006118d582611fab565b6118df8185611fe6565b9350836020820285016118f185611f76565b8060005b8581101561192d578484038952815161190e85826118a2565b945061191983611fcc565b925060208a019950506001810190506118f5565b50829750879550505050505092915050565b600061194a82611fb6565b6119548185611ff7565b93508360208202850161196685611f86565b8060005b858110156119a2578484038952815161198385826118b6565b945061198e83611fd9565b925060208a0199505060018101905061196a565b50829750879550505050505092915050565b6119bd81612047565b82525050565b6119cc81612047565b82525050565b60006119dd82611fc1565b6119e78185612008565b93506119f781856020860161208c565b611a00816121f8565b840191505092915050565b6000611a1682611fc1565b611a208185612019565b9350611a3081856020860161208c565b611a39816121f8565b840191505092915050565b60008154611a51816120bf565b611a5b818661202a565b94506001821660008114611a765760018114611a8757611aba565b60ff19831686528186019350611aba565b611a9085611f96565b60005b83811015611ab257815481890152600182019150602081019050611a93565b838801955050505b50505092915050565b6000611ad0600d8361202a565b9150611adb82612209565b600d82019050919050565b6000611af3601a83612019565b9150611afe82612232565b602082019050919050565b6000611b16601f83612019565b9150611b218261225b565b602082019050919050565b6000611b39601e83612019565b9150611b4482612284565b602082019050919050565b6000611b5c602283612019565b9150611b67826122ad565b604082019050919050565b6000611b7f601583612019565b9150611b8a826122fc565b602082019050919050565b6000610160830160008301518482036000860152611bb382826119d2565b91505060208301518482036020860152611bcd82826119d2565b9150506040830151611be26040860182611d32565b506060830151611bf56060860182611d32565b5060808301518482036080860152611c0d82826119d2565b91505060a083015184820360a0860152611c2782826119d2565b91505060c083015184820360c0860152611c4182826119d2565b91505060e083015184820360e0860152611c5b82826119d2565b915050610100830151611c726101008601826119b4565b50610120830151611c876101208601826119b4565b50610140830151611c9c610140860182611d32565b508091505092915050565b600060a083016000830151611cbf6000860182611d32565b5060208301518482036020860152611cd782826119d2565b91505060408301518482036040860152611cf182826119d2565b91505060608301518482036060860152611d0b82826119d2565b91505060808301518482036080860152611d2582826119d2565b9150508091505092915050565b611d3b81612073565b82525050565b611d4a81612073565b82525050565b6000611d5c8284611a44565b915081905092915050565b6000611d7282611ac3565b9150819050919050565b60006020820190508181036000830152611d9681846118ca565b905092915050565b60006020820190508181036000830152611db8818461193f565b905092915050565b6000602082019050611dd560008301846119c3565b92915050565b60006080820190508181036000830152611df58187611a0b565b90508181036020830152611e098186611a0b565b90508181036040830152611e1d8185611a0b565b90508181036060830152611e318184611a0b565b905095945050505050565b60006020820190508181036000830152611e5581611ae6565b9050919050565b60006020820190508181036000830152611e7581611b09565b9050919050565b60006020820190508181036000830152611e9581611b2c565b9050919050565b60006020820190508181036000830152611eb581611b4f565b9050919050565b60006020820190508181036000830152611ed581611b72565b9050919050565b6000602082019050611ef16000830184611d41565b92915050565b6000604082019050611f0c6000830185611d41565b611f196020830184611d41565b9392505050565b6000611f2a611f3b565b9050611f3682826120f1565b919050565b6000604051905090565b600067ffffffffffffffff821115611f6057611f5f6121c9565b5b611f69826121f8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061204082612053565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120aa57808201518184015260208101905061208f565b838111156120b9576000848401525b50505050565b600060028204905060018216806120d757607f821691505b602082108114156120eb576120ea61219a565b5b50919050565b6120fa826121f8565b810181811067ffffffffffffffff82111715612119576121186121c9565b5b80604052505050565b600061212d82612073565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121605761215f61216b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f31323340676d61696c2e636f6d00000000000000000000000000000000000000600082015250565b7f4469737472696275746f7220616c726561647920657869737473000000000000600082015250565b7f53656e64657220646f6573206e6f74206f776e20746869732061737365742e00600082015250565b7f4e6f206173736574207769746820746869732055554944206578697374730000600082015250565b7f42616c616e6365206e65656420746f2062652067726561746572207468616e2060008201527f3230000000000000000000000000000000000000000000000000000000000000602082015250565b7f417373657420646f6573206e6f74206578697374730000000000000000000000600082015250565b61232e81612035565b811461233957600080fd5b50565b61234581612073565b811461235057600080fd5b5056fea264697066735822122097566c39a073d71e138d442ea865b8a2c16913eff2e4f0705f2492da15cb47f064736f6c63430008040033", 395 | "linkReferences": {}, 396 | "deployedLinkReferences": {} 397 | } 398 | --------------------------------------------------------------------------------