foreman_openscap 4.3.0 → 4.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/foreman_openscap/version.rb +1 -1
  3. data/package.json +48 -0
  4. data/webpack/components/EmptyState.js +67 -0
  5. data/webpack/components/IndexLayout.js +35 -0
  6. data/webpack/components/IndexLayout.scss +3 -0
  7. data/webpack/components/IndexTable/IndexTableHelper.js +9 -0
  8. data/webpack/components/IndexTable/index.js +66 -0
  9. data/webpack/components/RuleSeverity/RuleSeverity.scss +3 -0
  10. data/webpack/components/RuleSeverity/RuleSeverity.test.js +13 -0
  11. data/webpack/components/RuleSeverity/__snapshots__/RuleSeverity.test.js.snap +41 -0
  12. data/webpack/components/RuleSeverity/i_severity-critical.svg +61 -0
  13. data/webpack/components/RuleSeverity/i_severity-high.svg +61 -0
  14. data/webpack/components/RuleSeverity/i_severity-low.svg +62 -0
  15. data/webpack/components/RuleSeverity/i_severity-med.svg +62 -0
  16. data/webpack/components/RuleSeverity/i_unknown.svg +33 -0
  17. data/webpack/components/RuleSeverity/index.js +33 -0
  18. data/webpack/components/withLoading.js +68 -0
  19. data/webpack/global_index.js +5 -0
  20. data/webpack/graphql/queries/cves.gql +18 -0
  21. data/webpack/graphql/queries/ovalContents.gql +11 -0
  22. data/webpack/graphql/queries/ovalPolicies.gql +12 -0
  23. data/webpack/graphql/queries/ovalPolicy.gql +21 -0
  24. data/webpack/helpers/commonHelper.js +1 -0
  25. data/webpack/helpers/globalIdHelper.js +13 -0
  26. data/webpack/helpers/pageParamsHelper.js +31 -0
  27. data/webpack/helpers/pathsHelper.js +22 -0
  28. data/webpack/helpers/tableHelper.js +9 -0
  29. data/webpack/index.js +8 -0
  30. data/webpack/routes/OvalContents/OvalContentsIndex/OvalContentsIndex.js +45 -0
  31. data/webpack/routes/OvalContents/OvalContentsIndex/OvalContentsTable.js +38 -0
  32. data/webpack/routes/OvalContents/OvalContentsIndex/__tests__/OvalContentsIndex.fixtures.js +106 -0
  33. data/webpack/routes/OvalContents/OvalContentsIndex/__tests__/OvalContentsIndex.test.js +75 -0
  34. data/webpack/routes/OvalContents/OvalContentsIndex/index.js +7 -0
  35. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesIndex.js +46 -0
  36. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesTable.js +44 -0
  37. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/__tests__/OvalPoliciesIndex.fixtures.js +61 -0
  38. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/__tests__/OvalPoliciesIndex.test.js +78 -0
  39. data/webpack/routes/OvalPolicies/OvalPoliciesIndex/index.js +7 -0
  40. data/webpack/routes/OvalPolicies/OvalPoliciesShow/CvesTab.js +48 -0
  41. data/webpack/routes/OvalPolicies/OvalPoliciesShow/CvesTable.js +63 -0
  42. data/webpack/routes/OvalPolicies/OvalPoliciesShow/OvalPoliciesShow.js +79 -0
  43. data/webpack/routes/OvalPolicies/OvalPoliciesShow/OvalPoliciesShowHelper.js +39 -0
  44. data/webpack/routes/OvalPolicies/OvalPoliciesShow/__tests__/OvalPoliciesShow.fixtures.js +78 -0
  45. data/webpack/routes/OvalPolicies/OvalPoliciesShow/__tests__/OvalPoliciesShow.test.js +112 -0
  46. data/webpack/routes/OvalPolicies/OvalPoliciesShow/index.js +35 -0
  47. data/webpack/routes/routes.js +28 -0
  48. data/webpack/testHelper.js +64 -0
  49. metadata +48 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0bc31c3bac07804311899dc01dd5dbe0c0500cc8981eefa1ec867316d0465fb8
4
- data.tar.gz: 4b00712959d937f44fa2da29de505704e153277043bf319c84fa0d4a44f8d5ac
3
+ metadata.gz: 279a2b2f763e2b1f7c333a66e812b359f02c67a91626577e6212b4d69f093e08
4
+ data.tar.gz: 4d2116542474424bb0c7918c7c877b626bf725420e3b704794d401a68688b73f
5
5
  SHA512:
6
- metadata.gz: 90f233717d65a7bf4d1793251a27d6f7268e81a93e4dd06b86258e8f6f5b108d0a886fe8ebe455766eccfe10a55076d9b61bd211165620f5d899cd94147d203c
7
- data.tar.gz: b77f05c002ef0fb3fdcc4050974bc5b4390d2af5322aac601ef912172391e0bfb3f391e4166ad94b7e701156e9b84f640dcda03d434323d5e2921e50974f6109
6
+ metadata.gz: ee9601dfb4fc7ea3a6f88ad3ec238824aa30e169e5d74e6177e4d926cf60f5e715fe17faea13c0d2119ae5a28b91ac9b8c4ccb3b6e52228fa66ffb7462b3d388
7
+ data.tar.gz: c04a455c484bd2bc6dfc631626f0f8dc3ef88c727695eaf0af2f8cde5c8c033bf6ce5094f5a14c140fdde006a1769b87095754f1fa9c3f40328161b926daafff
@@ -1,3 +1,3 @@
1
1
  module ForemanOpenscap
2
- VERSION = "4.3.0".freeze
2
+ VERSION = "4.3.1".freeze
3
3
  end
data/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "foreman_openscap",
3
+ "version": "0.1.0",
4
+ "description": "Foreman plug-in for managing security compliance reports",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "lint": "tfm-lint --plugin -d /webpack",
8
+ "test": "tfm-test --plugin --config jest.config.js",
9
+ "test:watch": "tfm-test --plugin --watchAll --config jest.config.js",
10
+ "test:current": "tfm-test --plugin --watch --config jest.config.js",
11
+ "publish-coverage": "tfm-publish-coverage",
12
+ "stories": "tfm-stories --plugin",
13
+ "stories:build": "tfm-build-stories --plugin",
14
+ "create-react-component": "yo react-domain"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/theforeman/foreman_openscap.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://projects.theforeman.org/projects/foreman_openscap/issues"
22
+ },
23
+ "peerDependencies": {
24
+ "@theforeman/vendor": ">= 4.13.2"
25
+ },
26
+ "devDependencies": {
27
+ "@apollo/react-testing": "^4.0.0",
28
+ "@babel/core": "^7.7.0",
29
+ "@testing-library/dom": "^7.30.4",
30
+ "@testing-library/jest-dom": "^5.11.9",
31
+ "@testing-library/react": "^11.2.5",
32
+ "@testing-library/user-event": "^13.1.2",
33
+ "@theforeman/builder": "^8.4.1",
34
+ "@theforeman/eslint-plugin-foreman": "8.4.1",
35
+ "@theforeman/find-foreman": "^8.4.1",
36
+ "@theforeman/stories": "^8.4.1",
37
+ "@theforeman/test": "^8.4.1",
38
+ "@theforeman/vendor-dev": "^8.4.1",
39
+ "babel-eslint": "^10.0.3",
40
+ "eslint": "^6.7.2",
41
+ "jed": "^1.1.1",
42
+ "jest-svg-transformer": "^1.0.0",
43
+ "jest-transform-graphql": "^2.1.0",
44
+ "prettier": "^1.13.5",
45
+ "stylelint": "^9.3.0",
46
+ "stylelint-config-standard": "^18.0.0"
47
+ }
48
+ }
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ import {
3
+ EmptyState as PfEmptyState,
4
+ EmptyStateBody,
5
+ EmptyStateIcon as PfEmptyStateIcon,
6
+ EmptyStateVariant,
7
+ Bullseye,
8
+ Title,
9
+ } from '@patternfly/react-core';
10
+ import PropTypes from 'prop-types';
11
+ import {
12
+ CubeIcon,
13
+ ExclamationCircleIcon,
14
+ SearchIcon,
15
+ } from '@patternfly/react-icons';
16
+ import { global_danger_color_200 as dangerColor } from '@patternfly/react-tokens';
17
+
18
+ const EmptyStateIcon = ({ error, search }) => {
19
+ if (error)
20
+ return (
21
+ <PfEmptyStateIcon
22
+ icon={ExclamationCircleIcon}
23
+ color={dangerColor.value}
24
+ />
25
+ );
26
+ if (search) return <PfEmptyStateIcon icon={SearchIcon} />;
27
+ return <PfEmptyStateIcon icon={CubeIcon} />;
28
+ };
29
+
30
+ const EmptyState = ({ title, body, error, search }) => (
31
+ <Bullseye>
32
+ <PfEmptyState variant={EmptyStateVariant.small}>
33
+ <EmptyStateIcon error={!!error} search={search} />
34
+ <Title headingLevel="h2" size="lg">
35
+ {title}
36
+ </Title>
37
+ <EmptyStateBody>{body}</EmptyStateBody>
38
+ </PfEmptyState>
39
+ </Bullseye>
40
+ );
41
+
42
+ EmptyStateIcon.propTypes = {
43
+ error: PropTypes.bool,
44
+ search: PropTypes.bool,
45
+ };
46
+
47
+ EmptyStateIcon.defaultProps = {
48
+ error: false,
49
+ search: false,
50
+ };
51
+
52
+ EmptyState.propTypes = {
53
+ title: PropTypes.string,
54
+ body: PropTypes.string,
55
+ error: PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string]),
56
+ search: PropTypes.bool,
57
+ };
58
+
59
+ EmptyState.defaultProps = {
60
+ title: 'Unable to fetch data from server',
61
+ body:
62
+ 'There was an error retrieving data from the server. Check your connection and try again.',
63
+ error: undefined,
64
+ search: false,
65
+ };
66
+
67
+ export default EmptyState;
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Helmet } from 'react-helmet';
4
+ import {
5
+ Grid,
6
+ GridItem,
7
+ TextContent,
8
+ Text,
9
+ TextVariants,
10
+ } from '@patternfly/react-core';
11
+
12
+ import './IndexLayout.scss';
13
+
14
+ const IndexLayout = ({ pageTitle, children }) => (
15
+ <React.Fragment>
16
+ <Helmet>
17
+ <title>{pageTitle}</title>
18
+ </Helmet>
19
+ <Grid className="scap-page-grid">
20
+ <GridItem span={12}>
21
+ <TextContent>
22
+ <Text component={TextVariants.h1}>{pageTitle}</Text>
23
+ </TextContent>
24
+ </GridItem>
25
+ <GridItem span={12}>{children}</GridItem>
26
+ </Grid>
27
+ </React.Fragment>
28
+ );
29
+
30
+ IndexLayout.propTypes = {
31
+ pageTitle: PropTypes.string.isRequired,
32
+ children: PropTypes.object.isRequired,
33
+ };
34
+
35
+ export default IndexLayout;
@@ -0,0 +1,3 @@
1
+ .scap-page-grid {
2
+ margin: 1.8rem 1rem;
3
+ }
@@ -0,0 +1,9 @@
1
+ import { addSearch } from '../../helpers/pageParamsHelper';
2
+
3
+ export const preparePerPageOptions = opts =>
4
+ opts.map(item => ({ title: item.toString(), value: item }));
5
+
6
+ export const refreshPage = (history, params = {}) => {
7
+ const url = addSearch(history.location.pathname, params);
8
+ history.push(url);
9
+ };
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Table, TableHeader, TableBody } from '@patternfly/react-table';
4
+ import { Pagination, Flex, FlexItem } from '@patternfly/react-core';
5
+ import '@patternfly/patternfly/patternfly-addons.scss';
6
+ import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
7
+
8
+ import { preparePerPageOptions, refreshPage } from './IndexTableHelper';
9
+
10
+ const IndexTable = props => {
11
+ const handlePerPageSelected = (event, perPage) => {
12
+ refreshPage(props.history, { page: 1, perPage });
13
+ };
14
+
15
+ const handlePageSelected = (event, page) => {
16
+ refreshPage(props.history, { ...props.pagination, page });
17
+ };
18
+
19
+ const perPageOptions = preparePerPageOptions(usePaginationOptions());
20
+
21
+ return (
22
+ <React.Fragment>
23
+ <Flex className="pf-u-pt-md">
24
+ <FlexItem>{props.toolbarBtns}</FlexItem>
25
+ <FlexItem align={{ default: 'alignRight' }}>
26
+ <Pagination
27
+ itemCount={props.totalCount}
28
+ page={props.pagination.page}
29
+ perPage={props.pagination.perPage}
30
+ onSetPage={handlePageSelected}
31
+ onPerPageSelect={handlePerPageSelected}
32
+ perPageOptions={perPageOptions}
33
+ variant="top"
34
+ />
35
+ </FlexItem>
36
+ </Flex>
37
+ <Table
38
+ aria-label={props.ariaTableLabel}
39
+ cells={props.columns}
40
+ rows={props.rows}
41
+ actions={props.actions}
42
+ >
43
+ <TableHeader />
44
+ <TableBody />
45
+ </Table>
46
+ </React.Fragment>
47
+ );
48
+ };
49
+
50
+ IndexTable.propTypes = {
51
+ history: PropTypes.object.isRequired,
52
+ pagination: PropTypes.object.isRequired,
53
+ toolbarBtns: PropTypes.array,
54
+ totalCount: PropTypes.number.isRequired,
55
+ ariaTableLabel: PropTypes.string.isRequired,
56
+ columns: PropTypes.array.isRequired,
57
+ rows: PropTypes.array.isRequired,
58
+ actions: PropTypes.array,
59
+ };
60
+
61
+ IndexTable.defaultProps = {
62
+ toolbarBtns: [],
63
+ actions: [],
64
+ };
65
+
66
+ export default IndexTable;
@@ -0,0 +1,3 @@
1
+ img.severity-img {
2
+ max-height: 56px;
3
+ }
@@ -0,0 +1,13 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+
3
+ import RuleSeverity from './index';
4
+
5
+ const levels = ['Low', 'Medium', 'High', 'Critical', 'foo'];
6
+
7
+ const fixtures = levels.reduce((memo, level) => {
8
+ memo[`should render for ${level} severity`] = { severity: level };
9
+ return memo;
10
+ }, {});
11
+
12
+ describe('RuleSeverity', () =>
13
+ testComponentSnapshotsWithFixtures(RuleSeverity, fixtures));
@@ -0,0 +1,41 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`RuleSeverity should render for Critical severity 1`] = `
4
+ <img
5
+ alt="Unknown Serverity"
6
+ className="severity-img"
7
+ src={[Function]}
8
+ />
9
+ `;
10
+
11
+ exports[`RuleSeverity should render for High severity 1`] = `
12
+ <img
13
+ alt="Unknown Serverity"
14
+ className="severity-img"
15
+ src={[Function]}
16
+ />
17
+ `;
18
+
19
+ exports[`RuleSeverity should render for Low severity 1`] = `
20
+ <img
21
+ alt="Unknown Serverity"
22
+ className="severity-img"
23
+ src={[Function]}
24
+ />
25
+ `;
26
+
27
+ exports[`RuleSeverity should render for Medium severity 1`] = `
28
+ <img
29
+ alt="Unknown Serverity"
30
+ className="severity-img"
31
+ src={[Function]}
32
+ />
33
+ `;
34
+
35
+ exports[`RuleSeverity should render for foo severity 1`] = `
36
+ <img
37
+ alt="Unknown Serverity"
38
+ className="severity-img"
39
+ src={[Function]}
40
+ />
41
+ `;
@@ -0,0 +1,61 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 146 166"
17
+ style="enable-background:new 0 0 146 166;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="i_critical.svg"
20
+ inkscape:version="0.92.1 r"><metadata
21
+ id="metadata4612"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs4610" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1055"
35
+ id="namedview4608"
36
+ showgrid="false"
37
+ inkscape:zoom="1.4216867"
38
+ inkscape:cx="73"
39
+ inkscape:cy="83"
40
+ inkscape:window-x="0"
41
+ inkscape:window-y="1050"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><style
44
+ type="text/css"
45
+ id="style4593">
46
+ .st0{fill:#808080;}
47
+ .st1{fill:#CC0000;}
48
+ </style><g
49
+ id="g4605"><path
50
+ class="st1"
51
+ d="M114.6,143.3H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,138.5,121.8,143.3,114.6,143.3z"
52
+ id="path4597" /><path
53
+ class="st1"
54
+ d="M114.6,110.2H31c-7.2,0-13-4.8-13-10.6l0,0C18,93.7,23.9,89,31,89h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,105.4,121.8,110.2,114.6,110.2z"
55
+ id="path4599" /><path
56
+ class="st1"
57
+ d="M115,77.1H31.4c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6H115c7.2,0,13,4.8,13,10.6l0,0 C128,72.3,122.1,77.1,115,77.1z"
58
+ id="path4601" /><path
59
+ class="st1"
60
+ d="M114.6,44H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.7,13-10.7h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,39.2,121.8,44,114.6,44z"
61
+ id="path4603" /></g></svg>
@@ -0,0 +1,61 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 146 166"
17
+ style="enable-background:new 0 0 146 166;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="i_high.svg"
20
+ inkscape:version="0.92.1 r"><metadata
21
+ id="metadata6016"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs6014" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1055"
35
+ id="namedview6012"
36
+ showgrid="false"
37
+ inkscape:zoom="1.4216867"
38
+ inkscape:cx="73"
39
+ inkscape:cy="83"
40
+ inkscape:window-x="0"
41
+ inkscape:window-y="1050"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><style
44
+ type="text/css"
45
+ id="style5999">
46
+ .st0{fill:#808080;}
47
+ .st1{fill:#F39800;}
48
+ .st2{fill:#CCCCCC;}
49
+ </style><path
50
+ class="st1"
51
+ d="M114.6,143.3H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,138.5,121.8,143.3,114.6,143.3z"
52
+ id="path6003" /><path
53
+ class="st1"
54
+ d="M114.6,110.2H31c-7.2,0-13-4.8-13-10.6l0,0C18,93.7,23.9,89,31,89h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,105.4,121.8,110.2,114.6,110.2z"
55
+ id="path6005" /><path
56
+ class="st1"
57
+ d="M115,77.1H31.4c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6H115c7.2,0,13,4.8,13,10.6l0,0 C128,72.3,122.1,77.1,115,77.1z"
58
+ id="path6007" /><path
59
+ class="st2"
60
+ d="M99.6,40.2H46c-4.6,0-8.4-3.1-8.4-6.8l0,0c0-3.8,3.8-6.9,8.4-6.9h53.7c4.6,0,8.4,3.1,8.4,6.8l0,0 C108.1,37.1,104.3,40.2,99.6,40.2z"
61
+ id="path6009" /></svg>
@@ -0,0 +1,62 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 146 166"
17
+ style="enable-background:new 0 0 146 166;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="i_low.svg"
20
+ inkscape:version="0.92.1 r"><metadata
21
+ id="metadata6693"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs6691" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1055"
35
+ id="namedview6689"
36
+ showgrid="false"
37
+ inkscape:zoom="1.4216867"
38
+ inkscape:cx="73"
39
+ inkscape:cy="83"
40
+ inkscape:window-x="0"
41
+ inkscape:window-y="1050"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><style
44
+ type="text/css"
45
+ id="style6674">
46
+ .st0{fill:#808080;}
47
+ .st1{fill:#94D400;}
48
+ .st2{fill:#CCCCCC;}
49
+ </style><g
50
+ id="g6678" /><path
51
+ class="st1"
52
+ d="M114.6,143.3H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,138.5,121.8,143.3,114.6,143.3z"
53
+ id="path6680" /><path
54
+ class="st2"
55
+ d="M99.6,40.2H46c-4.6,0-8.4-3.1-8.4-6.8l0,0c0-3.8,3.8-6.9,8.4-6.9h53.7c4.6,0,8.4,3.1,8.4,6.8l0,0 C108.1,37.1,104.3,40.2,99.6,40.2z"
56
+ id="path6682" /><path
57
+ class="st2"
58
+ d="M99.6,73.3H46c-4.6,0-8.4-3.1-8.4-6.8l0,0c0-3.8,3.8-6.9,8.4-6.9h53.7c4.6,0,8.4,3.1,8.4,6.8l0,0 C108.1,70.2,104.3,73.3,99.6,73.3z"
59
+ id="path6684" /><path
60
+ class="st2"
61
+ d="M99.6,106.4H46c-4.6,0-8.4-3.1-8.4-6.8l0,0c0-3.8,3.8-6.9,8.4-6.9h53.7c4.6,0,8.4,3.1,8.4,6.8l0,0 C108.1,103.3,104.3,106.4,99.6,106.4z"
62
+ id="path6686" /></svg>