From 90e3ffa78826be67c18d84273d45c01dedabde2d Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Wed, 12 May 2021 16:13:59 +0200 Subject: [PATCH 001/149] Update Retro Action Points --- wiki/Team-Scrum-process.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/wiki/Team-Scrum-process.md b/wiki/Team-Scrum-process.md index bd1a45f3..4cc8212c 100644 --- a/wiki/Team-Scrum-process.md +++ b/wiki/Team-Scrum-process.md @@ -47,6 +47,14 @@ We agreed on having a **Pull Request freeze on 14:00** the day before the sprint ### Action Points for this Sprint During our last retrospective we agreed on tackling the following action points: +* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. +* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` +* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. +* We review pull requests more conscientiously in the future. This has been left a bit behind. +* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. +* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. + +### Old Action Points * Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. * The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. * The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). @@ -54,10 +62,6 @@ During our last retrospective we agreed on tackling the following action points: * In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. * Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. * The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. - - -### Old Action Points -* We want to introduce a longer team coffee break on Wednesdays afternoons, every two weeks. The feelgood manager takes care of this. * The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. * Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. * We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. From 593e589d98f3a7dbaa8c51f3b7b6020425275e72 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 12 May 2021 16:40:13 +0200 Subject: [PATCH 002/149] simple renaming in frontend and wiki --- .../content/ModelerSidebar/ModelerSidebar.jsx | 16 ++--- .../PropertiesPanel/PropertiesPanel.jsx | 16 ++--- .../PPParameterInput.jsx | 30 +++++----- .../PPOutputValueSection.jsx | 12 ++-- .../PPParameterSection.jsx | 8 +-- .../RobotFileSyntaxModal.jsx | 8 +-- .../RobotInteractionInputParameter.jsx | 10 ++-- .../RobotInteractionInputSection.jsx | 2 +- .../modelerSidebarFunctionality.test.js | 60 +++++++++---------- ...modelerSidebarFunctionalityTestingUtils.js | 2 +- .../robotCodeToSsotParsing.js | 18 +++--- wiki/Documentation-single-source-of-truth.md | 2 +- 12 files changed, 92 insertions(+), 92 deletions(-) diff --git a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx index cd4b0519..4d402195 100644 --- a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx +++ b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx @@ -10,7 +10,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputVarNameChangeHandler, + outputValNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, } from '../../../utils/modelerSidebarFunctionality/modelerSidebarFunctionality'; @@ -29,8 +29,8 @@ const { Sider } = Layout; * @component */ const ModelerSidebar = ({ modeler, robotId }) => { - const [variableList, setvariableList] = useState([]); - const [outputVariableName, setOutputVariableName] = useState(); + const [parameterList, setParameterList] = useState([]); + const [outputValueName, setOutputValueName] = useState(); const [elementState, setElementState] = useState({ selectedElements: [], @@ -43,8 +43,8 @@ const ModelerSidebar = ({ modeler, robotId }) => { ] = useState(['']); const [disableTaskSelection, setDisableTaskSelection] = useState(true); const stateSetters = { - setvariableList, - setOutputVariableName, + setParameterList, + setOutputValueName, setElementState, setSelectedApplication, setTasksForSelectedApplication, @@ -106,16 +106,16 @@ const ModelerSidebar = ({ modeler, robotId }) => { disableTaskSelection={disableTaskSelection} element={elementState.currentElement} robotId={robotId} - variableList={variableList} + parameterList={parameterList} parameterSelectionUpdated={(newValue) => { inputParameterChangeHandler( elementState.currentElement.id, newValue ); }} - outputVariableName={outputVariableName} + outputValueName={outputValueName} outputNameUpdated={(newValue) => { - outputVarNameChangeHandler( + outputValNameChangeHandler( elementState.currentElement.id, newValue ); diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index 1d10eefe..e9ceb1c4 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -24,9 +24,9 @@ const PropertiesPanel = ({ taskSelectionUpdated, disableTaskSelection, robotId, - variableList, + parameterList, parameterSelectionUpdated, - outputVariableName, + outputValueName, outputNameUpdated, }) => (
@@ -45,17 +45,17 @@ const PropertiesPanel = ({ disableTaskSelection={disableTaskSelection} selectedActivity={selectedActivity} /> - {variableList.length > 0 && ( + {parameterList.length > 0 && ( )} - {outputVariableName && ( + {outputValueName && ( )} @@ -73,9 +73,9 @@ PropertiesPanel.propTypes = { taskSelectionUpdated: PropTypes.func.isRequired, selectedActivity: PropTypes.string.isRequired, disableTaskSelection: PropTypes.bool.isRequired, - variableList: PropTypes.arrayOf(PropTypes.shape).isRequired, + parameterList: PropTypes.arrayOf(PropTypes.shape).isRequired, parameterSelectionUpdated: PropTypes.func.isRequired, - outputVariableName: PropTypes.string.isRequired, + outputValueName: PropTypes.string.isRequired, outputNameUpdated: PropTypes.func.isRequired, robotId: PropTypes.string.isRequired, }; diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx index 2ce50039..3cb1e09d 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx @@ -15,12 +15,12 @@ import { const { Text } = Typography; /** - * @description Renders a parameter input field for a given variable + * @description Renders a parameter input field for a given parameter * @category Client * @component */ const PPParameterInput = ({ - variableName, + parameterName, isRequired, // eslint-disable-next-line no-unused-vars dataType, @@ -33,23 +33,23 @@ const PPParameterInput = ({ parameterPropertyStatus( robotId, selectedActivity, - variableName, + parameterName, 'requireUserInput' ) ); const [parameterValue, setParameterValue] = useState( - parameterPropertyStatus(robotId, selectedActivity, variableName, 'value') + parameterPropertyStatus(robotId, selectedActivity, parameterName, 'value') ); /** * @description changes the state for "userInputRequired" and also the parameter value - * @param {String} parameterName Name of the currently handled parameter + * @param {String} currentParameterName Name of the currently handled parameter */ - const changeUserInputRequirement = (parameterName) => { + const changeUserInputRequirement = (currentParameterName) => { setParameterValue(''); setPropertyForParameter( selectedActivity, - parameterName, + currentParameterName, 'requireUserInput', !userInputRequired ); @@ -60,12 +60,12 @@ const PPParameterInput = ({ /** * @description changes the parameter value * @param {Object} event from the input field - * @param {String} parameterName Name of the currently handled parameter + * @param {String} currentParameterName Name of the currently handled parameter */ - const changeParameterValue = (event, parameterName) => { + const changeParameterValue = (event, currentParameterName) => { setPropertyForParameter( selectedActivity, - parameterName, + currentParameterName, 'value', event.target.value ); @@ -84,7 +84,7 @@ const PPParameterInput = ({ return ( <> - {variableName} + {parameterName} {isRequired && (  * @@ -96,13 +96,13 @@ const PPParameterInput = ({ placeholder='Please type in value' defaultValue={value} value={parameterValue} - onChange={(event) => changeParameterValue(event, variableName)} + onChange={(event) => changeParameterValue(event, parameterName)} suffix={ } - addonAfter={returnLockIcon(variableName)} + addonAfter={returnLockIcon(parameterName)} disabled={userInputRequired} /> )} @@ -112,7 +112,7 @@ const PPParameterInput = ({ style={{ width: '100%' }} type='primary' className={styles.parameterButton} - onClick={() => changeUserInputRequirement(variableName)} + onClick={() => changeUserInputRequirement(parameterName)} > Parameter will be set at execution @@ -122,7 +122,7 @@ const PPParameterInput = ({ }; PPParameterInput.propTypes = { - variableName: PropTypes.string.isRequired, + parameterName: PropTypes.string.isRequired, isRequired: PropTypes.bool.isRequired, dataType: PropTypes.string.isRequired, value: PropTypes.string.isRequired, diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx index 464b5556..8b1ad45e 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx @@ -11,8 +11,8 @@ const { Text } = Typography; * @category Client * @component */ -const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { - const handleOutputVariableChange = (event) => { +const PPOutputValueSection = ({ outputValueText, onNameChange }) => { + const handleOutputValueChange = (event) => { const outputValueName = event.target.value.replace(/\$/g, ''); onNameChange(outputValueName); }; @@ -33,22 +33,22 @@ const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { + } - onPressEnter={handleOutputVariableChange} + onPressEnter={handleOutputValueChange} /> ); }; PPOutputValueSection.propTypes = { - outputVariableText: PropTypes.string.isRequired, + outputValueText: PropTypes.string.isRequired, onNameChange: PropTypes.func.isRequired, }; diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx index 03529148..3e9304ec 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx @@ -12,7 +12,7 @@ const { Text } = Typography; */ const PPParameterSection = ({ selectedActivity, - variableList, + parameterList, onValueChange, robotId, }) => ( @@ -20,11 +20,11 @@ const PPParameterSection = ({ Parameter: - {variableList.map((singleInput) => ( + {parameterList.map((singleInput) => ( <> { }, { key: '2', - name: 'Empty Variable Field', + name: 'Empty Parameter Field', syntax: '%%parameterName%%', description: 'Highlights a field which has not been configured yet in the ssot', @@ -32,10 +32,10 @@ const RobotFileSyntaxModal = (props) => { }, { key: '4', - name: 'Variable', - syntax: '$(variableName)', + name: 'Parameter', + syntax: '$(parameterName)', description: - 'Used to pass in a variable, which could be the output of a previous activity', + 'Used to pass in a parameter, which could be the output of a previous activity', }, ]; diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx b/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx index d946547a..638fc3c2 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx +++ b/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx @@ -6,12 +6,12 @@ import corporateDesign from '../../../../layout/corporateDesign'; const { Text } = Typography; /** - * @description Renders a parameter input field for a given variable + * @description Renders a parameter input field for a given parameter * @category Client * @component */ const RobotInteractionInputParameter = ({ - variableName, + parameterName, // eslint-disable-next-line no-unused-vars dataType, infoText, @@ -19,9 +19,9 @@ const RobotInteractionInputParameter = ({ parameterId, }) => ( <> - {variableName} + {parameterName} updateParameterValue(parameterId, event.target.value) @@ -38,7 +38,7 @@ const RobotInteractionInputParameter = ({ ); RobotInteractionInputParameter.propTypes = { - variableName: PropTypes.string.isRequired, + parameterName: PropTypes.string.isRequired, dataType: PropTypes.string.isRequired, infoText: PropTypes.string.isRequired, updateParameterValue: PropTypes.func.isRequired, diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx b/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx index d4179d87..99feaa68 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx +++ b/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx @@ -24,7 +24,7 @@ const RobotInteractionInputSection = ({ {activityInformation.activityParameter.map((params) => ( { expect(setElementStateCallCounter).toEqual(1); }); - it('handle output variable name change', async () => { + it('handle output value name change', async () => { setOutputValueName.mockImplementation((activityId, newValue) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(newValue).toEqual(constants.MOCK_NEW_VALUE); }); - outputVarNameChangeHandler( + outputValNameChangeHandler( constants.MOCK_ACTIVITY_ID, constants.MOCK_NEW_VALUE ); @@ -128,11 +128,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: MOCK_CURRENT_ELEMENT, }); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, }; @@ -152,11 +152,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: constants.MOCK_CURRENT_ELEMENT, }); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setDisableTaskSelection: (disabled) => { expect(disabled).toBeTruthy(); @@ -195,11 +195,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -248,11 +248,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -298,18 +298,18 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { describe('Sidebar Functionality: Task Change', () => { it('handle task change WITH parameter update', async () => { - let setOutputVariableNameCallCounter = 0; - let setvariableListCallCounter = 0; + let setOutputValueNameCallCounter = 0; + let setParameterListCallCounter = 0; const MOCK_SETTER_OBJECT = { - setOutputVariableName: (newName) => { - expect(newName === undefined || newName === 'OutputVariableName').toBe( + setOutputValueName: (newName) => { + expect(newName === undefined || newName === 'OutputValueName').toBe( true ); - setOutputVariableNameCallCounter += 1; + setOutputValueNameCallCounter += 1; }, - setvariableList: (parametersInOrder) => { + setParameterList: (parametersInOrder) => { expect(parametersInOrder).toEqual(constants.MOCK_INPUTS_RIGHT_ORDER); - setvariableListCallCounter += 1; + setParameterListCallCounter += 1; }, }; @@ -340,8 +340,8 @@ describe('Sidebar Functionality: Task Change', () => { expect(setRpaTask).toHaveBeenCalledTimes(1); expect(getParameterObject).toHaveBeenCalledTimes(1); - expect(setOutputVariableNameCallCounter).toEqual(2); - expect(setvariableListCallCounter).toEqual(1); + expect(setOutputValueNameCallCounter).toEqual(2); + expect(setParameterListCallCounter).toEqual(1); }); it('handle task change WITHOUT parameter update', async () => { @@ -379,11 +379,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -436,11 +436,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['lookupRecipe']); diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index 0cdf6502..a9eb52d5 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -24,7 +24,7 @@ const MOCK_PARAMETER_OBJECT = { value: 'true', }, ], - outputVariable: 'OutputVariableName', + outputVariable: 'OutputValueName', }; const MOCK_INPUTS_RIGHT_ORDER = [ { diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 0259a0d2..11c9fd98 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -101,9 +101,9 @@ const getApplicationArray = (robotCodeSettingsSection) => { }; /** - * @description retrieves the outputVariable name from the current code line + * @description retrieves the outputValue name from the current code line * @param {String} currentLine current line of RPAf code - * @returns outputVariable as string + * @returns outputValue as string */ const getOutputName = (currentLine) => { const indexOfEqualsSign = currentLine.indexOf('='); @@ -147,9 +147,9 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { * @description deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format * @param {String} currentLine current line of RPAf code * @param {String} splitPlaceholder placeholder to split the string - * @returns the current line without the outputVariableName prefix as string + * @returns the current line without the outputValueName prefix as string */ -const currentLineWithoutOutputVariableName = ( +const currentLineWithoutOutputValueName = ( completeLine, splitPlaceholder ) => { @@ -226,7 +226,7 @@ const getInstructionBlocksFromTaskSection = ( ) => { let errorWasThrown; const instructionBlocks = []; - const regexForOutputVariable = /\${(.)+} =/; + const regexForOutputValue = /\${(.)+} =/; const splitPlaceholder = '§&§'; robotCodeTaskSection.slice(1).forEach((line) => { @@ -235,7 +235,7 @@ const getInstructionBlocksFromTaskSection = ( const currentLineIncludesSplitPlaceholder = currentLine.includes( splitPlaceholder ); - const currentLineDefinesOutputValue = regexForOutputVariable.test( + const currentLineDefinesOutputValue = regexForOutputValue.test( currentLine ); const currentLineStartsWithFourspace = currentLine.startsWith(FOURSPACE); @@ -262,7 +262,7 @@ const getInstructionBlocksFromTaskSection = ( instructionBlocks.length - 1 ].outputName = outputValueName; - currentLine = currentLineWithoutOutputVariableName( + currentLine = currentLineWithoutOutputValueName( currentLine, splitPlaceholder ); @@ -384,7 +384,7 @@ const buildSingleParameterObject = ( )[0]; const parameterArray = combinationObject.inputVars.map( - (singleInputVariable, index) => { + (singleParameter, index) => { const currentParameterIsEmpty = singleParamArray[index].startsWith('%%') && singleParamArray[index].endsWith('%%'); @@ -394,7 +394,7 @@ const buildSingleParameterObject = ( const currentParameterTakesOutputValue = singleParamArray[index].startsWith('${') && singleParamArray[index].endsWith('}'); - const singleParameterObject = { ...singleInputVariable }; + const singleParameterObject = { ...singleParameter }; singleParameterObject.requireUserInput = currentParameterRequiresUserInput; if (currentParameterIsEmpty || currentParameterRequiresUserInput) { diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-single-source-of-truth.md index 49503683..b6df3236 100644 --- a/wiki/Documentation-single-source-of-truth.md +++ b/wiki/Documentation-single-source-of-truth.md @@ -120,7 +120,7 @@ User information about a robot (creator, released for etc.) is stored in an addi { "robotId": "604f537ed699a2eb47274184", "activityId": "Activity_47II", - "outputVariable": "exampleId", + "outputValue": "exampleId", "rpaParameters": [ { "name": "Filename", From 0921f8eacaf9c4810e436e2f83d60da3b0133c29 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 12 May 2021 16:40:21 +0200 Subject: [PATCH 003/149] fix link bug --- client/src/components/content/HeaderNavbar/HeaderNavbar.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx b/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx index df06ae68..cd8f4908 100644 --- a/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx +++ b/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx @@ -71,7 +71,6 @@ const HeaderNavbar = (props) => { {onRobotInteraction && ( Robot Interaction Cockpit - )} From 7095aff9541aa0c8c8d5c8128a3fcddae0ce43d7 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 12 May 2021 16:46:04 +0200 Subject: [PATCH 004/149] object fields renaming --- client/src/utils/localSsot/parameters.js | 10 +++---- .../modelerSidebarFunctionality.js | 26 +++++++++---------- ...modelerSidebarFunctionalityTestingUtils.js | 2 +- .../BpmnToSsotParsing/BpmnToSsotParsing.js | 2 +- .../robotCodeToSsotParsing.js | 2 +- server/api/models/rpaTaskModel.js | 6 ++--- server/api/models/singleSourceOfTruthModel.js | 2 +- .../generateCodeForRpaTasks.js | 8 +++--- .../SsotToRobotParsing/retrieveParameters.js | 2 +- .../openApiDocumentation/openApiComponents.js | 2 +- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/client/src/utils/localSsot/parameters.js b/client/src/utils/localSsot/parameters.js index 8301e25c..f4e36d52 100644 --- a/client/src/utils/localSsot/parameters.js +++ b/client/src/utils/localSsot/parameters.js @@ -42,7 +42,7 @@ const createParameterObject = ( newParameterObject = { activityId, robotId, - outputVariable: `${activityId}_output`, + outputValue: `${activityId}_output`, rpaParameters, }; } else { @@ -263,9 +263,9 @@ const parameterPropertyStatus = ( }; /** - * @description Sets the new value as the name of the output variable in the session storage - * @param {String} activityId Id of the activity for which to change the value of the output variable for - * @param {String} value The new value for the name of the output variable + * @description Sets the new value as the name of the output value in the session storage + * @param {String} activityId Id of the activity for which to change the value of the output value for + * @param {String} value The new value for the name of the output value */ const setOutputValueName = (activityId, value) => { const localParameterStorage = getParameterStorage(); @@ -277,7 +277,7 @@ const setOutputValueName = (activityId, value) => { ); const editedParameterObject = matchingParameterObject; - editedParameterObject.outputVariable = value; + editedParameterObject.outputValue = value; newLocalParameterStorage.push(editedParameterObject); sessionStorage.setItem( diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js index bc7478a3..864869bd 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -91,15 +91,15 @@ const checkForApplicationTask = (activityId, setterObject) => { * @param {Object} setterObject object containing the functions for setting the state in the React component */ const updateParamSection = (activityId, robotId, setterObject) => { - setterObject.setOutputVariableName(undefined); + setterObject.setOutputValueName(undefined); const paramObj = getParameterObject(robotId, activityId); if (paramObj) { const paramsInOrder = paramObj.rpaParameters.sort( (a, b) => a.index - b.index ); - setterObject.setvariableList(paramsInOrder); - if (paramObj.outputVariable) - setterObject.setOutputVariableName(paramObj.outputVariable); + setterObject.setParameterList(paramsInOrder); + if (paramObj.outputValue) + setterObject.setOutputValueName(paramObj.outputValue); } }; @@ -120,8 +120,8 @@ const modelerSelectionChangeHandler = ( selectedElements: event.newSelection, currentElement: event.newSelection[0], }); - setterObject.setOutputVariableName(undefined); - setterObject.setvariableList([]); + setterObject.setOutputValueName(undefined); + setterObject.setParameterList([]); // INFO: the updated elementState isn't automatically used in useEffect() therefore we need the following workaround elementState.selectedElements = event.newSelection; @@ -185,8 +185,8 @@ const applicationChangedHandler = ( setRpaApplication(robotId, elementState.currentElement.id, value); getTasksForApplication(value, setterObject); - setterObject.setOutputVariableName(undefined); - setterObject.setvariableList([]); + setterObject.setOutputValueName(undefined); + setterObject.setParameterList([]); }; /** @@ -220,12 +220,12 @@ const inputParameterChangeHandler = (activityId, value) => { }; /** - * @description Gets called when the name of the output variable has been changed and updates - * the output variables name in the ssot + * @description Gets called when the name of the output value has been changed and updates + * the output values name in the ssot * @param {String} activityId id of the activity selected - * @param {Object} newValue new value of the output variables name + * @param {Object} newValue new value of the output values name */ -const outputVarNameChangeHandler = (activityId, newValue) => { +const outputValNameChangeHandler = (activityId, newValue) => { setOutputValueName(activityId, newValue); }; @@ -234,7 +234,7 @@ export { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputVarNameChangeHandler, + outputValNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, }; diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index a9eb52d5..3259ddd3 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -24,7 +24,7 @@ const MOCK_PARAMETER_OBJECT = { value: 'true', }, ], - outputVariable: 'OutputValueName', + outputValue: 'OutputValueName', }; const MOCK_INPUTS_RIGHT_ORDER = [ { diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js index efef808f..0d01a0ff 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js +++ b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js @@ -110,7 +110,7 @@ const enrichInstructionElements = (elementsArray, bpmnActivities) => { ); if (instructionElement) { instructionElement.type = 'INSTRUCTION'; - instructionElement.outputVariable = ''; + instructionElement.outputValue = ''; } if (activity.$['arkRPA:application']) { diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 11c9fd98..ae3f1ad7 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -417,7 +417,7 @@ const buildSingleParameterObject = ( activityId, rpaParameters: parameterArray, robotId, - outputVariable: singleElementFromTasksSection.outputName, + outputValue: singleElementFromTasksSection.outputName, }; }; diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index 54665386..4542dcb4 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; -const rpaVariableSchema = new Schema({ +const rpaParameterSchema = new Schema({ name: String, type: String, required: Boolean, @@ -15,8 +15,8 @@ const rpaTaskSchema = new Schema({ Task: { type: String, required: [true, 'Task required'] }, Code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, - inputVars: [rpaVariableSchema], - Output: rpaVariableSchema, + inputVars: [rpaParameterSchema], + Output: rpaParameterSchema, // TODO }); mongoose.model('rpa-task', rpaTaskSchema); diff --git a/server/api/models/singleSourceOfTruthModel.js b/server/api/models/singleSourceOfTruthModel.js index 9ba3c7b1..1c171c80 100644 --- a/server/api/models/singleSourceOfTruthModel.js +++ b/server/api/models/singleSourceOfTruthModel.js @@ -15,7 +15,7 @@ const singleParameterSchema = new Schema({ const parameterObjectSchema = new Schema({ robotId: mongoose.Types.ObjectId, activityId: String, - outputVariable: String, + outputValue: String, rpaParameters: [singleParameterSchema], }); diff --git a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js b/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js index 9bf5064d..957ac356 100644 --- a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js @@ -20,15 +20,15 @@ const isAnRpaInstruction = (currentElement) => currentElement.type === ACTIVITY_IDENTIFIER; /** - * @description Will create a prefix to catch the output variable of an activity, if one is present + * @description Will create a prefix to catch the output value of an activity, if one is present * @param {Object} paramObject The parameter object to check and loop through - * @returns {String} String specifying the output variables name + * @returns {String} String specifying the output values name */ const setOutputVar = (paramObject) => { let newCodeLine = FOURSPACE; - if (paramObject.outputVariable) { - newCodeLine += `\${${paramObject.outputVariable}} = `; + if (paramObject.outputValue) { + newCodeLine += `\${${paramObject.outputValue}} = `; } return newCodeLine; }; diff --git a/server/services/SsotToRobotParsing/retrieveParameters.js b/server/services/SsotToRobotParsing/retrieveParameters.js index 2e90220a..0a9b08a1 100644 --- a/server/services/SsotToRobotParsing/retrieveParameters.js +++ b/server/services/SsotToRobotParsing/retrieveParameters.js @@ -35,7 +35,7 @@ const retrieveParameters = async (ssot) => { { activityId: 1, rpaParameters: 1, - outputVariable: 1, + outputValue: 1, } ) .exec(); diff --git a/server/utils/openApiDocumentation/openApiComponents.js b/server/utils/openApiDocumentation/openApiComponents.js index a16ebd15..18a69265 100644 --- a/server/utils/openApiDocumentation/openApiComponents.js +++ b/server/utils/openApiDocumentation/openApiComponents.js @@ -81,7 +81,7 @@ * $ref: '#/components/schemas/ActivityIds' * robotId: * $ref: '#/components/schemas/RobotIds' - * outputVariable: + * outputValue: * type: string * example: Activity_0n140xq_output * rpaParameters: From 2f412f4ef0d12118b61098611529b815e92ed430 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 12 May 2021 16:48:30 +0200 Subject: [PATCH 005/149] file renamings done --- .../api/{variableRetrieval.js => parameterRetrieval.js} | 0 client/src/components/pages/Modeler/Modeler.jsx | 2 +- .../RobotInteractionCockpitFunctionality.js | 2 +- client/src/utils/localSsot/ssot.js | 2 +- client/src/utils/robotExecution.jsx | 2 +- ...otVariableController.js => ssotParameterController.js} | 0 server/api/routes/robots/parameters/parameters.js | 8 ++++---- server/api/routes/robots/parameters/parameters.test.js | 8 ++++---- 8 files changed, 12 insertions(+), 12 deletions(-) rename client/src/api/{variableRetrieval.js => parameterRetrieval.js} (100%) rename server/api/controllers/{ssotVariableController.js => ssotParameterController.js} (100%) diff --git a/client/src/api/variableRetrieval.js b/client/src/api/parameterRetrieval.js similarity index 100% rename from client/src/api/variableRetrieval.js rename to client/src/api/parameterRetrieval.js diff --git a/client/src/components/pages/Modeler/Modeler.jsx b/client/src/components/pages/Modeler/Modeler.jsx index a24a349c..f2edcd5f 100644 --- a/client/src/components/pages/Modeler/Modeler.jsx +++ b/client/src/components/pages/Modeler/Modeler.jsx @@ -4,7 +4,7 @@ import BpmnModeler from '../../content/BpmnModeler/BpmnModeler'; import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from '../../content/ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/ssot'; -import { getAllParametersForRobot } from '../../../api/variableRetrieval'; +import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; import { getAllAttributes } from '../../../api/attributeRetrieval'; import { getAllRpaFunctionalities } from '../../../api/applicationAndTaskSelection'; import { setRobotId } from '../../../utils/localSsot/ssot'; diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js index aa2a12f3..00a066ca 100644 --- a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js +++ b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js @@ -1,4 +1,4 @@ -import { getAllParametersForRobot } from '../../../api/variableRetrieval'; +import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; /** * @description For each activity of the current robot get the id, the name and all the parameters that require a user input diff --git a/client/src/utils/localSsot/ssot.js b/client/src/utils/localSsot/ssot.js index 7fb95298..c81d6c0e 100644 --- a/client/src/utils/localSsot/ssot.js +++ b/client/src/utils/localSsot/ssot.js @@ -16,7 +16,7 @@ import { import { getAllParametersForRobot, updateManyParameters, -} from '../../api/variableRetrieval'; +} from '../../api/parameterRetrieval'; import { getParameterStorage, deleteUnusedParameterFromDB } from './parameters'; import { getAttributeStorage, diff --git a/client/src/utils/robotExecution.jsx b/client/src/utils/robotExecution.jsx index 51674f49..04a416e9 100644 --- a/client/src/utils/robotExecution.jsx +++ b/client/src/utils/robotExecution.jsx @@ -1,5 +1,5 @@ import { getAllAttributes } from '../api/attributeRetrieval'; -import { getAllParametersForRobot } from '../api/variableRetrieval'; +import { getAllParametersForRobot } from '../api/parameterRetrieval'; const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; diff --git a/server/api/controllers/ssotVariableController.js b/server/api/controllers/ssotParameterController.js similarity index 100% rename from server/api/controllers/ssotVariableController.js rename to server/api/controllers/ssotParameterController.js diff --git a/server/api/routes/robots/parameters/parameters.js b/server/api/routes/robots/parameters/parameters.js index 0fdf96e1..e0e30815 100644 --- a/server/api/routes/robots/parameters/parameters.js +++ b/server/api/routes/robots/parameters/parameters.js @@ -1,10 +1,10 @@ const express = require('express'); -const variableController = require('../../../controllers/ssotVariableController'); +const parameterController = require('../../../controllers/ssotParameterController'); const router = express.Router(); -router.put('/', variableController.updateMany); -router.delete('/:robotId', variableController.deleteForActivities); -router.get('/:robotId', variableController.retrieveParametersForRobot); +router.put('/', parameterController.updateMany); +router.delete('/:robotId', parameterController.deleteForActivities); +router.get('/:robotId', parameterController.retrieveParametersForRobot); module.exports = router; diff --git a/server/api/routes/robots/parameters/parameters.test.js b/server/api/routes/robots/parameters/parameters.test.js index eac520ae..27e42d50 100644 --- a/server/api/routes/robots/parameters/parameters.test.js +++ b/server/api/routes/robots/parameters/parameters.test.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); const dbHandler = require('../../../../utils/TestingUtils/TestDatabaseHandler'); const dbLoader = require('../../../../utils/TestingUtils/databaseLoader'); -const ssotVariableController = require('../../../controllers/ssotVariableController'); +const ssotParameterController = require('../../../controllers/ssotParameterController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); @@ -49,7 +49,7 @@ describe('PUT /robots/parameters', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.updateMany(request, response); + await ssotParameterController.updateMany(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.modifiedCount).toBe(1); @@ -78,7 +78,7 @@ describe('GET /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.retrieveParametersForRobot(request, response); + await ssotParameterController.retrieveParametersForRobot(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.length).toBe(3); @@ -112,7 +112,7 @@ describe('DELETE /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.deleteForActivities(request, response); + await ssotParameterController.deleteForActivities(request, response); const foundParameters = await mongoose.model('parameter').find().exec(); expect(foundParameters.length).toBe(1); From c76ca2bb6a1fd09c362791b14a759c87efc1ace2 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 12 May 2021 16:49:41 +0200 Subject: [PATCH 006/149] undid planned changes --- server/api/models/rpaTaskModel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index 4542dcb4..e6d72abf 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -16,7 +16,7 @@ const rpaTaskSchema = new Schema({ Code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, inputVars: [rpaParameterSchema], - Output: rpaParameterSchema, // TODO + Output: rpaParameterSchema, }); mongoose.model('rpa-task', rpaTaskSchema); From 7ebc4174b570f47cb534e496c4bccb3f23c3073a Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 12 May 2021 17:18:05 +0200 Subject: [PATCH 007/149] refactored tests --- .../pages/RobotOverview/RobotOverview.test.js | 2 +- .../modelerSidebarFunctionality.test.js | 26 +++++++++---------- .../BpmnToSsotParsing.test.js | 2 +- .../robotCodeToSsotParsing.test.js | 22 ++++++++-------- .../robotMetadataUtils.test.js | 4 +-- server/api/models/robotJobModel.test.js | 2 +- server/api/models/rpaTaskModel.test.js | 6 ++--- .../api/models/userAccessObjectModel.test.js | 4 +-- .../rpaattributes/rpaattributes.test.js | 2 +- .../__tests__/SsotToRobotParser.test.js | 6 ++--- server/socket/socketHelper.test.js | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/client/src/components/pages/RobotOverview/RobotOverview.test.js b/client/src/components/pages/RobotOverview/RobotOverview.test.js index f048a368..c38fb06b 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/client/src/components/pages/RobotOverview/RobotOverview.test.js @@ -56,7 +56,7 @@ beforeAll(() => jest.spyOn(window, 'fetch')); beforeEach(() => window.fetch.mockImplementation(mockFetch)); describe('Testing functionality behind button to trigger function call for new but creation', () => { - it('check if attempt to fetch occured twice', async () => { + it('checks if attempt to fetch occured twice', async () => { act(() => { // eslint-disable-next-line react/jsx-filename-extension render( diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 583f7035..233c49dd 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -26,7 +26,7 @@ import { fetchTasksFromDB } from '../../api/applicationAndTaskSelection'; import constants from './modelerSidebarFunctionalityTestingUtils'; describe('Sidebar Functionality: Small Utilities', () => { - it('handle modeler element changed with no new selection', async () => { + it('handles modeler element changed with no new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -42,7 +42,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(0); }); - it('handle modeler element changed with new selection', async () => { + it('handles modeler element changed with new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -62,7 +62,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(1); }); - it('handle output variable name change', async () => { + it('handles output variable name change', async () => { setOutputValueName.mockImplementation((activityId, newValue) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(newValue).toEqual(constants.MOCK_NEW_VALUE); @@ -74,7 +74,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handle input parameter change', async () => { + it('handles input parameter change', async () => { setSingleParameter.mockImplementation((activityId, value) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(value).toEqual(constants.MOCK_VALUE); @@ -86,7 +86,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handle modeler name change', async () => { + it('handles modeler name change', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -106,7 +106,7 @@ describe('Sidebar Functionality: Small Utilities', () => { }); describe('Sidebar Functionality: Modeler Selection Change', () => { - it('handle modeler selection change; element is not a task', async () => { + it('handles modeler selection change; element is not a task', async () => { const MOCK_CURRENT_ELEMENT = { id: constants.MOCK_CURRENT_ELEMENT_ID, businessObject: { name: 'oldTestName' }, @@ -144,7 +144,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -184,7 +184,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -237,7 +237,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -297,7 +297,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { }); describe('Sidebar Functionality: Task Change', () => { - it('handle task change WITH parameter update', async () => { + it('handles task change WITH parameter update', async () => { let setOutputVariableNameCallCounter = 0; let setvariableListCallCounter = 0; const MOCK_SETTER_OBJECT = { @@ -344,7 +344,7 @@ describe('Sidebar Functionality: Task Change', () => { expect(setvariableListCallCounter).toEqual(1); }); - it('handle task change WITHOUT parameter update', async () => { + it('handles task change WITHOUT parameter update', async () => { setRpaTask.mockImplementation( (robotId, activityId, selectedApplication, value) => { expect(value).toBeUndefined(); @@ -368,7 +368,7 @@ describe('Sidebar Functionality: Task Change', () => { }); describe('Sidebar Functionality: Application Change', () => { - it('handle application change WITH cache existing', async () => { + it('handles application change WITH cache existing', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -416,7 +416,7 @@ describe('Sidebar Functionality: Application Change', () => { expect(setRpaApplication).toHaveBeenCalledTimes(1); }); - it('handle application change WITHOUT cache existing', async () => { + it('handles application change WITHOUT cache existing', async () => { const MOCK_VALUE = 'cookbookApplication'; const MOCK_ROBOT_ID = '0123456789-4711'; const MOCK_CURRENT_ELEMENT_ID = '123450815'; diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js index 98fd0020..5cb22671 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js +++ b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js @@ -7,7 +7,7 @@ const BPMN_XML = { const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; describe('Parsing Tests', () => { - test('Parser testing', async () => { + it('successfully parses the bpmn to ssot', async () => { // expect.assertions(1); sessionStorage.setItem('robotName', 'AwesomeTestRobot'); const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index efeb4b45..ff5f7705 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -35,7 +35,7 @@ const taskSectionAsArray = parser.getRobotCodeAsArray(correctTaskSection); const declaredApplications = parser.getApplicationArray(settingsSectionAsArray); describe('RobotCode to SSOT Parsing Tests', () => { - test('ssot contains right robotMetadata', () => { + it('ssot contains right robotMetadata', () => { sessionStorage.setItem('idCounter', '5416'); const ssot = parser.parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); @@ -43,7 +43,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(ssot).toHaveProperty('starterId', 'Event_0ay5417'); }); - test('settings selector was found correctly', () => { + it('finds the settings selector correctly', () => { const settingsSectionAsArrayForTest = parser.getRobotCodeAsArray( `RandomOffsetLine\n${correctSettingsSection}` ); @@ -60,7 +60,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toEqual(1); }); - test("settings selector wasn't found, expected to throw error", () => { + it("throws an error, if settings selector wasn't found", () => { const robotCodeWithOutSettingsSelector = robotCodeAsArray.slice(1); expect( parser.getLineNumberForSelector( @@ -69,17 +69,17 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toBe(undefined); }); - test('tasks selector was found correctly', () => + it('finds the tasks selector correctly', () => expect( parser.getLineNumberForSelector(robotCodeAsArray, '*** Tasks ***') ).toEqual(3)); - test('all applications were found', () => + it('finds all applications', () => expect(['Testing', 'Excel.Application']).toEqual( expect.arrayContaining(declaredApplications) )); - test('elementsArray is correct', () => { + it('has a correct elementsArray', () => { sessionStorage.setItem('idCounter', '5416'); const elementsArray = parser.getElementsArray( taskSectionAsArray, @@ -89,7 +89,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(elementsArray).toEqual(correctElementsArray); }); - test('instruction blocks are generated correct', () => { + it('generates correct instruction blocks', () => { const instructionBlocks = parser.getInstructionBlocksFromTaskSection( taskSectionAsArray, taskAndApplicationCombinations @@ -99,7 +99,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { }); describe('Error handling while parsing', () => { - test("settings selector wasn't found (and Error was thrown)", async () => { + it("throws an error, if settings selector wasn't found", async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect(message).toEqual( @@ -114,7 +114,7 @@ describe('Error handling while parsing', () => { ); }); - test('check "Library" error handling', async () => { + it('handles "Library" errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -130,7 +130,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - test('check "RPA."-Alias error handling', async () => { + it('handles "RPA."-Alias errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -146,7 +146,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - test('check "RPA-Application is not defined" error handling', async () => { + it('handles "RPA-Application is not defined" errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( diff --git a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js index 3b16bb4f..d21da0e8 100644 --- a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js +++ b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js @@ -15,7 +15,7 @@ import { parseBpmnToSsot } from '../parser/BpmnToSsotParsing/BpmnToSsotParsing'; import constants from '../modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils'; describe('Robot Metadata Utilities Tests', () => { - it('download robot file', async () => { + it('downloads the robot file', async () => { sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); getParsedRobotFile.mockImplementation((robotId) => { @@ -34,7 +34,7 @@ describe('Robot Metadata Utilities Tests', () => { await downloadRobotFile(constants.MOCK_ROBOT_ID); }); - it('save to cloud', async () => { + it('saves to cloud', async () => { upsert.mockImplementation(() => { expect(sessionStorage.getItem('ssotLocal')).toEqual( JSON.stringify(constants.MOCK_PARSER_RESULT) diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index 70aefb71..7760839b 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -51,7 +51,7 @@ describe('jobs have validation for missing parameters', () => { }); }); - it('should be invalid if Status is empty', async () => { + it('should be invalid if status is empty', async () => { job.save((err) => { expect(err.errors.status).to.exist; expect(err.errors.status.message).equal('Status required'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 5b8ce35b..2dad6daa 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -32,7 +32,7 @@ describe('tasks can be created', () => { describe('tasks have validation for missing parameters', () => { const task = new RpaTask({}); - it('should be invalid if Application is empty', async () => { + it('should be invalid if application is empty', async () => { task.save( (err) => expect(err.errors.Application).to.exist && @@ -40,7 +40,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if Task is empty', async () => { + it('should be invalid if task is empty', async () => { task.save( (err) => expect(err.errors.Task).to.exist && @@ -48,7 +48,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if Code is empty', async () => { + it('should be invalid if code is empty', async () => { task.save( (err) => expect(err.errors.Code).to.exist && diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 5cfc80f2..fab72811 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -33,7 +33,7 @@ describe('user access objects can be created', () => { describe('user access objects have validation for missing parameters', () => { const job = new UserAccesObject({}); - it('should be invalid if RobotId is empty', async () => { + it('should be invalid if robotId is empty', async () => { job.save( (err) => expect(err.errors.robotId).to.exist && @@ -41,7 +41,7 @@ describe('user access objects have validation for missing parameters', () => { ); }); - it('should be invalid if UserId is empty', async () => { + it('should be invalid if userId is empty', async () => { job.save( (err) => expect(err.errors.userId).to.exist && diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js index 62eda922..da76606e 100644 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ b/server/api/routes/robots/rpaattributes/rpaattributes.test.js @@ -72,7 +72,7 @@ describe('PUT /robots/rpaattributes', () => { }); describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all Attributes for a robot', async () => { + it('successfully retreives all attributes for a robot', async () => { await dbLoader.loadAttributesInDb(); const request = httpMocks.createRequest({ diff --git a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js index b7bd4b40..e108141d 100644 --- a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -41,8 +41,8 @@ afterEach(async () => dbHandler.clearDatabase()); */ afterAll(async () => dbHandler.closeDatabase()); -describe('Ssot Parsing', () => { - it('parses all the elements of the ssot correctly', async () => { +describe('ssot to robot Parsing', () => { + it('parses all the elements of the ssot to robot correctly', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); @@ -64,7 +64,7 @@ describe('Ssot Parsing', () => { expect(parserResultString).toMatch(BROWSER_ACTIVITY_PARAM); }); - it('parses all the elements of the ssot in the correct order', async () => { + it('parses all the elements of the ssot to robot in the correct order', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index 36f19eab..e5c0f736 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -30,7 +30,7 @@ afterEach(async () => dbHandler.clearDatabase()); afterAll(async () => dbHandler.closeDatabase()); describe('robot code retrieval', () => { - it('sucessfully retreives the roboto code', async () => { + it('sucessfully retreives the robot code', async () => { await dbLoader.loadSsotInDb(); await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); From ab31f21b2f09f56b96e620b6947a16bfe593562d Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 17:49:33 +0200 Subject: [PATCH 008/149] refactor frontend folder structure (without components folder) --- .gitignore | 4 +- .vscode/settings.json | 2 + client/src/api/ssot.js | 149 ------------------ client/src/config/.keep | 0 client/src/config/robotFile.json | 4 - client/src/context/.keep | 0 client/src/hoc/.keep | 0 client/src/index.jsx | 13 -- client/src/layout/.keep | 0 client/src/reportWebVitals.js | 13 -- .../ark-rpa.json | 39 ----- client/src/store/actions/.keep | 0 client/src/store/reducers/.keep | 0 .../BpmnToSsotParsing.test.js | 29 ---- .../robotMetadataUtils/robotMetadataUtils.js | 38 ----- .../robotMetadataUtils.test.js | 52 ------ {client => frontend}/.eslintrc.json | 0 {client => frontend}/craco.config.js | 0 {client => frontend}/package-lock.json | 33 ++-- {client => frontend}/package.json | 0 {client => frontend}/public/favicon-16.ico | Bin {client => frontend}/public/favicon-192.png | Bin {client => frontend}/public/favicon-512.png | Bin {client => frontend}/public/index.html | 0 {client => frontend}/public/manifest.json | 0 .../src/api/applicationAndTaskRetrieval.js | 2 +- .../src/api/attributeRetrieval.js | 2 +- .../src/api/parameterRetrieval.js | 2 +- .../src/api/socketHandler/socketEmitter.js | 2 +- .../src/api/socketHandler/socketListeners.js | 2 +- {client => frontend}/src/api/ssotRetrieval.js | 9 +- {client => frontend}/src/components/App.jsx | 2 +- .../content/BpmnModeler/BpmnModeler.jsx | 2 +- .../BpmnModeler/BpmnModeler.module.css | 0 .../RemoveUnsupportedBpmnFunctions.js | 0 .../content/HeaderNavbar/HeaderNavbar.jsx | 2 +- .../content/ModelerSidebar/ModelerSidebar.jsx | 12 +- .../ModelerSidebar/ModelerSidebar.module.css | 0 .../PropertiesPanel/PropertiesPanel.jsx | 2 +- .../PPApplicationDropdown.jsx | 4 +- .../PPParameterInput.jsx | 4 +- .../PPTaskDropdown.jsx | 4 +- .../PropertiesPanelSections/PPIdSection.jsx | 2 +- .../PropertiesPanelSections/PPNameSection.jsx | 2 +- .../PPOutputValueSection.jsx | 2 +- .../PPParameterSection.jsx | 2 +- .../PropertiesPanelSections/PPRpaSection.jsx | 2 +- .../PPTitleSection.jsx | 2 +- .../RobotContainer/CreateRobotContainer.jsx | 2 +- .../content/RobotContainer/RobotContainer.jsx | 8 +- .../RobotContainer/RobotContainer.module.css | 0 .../RobotFileSyntaxModal.jsx | 2 +- .../RobotInteractionInputParameter.jsx | 2 +- .../RobotInteractionInputSection.jsx | 2 +- .../src/components/pages/Error/Error.jsx | 2 +- .../src/components/pages/Home/Home.jsx | 2 +- .../src/components/pages/Home/Home.module.css | 0 .../src/components/pages/Modeler/Modeler.jsx | 10 +- .../components/pages/RobotFile/RobotFile.jsx | 8 +- .../pages/RobotFile/RobotFile.module.css | 0 .../RobotInteractionCockpit.jsx | 6 +- .../RobotInteractionCockpit.module.css | 0 .../RobotInteractionCockpitFunctionality.js | 2 +- .../RobotInteractionCockpit/RobotLogCard.jsx | 0 .../pages/RobotOverview/RobotOverview.jsx | 4 +- .../pages/RobotOverview/RobotOverview.test.js | 0 {client => frontend}/src/index.css | 0 frontend/src/index.jsx | 7 + .../src/layout/corporateDesign.css | 0 .../src/layout/corporateDesign.js | 0 .../src/layout/customizedTheme.js | 0 .../src/resources}/images/logo_black.png | Bin .../src/resources}/images/logo_cta.png | Bin .../src/resources}/images/logo_inverted.png | Bin .../src/resources}/images/logo_prim.png | Bin .../src/resources/modeler/empty.bpmn.jsx | 0 .../downloadStringAsFile.js | 2 +- .../modelerSidebarFunctionality.js | 44 +++++- .../modelerSidebarFunctionality.test.js | 65 +++++++- ...modelerSidebarFunctionalityTestingUtils.js | 0 .../notificationUtils.jsx | 2 +- .../robotExecution.jsx | 4 +- .../robotExecution.test.js | 2 +- .../robotExecutionTestData.js | 0 .../bpmnToSsotParsing/bpmnToSsotParsing.js | 8 +- .../bpmnToSsotParsing.test.js | 28 ++++ .../robotCodeTestData.js | 0 .../robotCodeToSsotParsing.js | 37 ++--- .../robotCodeToSsotParsing.test.js | 4 +- .../src/utils/parser/ssotBaseObjects.js | 0 .../ssotToBpmnParsing/ssotToBpmnParsing.js | 2 +- .../utils/rpaFunctionality/functionalities.js | 2 +- .../localSsotController}/attributes.js | 4 +- .../localSsotController}/parameters.js | 6 +- .../localSsotController}/ssot.js | 14 +- .../sessionStorageUtils.js | 2 +- .../src/utils/socket/socketConnections.js | 0 .../SsotToRobotParsing/SsotToRobotParser.js | 2 +- wiki/How-to-write-code-documentation.md | 51 ++++-- 99 files changed, 292 insertions(+), 483 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 client/src/api/ssot.js delete mode 100644 client/src/config/.keep delete mode 100644 client/src/config/robotFile.json delete mode 100644 client/src/context/.keep delete mode 100644 client/src/hoc/.keep delete mode 100644 client/src/index.jsx delete mode 100644 client/src/layout/.keep delete mode 100644 client/src/reportWebVitals.js delete mode 100644 client/src/resources/modeler/modelerPropertiesExtensionRPA/ark-rpa.json delete mode 100644 client/src/store/actions/.keep delete mode 100644 client/src/store/reducers/.keep delete mode 100644 client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js delete mode 100644 client/src/utils/robotMetadataUtils/robotMetadataUtils.js delete mode 100644 client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js rename {client => frontend}/.eslintrc.json (100%) rename {client => frontend}/craco.config.js (100%) rename {client => frontend}/package-lock.json (99%) rename {client => frontend}/package.json (100%) rename {client => frontend}/public/favicon-16.ico (100%) rename {client => frontend}/public/favicon-192.png (100%) rename {client => frontend}/public/favicon-512.png (100%) rename {client => frontend}/public/index.html (100%) rename {client => frontend}/public/manifest.json (100%) rename client/src/api/applicationAndTaskSelection.js => frontend/src/api/applicationAndTaskRetrieval.js (97%) rename {client => frontend}/src/api/attributeRetrieval.js (98%) rename client/src/api/variableRetrieval.js => frontend/src/api/parameterRetrieval.js (98%) rename {client => frontend}/src/api/socketHandler/socketEmitter.js (97%) rename {client => frontend}/src/api/socketHandler/socketListeners.js (98%) rename {client => frontend}/src/api/ssotRetrieval.js (94%) rename {client => frontend}/src/components/App.jsx (97%) rename {client => frontend}/src/components/content/BpmnModeler/BpmnModeler.jsx (98%) rename {client => frontend}/src/components/content/BpmnModeler/BpmnModeler.module.css (100%) rename {client => frontend}/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js (100%) rename {client => frontend}/src/components/content/HeaderNavbar/HeaderNavbar.jsx (96%) rename {client => frontend}/src/components/content/ModelerSidebar/ModelerSidebar.jsx (94%) rename {client => frontend}/src/components/content/ModelerSidebar/ModelerSidebar.module.css (100%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx (99%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx (88%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx (97%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx (89%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx (95%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx (97%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx (98%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx (98%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx (98%) rename {client => frontend}/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx (95%) rename {client => frontend}/src/components/content/RobotContainer/CreateRobotContainer.jsx (98%) rename {client => frontend}/src/components/content/RobotContainer/RobotContainer.jsx (95%) rename {client => frontend}/src/components/content/RobotContainer/RobotContainer.module.css (100%) rename {client => frontend}/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx (98%) rename {client => frontend}/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx (98%) rename {client => frontend}/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx (98%) rename {client => frontend}/src/components/pages/Error/Error.jsx (95%) rename {client => frontend}/src/components/pages/Home/Home.jsx (98%) rename {client => frontend}/src/components/pages/Home/Home.module.css (100%) rename {client => frontend}/src/components/pages/Modeler/Modeler.jsx (91%) rename {client => frontend}/src/components/pages/RobotFile/RobotFile.jsx (92%) rename {client => frontend}/src/components/pages/RobotFile/RobotFile.module.css (100%) rename {client => frontend}/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx (96%) rename {client => frontend}/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.module.css (100%) rename {client => frontend}/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js (95%) rename {client => frontend}/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx (100%) rename {client => frontend}/src/components/pages/RobotOverview/RobotOverview.jsx (99%) rename {client => frontend}/src/components/pages/RobotOverview/RobotOverview.test.js (100%) rename {client => frontend}/src/index.css (100%) create mode 100644 frontend/src/index.jsx rename {client => frontend}/src/layout/corporateDesign.css (100%) rename {client => frontend}/src/layout/corporateDesign.js (100%) rename {client => frontend}/src/layout/customizedTheme.js (100%) rename {client/src/resources/assets => frontend/src/resources}/images/logo_black.png (100%) rename {client/src/resources/assets => frontend/src/resources}/images/logo_cta.png (100%) rename {client/src/resources/assets => frontend/src/resources}/images/logo_inverted.png (100%) rename {client/src/resources/assets => frontend/src/resources}/images/logo_prim.png (100%) rename {client => frontend}/src/resources/modeler/empty.bpmn.jsx (100%) rename client/src/utils/downloadString.js => frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js (97%) rename {client/src/utils => frontend/src/utils/componentsFunctionality}/modelerSidebarFunctionality/modelerSidebarFunctionality.js (85%) rename {client/src/utils => frontend/src/utils/componentsFunctionality}/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js (86%) rename {client/src/utils => frontend/src/utils/componentsFunctionality}/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js (100%) rename {client/src/utils => frontend/src/utils/componentsFunctionality}/notificationUtils.jsx (97%) rename {client/src/utils => frontend/src/utils/componentsFunctionality/robotExecutionFunctionality}/robotExecution.jsx (92%) rename {client/src/utils => frontend/src/utils/componentsFunctionality/robotExecutionFunctionality}/robotExecution.test.js (98%) rename client/src/utils/testData.js => frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecutionTestData.js (100%) rename client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js => frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js (97%) create mode 100644 frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js rename {client => frontend}/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js (100%) rename {client => frontend}/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js (96%) rename {client => frontend}/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js (97%) rename client/src/utils/parser/SsotBaseObjects.js => frontend/src/utils/parser/ssotBaseObjects.js (100%) rename {client => frontend}/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js (99%) rename {client => frontend}/src/utils/rpaFunctionality/functionalities.js (96%) rename {client/src/utils/localSsot => frontend/src/utils/sessionStorageUtils/localSsotController}/attributes.js (98%) rename {client/src/utils/localSsot => frontend/src/utils/sessionStorageUtils/localSsotController}/parameters.js (98%) rename {client/src/utils/localSsot => frontend/src/utils/sessionStorageUtils/localSsotController}/ssot.js (92%) rename {client => frontend}/src/utils/sessionStorageUtils/sessionStorageUtils.js (98%) rename {client => frontend}/src/utils/socket/socketConnections.js (100%) diff --git a/.gitignore b/.gitignore index 1b6e9893..8a61fbc5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -client/node_modules/ -client/coverage +frontend/node_modules/ +frontend/coverage server/node_modules/ .idea/ .env diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..7a73a41b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/client/src/api/ssot.js b/client/src/api/ssot.js deleted file mode 100644 index fb63f0fe..00000000 --- a/client/src/api/ssot.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @category Client - * @module - */ - -/** - * @description triggers parsing of the SSoT to .robot file and returns .robot file code - */ -const getParsedRobotFile = async (robotId) => - fetch(`/robots/${robotId}/robotCode`); - -/** - * @description Fetch the ssot correlating to the specified Id - * @param { String } robotId - String including the Id of the robot to be retrieved - */ -const getSsot = async (robotId) => { - const requestString = `/robots/${robotId}`; - const response = await fetch(requestString); - return response; -}; - -/** - * @description Fetch all those ssot names and ids, which are available for the current user - * @param { String } userId - String including the user id - */ -const fetchSsotsForUser = async (userId) => { - const requestString = `/users/${userId}/robots`; - const response = await fetch(requestString); - return response; -}; - -/** - * @description This function renames the robot in the ssot - * @param { String } robotId - String including the robotId - * @param { String } newRobotName - String with the new RobotName - */ -const changeSsotName = async (robotId, newRobotName) => { - const payload = { - newRobotName, - }; - const requestString = `/robots/${robotId}/robotName`; - const requestParams = { - body: JSON.stringify(payload), - method: 'PATCH', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }; - const response = await fetch(requestString, requestParams); - return response; -}; - -/** - * @description Create a new robot with the specified name for the specified user - * @param {String} newName - String including the userId - */ -const createNewRobot = async (userId, robotName) => { - const body = { - userId, - robotName, - }; - const requestString = `/users/${userId}/robots`; - const response = await fetch(requestString, { - body: JSON.stringify(body), - method: 'POST', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }); - return response; -}; - -/** - * @description Will send a backend call to delete a robot - * @param {String} robotId Id of the robot that is deleted - */ -const deleteRobotFromDB = async (robotId) => { - const requestStringParameters = `/robots/${robotId}`; - await fetch(requestStringParameters, { method: 'DELETE' }).catch((err) => { - console.error(err); - }); -}; - -/** - * @description Sends a callout to the backend to delete parameters for the given activities - * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids - */ -const deleteParametersForActivities = (robotId, activityIdList) => { - const requestStringParameters = `/robots/parameters/${robotId}`; - fetch(requestStringParameters, { - body: JSON.stringify({ activityIdList }), - method: 'DELETE', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }).catch((err) => { - console.error(err); - }); -}; - -/** - * @description Sends a callout to the backend to delete attributes for the given activities - * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids - */ -const deleteAttributesForActivities = (robotId, activityIdList) => { - const requestStringParameters = `/robots/parameters/${robotId}`; - fetch(requestStringParameters, { - method: 'DELETE', - body: JSON.stringify({ activityIdList }), - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }).catch((err) => { - console.error(err); - }); -}; - -/** - * @description Overwrites an existing sssot in the backend with a new one - * @param {String} robotId Id of the robot that is being overwritten - * @param {String} ssot New ssot to be written to the database - * @returns {Object} Updated ssot object - */ -const updateRobot = async (robotId, ssot) => { - const requestStringSsot = `/robots/${robotId}`; - // eslint-disable-next-line no-unused-vars - const response = await fetch(requestStringSsot, { - body: ssot, - method: 'PUT', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }); - return response; -}; - -export { - getParsedRobotFile, - getSsot, - fetchSsotsForUser, - changeSsotName, - createNewRobot, - deleteRobotFromDB, - deleteParametersForActivities, - deleteAttributesForActivities, - updateRobot, -}; diff --git a/client/src/config/.keep b/client/src/config/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/config/robotFile.json b/client/src/config/robotFile.json deleted file mode 100644 index d8670687..00000000 --- a/client/src/config/robotFile.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "COMPACT": true, - "SPACES": 4 -} diff --git a/client/src/context/.keep b/client/src/context/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/hoc/.keep b/client/src/hoc/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/index.jsx b/client/src/index.jsx deleted file mode 100644 index d7c35229..00000000 --- a/client/src/index.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import 'antd/dist/antd.css'; -import './index.css'; -import App from './components/App'; -// import reportWebVitals from './reportWebVitals'; - -ReactDOM.render(, document.getElementById('root')); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -// reportWebVitals(); diff --git a/client/src/layout/.keep b/client/src/layout/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/reportWebVitals.js b/client/src/reportWebVitals.js deleted file mode 100644 index 532f29b0..00000000 --- a/client/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = (onPerfEntry) => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/client/src/resources/modeler/modelerPropertiesExtensionRPA/ark-rpa.json b/client/src/resources/modeler/modelerPropertiesExtensionRPA/ark-rpa.json deleted file mode 100644 index f4c310f5..00000000 --- a/client/src/resources/modeler/modelerPropertiesExtensionRPA/ark-rpa.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "ark-RPA", - "prefix": "arkRPA", - "uri": "http://magic", - "xml": { - "tagAlias": "lowerCase" - }, - "associations": [], - "types": [ - { - "name": "arkRPAtask", - "extends": [ - "bpmn:ServiceTask" - ], - "properties": [ - { - "name": "application", - "isAttr": true, - "type": "String" - }, - { - "name": "task", - "isAttr": true, - "type": "String" - }, - { - "name": "inputVars", - "isAttr": true, - "type": "String" - }, - { - "name": "outputVars", - "isAttr": true, - "type": "String" - } - ] - } - ] - } \ No newline at end of file diff --git a/client/src/store/actions/.keep b/client/src/store/actions/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/store/reducers/.keep b/client/src/store/reducers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js deleted file mode 100644 index 98fd0020..00000000 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js +++ /dev/null @@ -1,29 +0,0 @@ -const parser = require('./BpmnToSsotParsing.js'); - -const BPMN_XML = { - xml: - 'Flow_0m7u6buFlow_0m7u6buFlow_08r9hfxFlow_08r9hfxFlow_1lycczuFlow_1lycczuFlow_19rmn01Flow_19rmn01', -}; -const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; - -describe('Parsing Tests', () => { - test('Parser testing', async () => { - // expect.assertions(1); - sessionStorage.setItem('robotName', 'AwesomeTestRobot'); - const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); - expect(Ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); - expect(Ssot).toHaveProperty('starterId', 'Event_1wm4a0f'); - - expect(Ssot.elements[0]).toHaveProperty('name', 'Start Event'); - expect(Ssot.elements[0]).toHaveProperty('predecessorIds', []); - - expect(Ssot.elements[1]).toHaveProperty('name', 'activity One'); - expect(Ssot.elements[1]).toHaveProperty('type', 'INSTRUCTION'); - - expect(Ssot.elements[2]).toHaveProperty('name', 'activity Two'); - expect(Ssot.elements[2]).toHaveProperty('type', 'INSTRUCTION'); - - expect(Ssot.elements[4]).toHaveProperty('name', 'finished'); - expect(Ssot.elements[4]).toHaveProperty('type', 'MARKER'); - }); -}); diff --git a/client/src/utils/robotMetadataUtils/robotMetadataUtils.js b/client/src/utils/robotMetadataUtils/robotMetadataUtils.js deleted file mode 100644 index 4cd957a2..00000000 --- a/client/src/utils/robotMetadataUtils/robotMetadataUtils.js +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable no-param-reassign */ - -/** - * @category Client - * @module - */ - -import { getParsedRobotFile } from '../../api/ssot'; -import downloadString from '../downloadString'; -import { upsert } from '../localSsot/ssot'; -import { parseBpmnToSsot } from '../parser/BpmnToSsotParsing/BpmnToSsotParsing'; - -/** - * @description Gets called when the the button is pressed to save to the cloud. - * This function will retrieve the xml from the parser, parse that xml to a ssot and write the - * resulting ssot into the sessionStorage. - * @param {Object} modeler the modeling object - * @param {String} robotId id of the robot - */ -const onSaveToCloud = async (modeler, robotId) => { - const xml = await modeler.saveXML({ format: true }); - const result = await parseBpmnToSsot(xml, robotId); - const ssot = JSON.stringify(result); - sessionStorage.setItem('ssotLocal', ssot); - upsert(); -}; - -/** - * @description Will parse the ssot which can be found in the database correlating to the specified id - * @param {String} robotId id of the robot - */ -const downloadRobotFile = async (robotId) => { - const response = await (await getParsedRobotFile(robotId)).text(); - const fileName = `${sessionStorage.getItem('robotName')}.robot`; - downloadString(response, 'text/robot', fileName); -}; - -export { downloadRobotFile, onSaveToCloud }; diff --git a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js deleted file mode 100644 index 3b16bb4f..00000000 --- a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable no-shadow */ -/* eslint-disable import/first */ -/* eslint-disable no-undef */ - -jest.mock('../../api/ssot'); -jest.mock('../downloadString'); -jest.mock('../localSsot/ssot'); -jest.mock('../parser/BpmnToSsotParsing/BpmnToSsotParsing'); - -import { downloadRobotFile, onSaveToCloud } from './robotMetadataUtils'; -import { getParsedRobotFile } from '../../api/ssot'; -import downloadString from '../downloadString'; -import { upsert } from '../localSsot/ssot'; -import { parseBpmnToSsot } from '../parser/BpmnToSsotParsing/BpmnToSsotParsing'; -import constants from '../modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils'; - -describe('Robot Metadata Utilities Tests', () => { - it('download robot file', async () => { - sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); - - getParsedRobotFile.mockImplementation((robotId) => { - expect(robotId).toEqual(constants.MOCK_ROBOT_ID); - return { - text: async () => constants.MOCK_ROBOT_CONTENT, - }; - }); - - downloadString.mockImplementation((robotCode, textSpecifyier, fileName) => { - expect(robotCode).toEqual(constants.MOCK_ROBOT_CONTENT); - expect(textSpecifyier).toEqual('text/robot'); - expect(fileName).toEqual(`${constants.MOCK_ROBOT_NAME}.robot`); - }); - - await downloadRobotFile(constants.MOCK_ROBOT_ID); - }); - - it('save to cloud', async () => { - upsert.mockImplementation(() => { - expect(sessionStorage.getItem('ssotLocal')).toEqual( - JSON.stringify(constants.MOCK_PARSER_RESULT) - ); - }); - - parseBpmnToSsot.mockImplementation(async (xml, robotId) => { - expect(xml).toEqual(constants.MOCK_XML); - expect(robotId).toEqual(constants.MOCK_ROBOT_ID); - return constants.MOCK_PARSER_RESULT; - }); - - await onSaveToCloud(constants.MOCK_MODELER, constants.MOCK_ROBOT_ID); - }); -}); diff --git a/client/.eslintrc.json b/frontend/.eslintrc.json similarity index 100% rename from client/.eslintrc.json rename to frontend/.eslintrc.json diff --git a/client/craco.config.js b/frontend/craco.config.js similarity index 100% rename from client/craco.config.js rename to frontend/craco.config.js diff --git a/client/package-lock.json b/frontend/package-lock.json similarity index 99% rename from client/package-lock.json rename to frontend/package-lock.json index 76191b25..7ecf7ced 100644 --- a/client/package-lock.json +++ b/frontend/package-lock.json @@ -26668,7 +26668,8 @@ "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -26712,12 +26713,14 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "align-text": { "version": "0.1.4", @@ -27272,7 +27275,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.2.0", @@ -30151,7 +30155,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-config-react-app": { "version": "6.0.0", @@ -30297,7 +30302,8 @@ "eslint-plugin-react-hooks": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "requires": {} }, "eslint-plugin-testing-library": { "version": "3.10.2", @@ -33066,7 +33072,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { "version": "26.0.0", @@ -34258,7 +34265,8 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", - "dev": true + "dev": true, + "requires": {} }, "marked": { "version": "0.8.2", @@ -37621,7 +37629,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/react-frame-component/-/react-frame-component-4.1.3.tgz", "integrity": "sha512-4PurhctiqnmC1F5prPZ+LdsalH7pZ3SFA5xoc0HBe8mSHctdLLt4Cr2WXfXOoajHBYq/yiipp9zOgx+vy8GiEA==", - "dev": true + "dev": true, + "requires": {} }, "react-is": { "version": "17.0.2", @@ -37803,7 +37812,8 @@ "react-simple-code-editor": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz", - "integrity": "sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==" + "integrity": "sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==", + "requires": {} }, "read-pkg": { "version": "2.0.0", @@ -42525,7 +42535,8 @@ "ws": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==" + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "requires": {} }, "xml-name-validator": { "version": "3.0.0", diff --git a/client/package.json b/frontend/package.json similarity index 100% rename from client/package.json rename to frontend/package.json diff --git a/client/public/favicon-16.ico b/frontend/public/favicon-16.ico similarity index 100% rename from client/public/favicon-16.ico rename to frontend/public/favicon-16.ico diff --git a/client/public/favicon-192.png b/frontend/public/favicon-192.png similarity index 100% rename from client/public/favicon-192.png rename to frontend/public/favicon-192.png diff --git a/client/public/favicon-512.png b/frontend/public/favicon-512.png similarity index 100% rename from client/public/favicon-512.png rename to frontend/public/favicon-512.png diff --git a/client/public/index.html b/frontend/public/index.html similarity index 100% rename from client/public/index.html rename to frontend/public/index.html diff --git a/client/public/manifest.json b/frontend/public/manifest.json similarity index 100% rename from client/public/manifest.json rename to frontend/public/manifest.json diff --git a/client/src/api/applicationAndTaskSelection.js b/frontend/src/api/applicationAndTaskRetrieval.js similarity index 97% rename from client/src/api/applicationAndTaskSelection.js rename to frontend/src/api/applicationAndTaskRetrieval.js index 4923cb16..2b5d6b78 100644 --- a/client/src/api/applicationAndTaskSelection.js +++ b/frontend/src/api/applicationAndTaskRetrieval.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/api/attributeRetrieval.js b/frontend/src/api/attributeRetrieval.js similarity index 98% rename from client/src/api/attributeRetrieval.js rename to frontend/src/api/attributeRetrieval.js index 51cd30bd..f643e218 100644 --- a/client/src/api/attributeRetrieval.js +++ b/frontend/src/api/attributeRetrieval.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/api/variableRetrieval.js b/frontend/src/api/parameterRetrieval.js similarity index 98% rename from client/src/api/variableRetrieval.js rename to frontend/src/api/parameterRetrieval.js index 088449b1..36947a28 100644 --- a/client/src/api/variableRetrieval.js +++ b/frontend/src/api/parameterRetrieval.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/api/socketHandler/socketEmitter.js b/frontend/src/api/socketHandler/socketEmitter.js similarity index 97% rename from client/src/api/socketHandler/socketEmitter.js rename to frontend/src/api/socketHandler/socketEmitter.js index 5027c7bb..d20c8f20 100644 --- a/client/src/api/socketHandler/socketEmitter.js +++ b/frontend/src/api/socketHandler/socketEmitter.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ import socket from '../../utils/socket/socketConnections'; diff --git a/client/src/api/socketHandler/socketListeners.js b/frontend/src/api/socketHandler/socketListeners.js similarity index 98% rename from client/src/api/socketHandler/socketListeners.js rename to frontend/src/api/socketHandler/socketListeners.js index 440a8092..735034a1 100644 --- a/client/src/api/socketHandler/socketListeners.js +++ b/frontend/src/api/socketHandler/socketListeners.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ import socket from '../../utils/socket/socketConnections'; diff --git a/client/src/api/ssotRetrieval.js b/frontend/src/api/ssotRetrieval.js similarity index 94% rename from client/src/api/ssotRetrieval.js rename to frontend/src/api/ssotRetrieval.js index 3e114fde..f6bd70ef 100644 --- a/client/src/api/ssotRetrieval.js +++ b/frontend/src/api/ssotRetrieval.js @@ -1,8 +1,14 @@ /** - * @category Client + * @category Frontend * @module */ +/** + * @description triggers parsing of the SSoT to .robot file and returns .robot file code + */ +const getParsedRobotFile = async (robotId) => + fetch(`/robots/${robotId}/robotCode`); + /** * @description Fetch the ssot correlating to the specified Id * @param { String } robotId - String including the Id of the robot to be retrieved @@ -131,6 +137,7 @@ const updateRobot = async (robotId, ssot) => { }; export { + getParsedRobotFile, getSsot, fetchSsotsForUser, changeSsotName, diff --git a/client/src/components/App.jsx b/frontend/src/components/App.jsx similarity index 97% rename from client/src/components/App.jsx rename to frontend/src/components/App.jsx index bea142ec..1b106522 100644 --- a/client/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -9,7 +9,7 @@ import RobotInteractionCockpit from './pages/RobotInteractionCockpit/RobotIntera /** * @description route component of the application - * @category Client + * @category Frontend * @component */ const App = () => ( diff --git a/client/src/components/content/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/content/BpmnModeler/BpmnModeler.jsx similarity index 98% rename from client/src/components/content/BpmnModeler/BpmnModeler.jsx rename to frontend/src/components/content/BpmnModeler/BpmnModeler.jsx index 3ffb328f..f5507d19 100644 --- a/client/src/components/content/BpmnModeler/BpmnModeler.jsx +++ b/frontend/src/components/content/BpmnModeler/BpmnModeler.jsx @@ -14,7 +14,7 @@ const { Content } = Layout; /** * @description This component renders the modeling interface as well as the sidebar. - * @category Client + * @category Frontend * @component */ const BpmnModeler = (props) => { diff --git a/client/src/components/content/BpmnModeler/BpmnModeler.module.css b/frontend/src/components/content/BpmnModeler/BpmnModeler.module.css similarity index 100% rename from client/src/components/content/BpmnModeler/BpmnModeler.module.css rename to frontend/src/components/content/BpmnModeler/BpmnModeler.module.css diff --git a/client/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js similarity index 100% rename from client/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js rename to frontend/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js diff --git a/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx similarity index 96% rename from client/src/components/content/HeaderNavbar/HeaderNavbar.jsx rename to frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx index cd8f4908..38a6a054 100644 --- a/client/src/components/content/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../../resources/assets/images/logo_cta.png'; +import logoCTA from '../../../resources/images/logo_cta.png'; const { Header } = Layout; diff --git a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx similarity index 94% rename from client/src/components/content/ModelerSidebar/ModelerSidebar.jsx rename to frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx index cd4b0519..43921200 100644 --- a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx @@ -13,11 +13,9 @@ import { outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, -} from '../../../utils/modelerSidebarFunctionality/modelerSidebarFunctionality'; -import { downloadRobotFile, onSaveToCloud, -} from '../../../utils/robotMetadataUtils/robotMetadataUtils'; +} from '../../../utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality'; const { Title } = Typography; const { Sider } = Layout; @@ -25,7 +23,7 @@ const { Sider } = Layout; /** * @description This class decides which sidebar is displayed. It updates itself depending on the number of selected BPMN elements. * It initializes state based on properties and session storage. It binds all state-methods. - * @category Client + * @category Frontend * @component */ const ModelerSidebar = ({ modeler, robotId }) => { @@ -37,10 +35,8 @@ const ModelerSidebar = ({ modeler, robotId }) => { currentElement: null, }); const [selectedApplication, setSelectedApplication] = useState(''); - const [ - tasksForSelectedApplication, - setTasksForSelectedApplication, - ] = useState(['']); + const [tasksForSelectedApplication, setTasksForSelectedApplication] = + useState(['']); const [disableTaskSelection, setDisableTaskSelection] = useState(true); const stateSetters = { setvariableList, diff --git a/client/src/components/content/ModelerSidebar/ModelerSidebar.module.css b/frontend/src/components/content/ModelerSidebar/ModelerSidebar.module.css similarity index 100% rename from client/src/components/content/ModelerSidebar/ModelerSidebar.module.css rename to frontend/src/components/content/ModelerSidebar/ModelerSidebar.module.css diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx similarity index 99% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index 1d10eefe..a48f5d4f 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -12,7 +12,7 @@ import PPOutputValueSection from './PropertiesPanelSections/PPOutputValueSection /** * @description Shows PropertiesPanel for one selected BPMN-Element. - * @category Client + * @category Frontend * @component */ const PropertiesPanel = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx similarity index 88% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx index 61421d75..f5eee42e 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx @@ -2,13 +2,13 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../ModelerSidebar.module.css'; -import { getRpaApplication } from '../../../../../utils/localSsot/attributes'; +import { getRpaApplication } from '../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; /** * @description Renders the application-dropdown based on passed list of applications. - * @category Client + * @category Frontend * @component */ const PPApplicationDropdown = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx similarity index 97% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx index 2ce50039..20b731e0 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx @@ -10,13 +10,13 @@ import styles from '../../ModelerSidebar.module.css'; import { setPropertyForParameter, parameterPropertyStatus, -} from '../../../../../utils/localSsot/parameters'; +} from '../../../../../utils/sessionStorageUtils/localSsotController/parameters'; const { Text } = Typography; /** * @description Renders a parameter input field for a given variable - * @category Client + * @category Frontend * @component */ const PPParameterInput = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx similarity index 89% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx index 6b70433f..13c3300c 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx @@ -2,13 +2,13 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../ModelerSidebar.module.css'; -import { getRpaTask } from '../../../../../utils/localSsot/attributes'; +import { getRpaTask } from '../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; /** * @description Renders the task-dropdown based on passed list of task. - * @category Client + * @category Frontend * @component */ const PPTaskDropdown = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx similarity index 95% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx index 770fc3e0..1ca2d189 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx @@ -5,7 +5,7 @@ const { Text } = Typography; /** * @description Renders the task-dropdown based on passed list of task. - * @category Client + * @category Frontend * @component */ const PPIdSection = (element) => ( diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx similarity index 97% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx index 65542b36..02417d76 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx @@ -8,7 +8,7 @@ const { Text } = Typography; /** * @description Renders the name input field with the corresponding label. - * @category Client + * @category Frontend * @component */ const PPNameSection = ({ element, nameChanged }) => ( diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx similarity index 98% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx index 464b5556..8ae9c51c 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx @@ -8,7 +8,7 @@ const { Text } = Typography; /** * @description Renders the OutputValue-Section for activities. - * @category Client + * @category Frontend * @component */ const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx similarity index 98% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx index 03529148..768c84bd 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx @@ -7,7 +7,7 @@ const { Text } = Typography; /** * @description Renders the name input field with the corresponding label. - * @category Client + * @category Frontend * @component */ const PPParameterSection = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx similarity index 98% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx index 3040f989..02f74577 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx @@ -8,7 +8,7 @@ const { Text } = Typography; /** * @description Renders the RPA-Input fields if BPMN element is an activity - * @category Client + * @category Frontend * @component */ const PPRpaSection = ({ diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx similarity index 95% rename from client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx rename to frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx index c248b279..e690d1da 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx +++ b/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx @@ -5,7 +5,7 @@ const { Text } = Typography; /** * @description Renders the corresponding title for selected BPMN element - * @category Client + * @category Frontend * @component */ const PPTitleSection = (element) => { diff --git a/client/src/components/content/RobotContainer/CreateRobotContainer.jsx b/frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx similarity index 98% rename from client/src/components/content/RobotContainer/CreateRobotContainer.jsx rename to frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx index 14899198..8a84be04 100644 --- a/client/src/components/content/RobotContainer/CreateRobotContainer.jsx +++ b/frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx @@ -10,7 +10,7 @@ const { Title } = Typography; /** * @component * @description Provides the first Box of Robot Overview with the "Create new Robot"-Box - * @category Client + * @category Frontend */ const CreateRobotContainer = ({ createNewRobot }) => ( diff --git a/client/src/components/content/RobotContainer/RobotContainer.jsx b/frontend/src/components/content/RobotContainer/RobotContainer.jsx similarity index 95% rename from client/src/components/content/RobotContainer/RobotContainer.jsx rename to frontend/src/components/content/RobotContainer/RobotContainer.jsx index 46b91878..b9fee66f 100644 --- a/client/src/components/content/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/content/RobotContainer/RobotContainer.jsx @@ -9,16 +9,16 @@ import { import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import styles from './RobotContainer.module.css'; -import { initSsotSessionStorage } from '../../../utils/localSsot/ssot'; -import { changeSsotName, deleteRobotFromDB } from '../../../api/ssot'; -import customNotification from '../../../utils/notificationUtils'; +import { initSsotSessionStorage } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; +import { changeSsotName, deleteRobotFromDB } from '../../../api/ssotRetrieval'; +import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; const { Title } = Typography; /** * @component * @description Provides a prototype-box for all robots to be displayed in the Robot Overview - * @category Client + * @category Frontend */ const RobotContainer = (props) => { const { robotId, robotName, userId, refreshOverview } = props; diff --git a/client/src/components/content/RobotContainer/RobotContainer.module.css b/frontend/src/components/content/RobotContainer/RobotContainer.module.css similarity index 100% rename from client/src/components/content/RobotContainer/RobotContainer.module.css rename to frontend/src/components/content/RobotContainer/RobotContainer.module.css diff --git a/client/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx b/frontend/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx similarity index 98% rename from client/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx rename to frontend/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx index d7e05770..fc92e2fc 100644 --- a/client/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx +++ b/frontend/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; /** * @description View of the robot file - * @category Client + * @category Frontend * @component */ const RobotFileSyntaxModal = (props) => { diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx b/frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx similarity index 98% rename from client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx rename to frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx index d946547a..f8171631 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx +++ b/frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx @@ -7,7 +7,7 @@ import corporateDesign from '../../../../layout/corporateDesign'; const { Text } = Typography; /** * @description Renders a parameter input field for a given variable - * @category Client + * @category Frontend * @component */ const RobotInteractionInputParameter = ({ diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx b/frontend/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx similarity index 98% rename from client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx rename to frontend/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx index d4179d87..3f0ad50b 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx +++ b/frontend/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx @@ -7,7 +7,7 @@ const { Title } = Typography; /** * @description Renders the name input field with the corresponding label. - * @category Client + * @category Frontend * @component */ const RobotInteractionInputSection = ({ diff --git a/client/src/components/pages/Error/Error.jsx b/frontend/src/components/pages/Error/Error.jsx similarity index 95% rename from client/src/components/pages/Error/Error.jsx rename to frontend/src/components/pages/Error/Error.jsx index d8a4332b..3c5b1325 100644 --- a/client/src/components/pages/Error/Error.jsx +++ b/frontend/src/components/pages/Error/Error.jsx @@ -6,7 +6,7 @@ const { Title } = Typography; /** * @description Error page of the application - * @category Client + * @category Frontend * @component */ const Error = () => ( diff --git a/client/src/components/pages/Home/Home.jsx b/frontend/src/components/pages/Home/Home.jsx similarity index 98% rename from client/src/components/pages/Home/Home.jsx rename to frontend/src/components/pages/Home/Home.jsx index 219d2ecb..8e0b6379 100644 --- a/client/src/components/pages/Home/Home.jsx +++ b/frontend/src/components/pages/Home/Home.jsx @@ -8,7 +8,7 @@ const { Title } = Typography; /** * @description Homepage of the application - * @category Client + * @category Frontend * @component */ const Home = () => { diff --git a/client/src/components/pages/Home/Home.module.css b/frontend/src/components/pages/Home/Home.module.css similarity index 100% rename from client/src/components/pages/Home/Home.module.css rename to frontend/src/components/pages/Home/Home.module.css diff --git a/client/src/components/pages/Modeler/Modeler.jsx b/frontend/src/components/pages/Modeler/Modeler.jsx similarity index 91% rename from client/src/components/pages/Modeler/Modeler.jsx rename to frontend/src/components/pages/Modeler/Modeler.jsx index a24a349c..701d6b46 100644 --- a/client/src/components/pages/Modeler/Modeler.jsx +++ b/frontend/src/components/pages/Modeler/Modeler.jsx @@ -3,11 +3,11 @@ import { Layout } from 'antd'; import BpmnModeler from '../../content/BpmnModeler/BpmnModeler'; import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from '../../content/ModelerSidebar/ModelerSidebar'; -import { getSsot } from '../../../api/ssot'; -import { getAllParametersForRobot } from '../../../api/variableRetrieval'; +import { getSsot } from '../../../api/ssotRetrieval'; +import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; import { getAllAttributes } from '../../../api/attributeRetrieval'; -import { getAllRpaFunctionalities } from '../../../api/applicationAndTaskSelection'; -import { setRobotId } from '../../../utils/localSsot/ssot'; +import { getAllRpaFunctionalities } from '../../../api/applicationAndTaskRetrieval'; +import { setRobotId } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; import { initAvailableApplicationsSessionStorage, initSessionStorage, @@ -18,7 +18,7 @@ import 'bpmn-font/dist/css/bpmn-embedded.css'; /** * @description Modeler page that enables the user to build a robot - * @category Client + * @category Frontend * @component */ const Modeler = (match) => { diff --git a/client/src/components/pages/RobotFile/RobotFile.jsx b/frontend/src/components/pages/RobotFile/RobotFile.jsx similarity index 92% rename from client/src/components/pages/RobotFile/RobotFile.jsx rename to frontend/src/components/pages/RobotFile/RobotFile.jsx index b4171559..10b299e7 100644 --- a/client/src/components/pages/RobotFile/RobotFile.jsx +++ b/frontend/src/components/pages/RobotFile/RobotFile.jsx @@ -3,19 +3,19 @@ import { Layout, Button, Space, Row, Col } from 'antd'; import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; -import { getParsedRobotFile } from '../../../api/ssot'; +import { getParsedRobotFile } from '../../../api/ssotRetrieval'; import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; -import { upsert } from '../../../utils/localSsot/ssot'; +import { upsert } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; import 'prismjs/components/prism-robotframework'; import 'prismjs/themes/prism.css'; import styles from './RobotFile.module.css'; -import customNotification from '../../../utils/notificationUtils'; +import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; import RobotFileSyntaxModal from '../../content/RobotFileSyntaxModal/RobotFileSyntaxModal'; /** * @description View of the robot file - * @category Client + * @category Frontend * @component */ const RobotFile = () => { diff --git a/client/src/components/pages/RobotFile/RobotFile.module.css b/frontend/src/components/pages/RobotFile/RobotFile.module.css similarity index 100% rename from client/src/components/pages/RobotFile/RobotFile.module.css rename to frontend/src/components/pages/RobotFile/RobotFile.module.css diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx similarity index 96% rename from client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index b8a28b56..1cf08281 100644 --- a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -10,10 +10,10 @@ import { } from '@ant-design/icons'; import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; import RobotInteractionInputSection from '../../content/RobotInteractionSections/RobotInteractionInputSection'; -import { isRobotExecutable } from '../../../utils/robotExecution'; +import { isRobotExecutable } from '../../../utils/componentsFunctionality/robotExecutionFunctionality/robotExecution'; import { startRobotForUser } from '../../../api/socketHandler/socketEmitter'; import { getActivityAndParameterInformation } from './RobotInteractionCockpitFunctionality'; -import customNotification from '../../../utils/notificationUtils'; +import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; import { newRobotMonitorUpdate, newRobotStatusUpdate, @@ -26,7 +26,7 @@ const { Title } = Typography; /** * @description Page, where you can interact with a robot and for example enter input - * @category Client + * @category Frontend * @component */ const RobotInteractionCockpit = (match) => { diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.module.css b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.module.css similarity index 100% rename from client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.module.css rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.module.css diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js similarity index 95% rename from client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js index aa2a12f3..00a066ca 100644 --- a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js @@ -1,4 +1,4 @@ -import { getAllParametersForRobot } from '../../../api/variableRetrieval'; +import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; /** * @description For each activity of the current robot get the id, the name and all the parameters that require a user input diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx similarity index 100% rename from client/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx diff --git a/client/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx similarity index 99% rename from client/src/components/pages/RobotOverview/RobotOverview.jsx rename to frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 4523c830..84ee1cb4 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -10,14 +10,14 @@ import { } from '../../../api/socketHandler/socketListeners'; import CreateRobotContainer from '../../content/RobotContainer/CreateRobotContainer'; import { initSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; -import { fetchSsotsForUser, createNewRobot } from '../../../api/ssot'; +import { fetchSsotsForUser, createNewRobot } from '../../../api/ssotRetrieval'; const { Search } = Input; const { Option } = Select; /** * @description Overview page, where all robots are displayed and can be opened. - * @category Client + * @category Frontend * @component */ const RobotOverview = () => { diff --git a/client/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js similarity index 100% rename from client/src/components/pages/RobotOverview/RobotOverview.test.js rename to frontend/src/components/pages/RobotOverview/RobotOverview.test.js diff --git a/client/src/index.css b/frontend/src/index.css similarity index 100% rename from client/src/index.css rename to frontend/src/index.css diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx new file mode 100644 index 00000000..52790676 --- /dev/null +++ b/frontend/src/index.jsx @@ -0,0 +1,7 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import 'antd/dist/antd.css'; +import './index.css'; +import App from './components/App'; + +ReactDOM.render(, document.getElementById('root')); diff --git a/client/src/layout/corporateDesign.css b/frontend/src/layout/corporateDesign.css similarity index 100% rename from client/src/layout/corporateDesign.css rename to frontend/src/layout/corporateDesign.css diff --git a/client/src/layout/corporateDesign.js b/frontend/src/layout/corporateDesign.js similarity index 100% rename from client/src/layout/corporateDesign.js rename to frontend/src/layout/corporateDesign.js diff --git a/client/src/layout/customizedTheme.js b/frontend/src/layout/customizedTheme.js similarity index 100% rename from client/src/layout/customizedTheme.js rename to frontend/src/layout/customizedTheme.js diff --git a/client/src/resources/assets/images/logo_black.png b/frontend/src/resources/images/logo_black.png similarity index 100% rename from client/src/resources/assets/images/logo_black.png rename to frontend/src/resources/images/logo_black.png diff --git a/client/src/resources/assets/images/logo_cta.png b/frontend/src/resources/images/logo_cta.png similarity index 100% rename from client/src/resources/assets/images/logo_cta.png rename to frontend/src/resources/images/logo_cta.png diff --git a/client/src/resources/assets/images/logo_inverted.png b/frontend/src/resources/images/logo_inverted.png similarity index 100% rename from client/src/resources/assets/images/logo_inverted.png rename to frontend/src/resources/images/logo_inverted.png diff --git a/client/src/resources/assets/images/logo_prim.png b/frontend/src/resources/images/logo_prim.png similarity index 100% rename from client/src/resources/assets/images/logo_prim.png rename to frontend/src/resources/images/logo_prim.png diff --git a/client/src/resources/modeler/empty.bpmn.jsx b/frontend/src/resources/modeler/empty.bpmn.jsx similarity index 100% rename from client/src/resources/modeler/empty.bpmn.jsx rename to frontend/src/resources/modeler/empty.bpmn.jsx diff --git a/client/src/utils/downloadString.js b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js similarity index 97% rename from client/src/utils/downloadString.js rename to frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js index 24e13ab1..13d988b5 100644 --- a/client/src/utils/downloadString.js +++ b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js similarity index 85% rename from client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js rename to frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js index bc7478a3..e61dac65 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -1,19 +1,49 @@ /* eslint-disable no-param-reassign */ /** - * @category Client + * @category Frontend * @module */ -import { fetchTasksFromDB } from '../../api/applicationAndTaskSelection'; -/* import { fetchTasksFromDB } from '../../../api/applicationAndTaskSelection'; - */ -import { setRpaTask, setRpaApplication } from '../localSsot/attributes'; +import { fetchTasksFromDB } from '../../../api/applicationAndTaskRetrieval'; +import { + setRpaTask, + setRpaApplication, +} from '../../sessionStorageUtils/localSsotController/attributes'; import { setSingleParameter, setOutputValueName, getParameterObject, -} from '../localSsot/parameters'; +} from '../../sessionStorageUtils/localSsotController/parameters'; +import { getParsedRobotFile } from '../../../api/ssotRetrieval'; +import downloadString from './downloadStringAsFile'; +import { upsert } from '../../sessionStorageUtils/localSsotController/ssot'; +import { parseBpmnToSsot } from '../../parser/bpmnToSsotParsing/bpmnToSsotParsing'; + +/** + * @description Gets called when the the button is pressed to save to the cloud. + * This function will retrieve the xml from the parser, parse that xml to a ssot and write the + * resulting ssot into the sessionStorage. + * @param {Object} modeler the modeling object + * @param {String} robotId id of the robot + */ +const onSaveToCloud = async (modeler, robotId) => { + const xml = await modeler.saveXML({ format: true }); + const result = await parseBpmnToSsot(xml, robotId); + const ssot = JSON.stringify(result); + sessionStorage.setItem('ssotLocal', ssot); + upsert(); +}; + +/** + * @description Will parse the ssot which can be found in the database correlating to the specified id + * @param {String} robotId id of the robot + */ +const downloadRobotFile = async (robotId) => { + const response = await (await getParsedRobotFile(robotId)).text(); + const fileName = `${sessionStorage.getItem('robotName')}.robot`; + downloadString(response, 'text/robot', fileName); +}; /** * @description Will update the element state upon selection od a new element. @@ -237,4 +267,6 @@ export { outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, + downloadRobotFile, + onSaveToCloud, }; diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js similarity index 86% rename from client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js rename to frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 583f7035..2002fc99 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -2,10 +2,15 @@ /* eslint-disable import/first */ /* eslint-disable no-undef */ -jest.mock('../../api/applicationAndTaskSelection'); -jest.mock('../localSsot/parameters'); -jest.mock('../localSsot/attributes'); -jest.mock('../localSsot/ssot'); +jest.mock('../../../api/ssotRetrieval'); +jest.mock('./downloadStringAsFile'); +jest.mock('../../sessionStorageUtils/localSsotController/ssot'); +jest.mock('../../parser/BpmnToSsotParsing/BpmnToSsotParsing'); + +jest.mock('../../../api/applicationAndTaskRetrieval'); +jest.mock('../../sessionStorageUtils/localSsotController/parameters'); +jest.mock('../../sessionStorageUtils/localSsotController/attributes'); +jest.mock('../../sessionStorageUtils/localSsotController/ssot'); import { nameChangedHandler, @@ -15,15 +20,61 @@ import { outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, + downloadRobotFile, + onSaveToCloud, } from './modelerSidebarFunctionality'; -import { setRpaTask, setRpaApplication } from '../localSsot/attributes'; +import { + setRpaTask, + setRpaApplication, +} from '../../sessionStorageUtils/localSsotController/attributes'; import { setSingleParameter, setOutputValueName, getParameterObject, -} from '../localSsot/parameters'; -import { fetchTasksFromDB } from '../../api/applicationAndTaskSelection'; +} from '../../sessionStorageUtils/localSsotController/parameters'; +import { fetchTasksFromDB } from '../../../api/applicationAndTaskRetrieval'; import constants from './modelerSidebarFunctionalityTestingUtils'; +import { getParsedRobotFile } from '../../../api/ssotRetrieval'; +import downloadString from './downloadStringAsFile'; +import { upsert } from '../../sessionStorageUtils/localSsotController/ssot'; +import { parseBpmnToSsot } from '../../parser/bpmnToSsotParsing/bpmnToSsotParsing'; + +describe('Robot Metadata Utilities Tests', () => { + it('download robot file', async () => { + sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); + + getParsedRobotFile.mockImplementation((robotId) => { + expect(robotId).toEqual(constants.MOCK_ROBOT_ID); + return { + text: async () => constants.MOCK_ROBOT_CONTENT, + }; + }); + + downloadString.mockImplementation((robotCode, textSpecifyier, fileName) => { + expect(robotCode).toEqual(constants.MOCK_ROBOT_CONTENT); + expect(textSpecifyier).toEqual('text/robot'); + expect(fileName).toEqual(`${constants.MOCK_ROBOT_NAME}.robot`); + }); + + await downloadRobotFile(constants.MOCK_ROBOT_ID); + }); + + it('save to cloud', async () => { + upsert.mockImplementation(() => { + expect(sessionStorage.getItem('ssotLocal')).toEqual( + JSON.stringify(constants.MOCK_PARSER_RESULT) + ); + }); + + parseBpmnToSsot.mockImplementation(async (xml, robotId) => { + expect(xml).toEqual(constants.MOCK_XML); + expect(robotId).toEqual(constants.MOCK_ROBOT_ID); + return constants.MOCK_PARSER_RESULT; + }); + + await onSaveToCloud(constants.MOCK_MODELER, constants.MOCK_ROBOT_ID); + }); +}); describe('Sidebar Functionality: Small Utilities', () => { it('handle modeler element changed with no new selection', async () => { diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js similarity index 100% rename from client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js rename to frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js diff --git a/client/src/utils/notificationUtils.jsx b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx similarity index 97% rename from client/src/utils/notificationUtils.jsx rename to frontend/src/utils/componentsFunctionality/notificationUtils.jsx index 4279ff87..26423f30 100644 --- a/client/src/utils/notificationUtils.jsx +++ b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx @@ -6,7 +6,7 @@ import { CloudUploadOutlined, WarningOutlined, } from '@ant-design/icons'; -import corporateDesign from '../layout/corporateDesign'; +import corporateDesign from '../../layout/corporateDesign'; /** * @description Will first consider if a special icon is requested and otherwise return the corresponding icon for the notification type. diff --git a/client/src/utils/robotExecution.jsx b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx similarity index 92% rename from client/src/utils/robotExecution.jsx rename to frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx index 51674f49..d6d0da9a 100644 --- a/client/src/utils/robotExecution.jsx +++ b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx @@ -1,5 +1,5 @@ -import { getAllAttributes } from '../api/attributeRetrieval'; -import { getAllParametersForRobot } from '../api/variableRetrieval'; +import { getAllAttributes } from '../../../api/attributeRetrieval'; +import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; diff --git a/client/src/utils/robotExecution.test.js b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js similarity index 98% rename from client/src/utils/robotExecution.test.js rename to frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js index fd61e4ab..bd6d2b5c 100644 --- a/client/src/utils/robotExecution.test.js +++ b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js @@ -12,7 +12,7 @@ import { attributeObject2, attributeObjectWithEmptyApplication, attributeObjectWithEmptyTask, -} from './testData'; +} from './robotExecutionTestData'; describe('Checking robot parameters for Executability', () => { it('correctly assigns robot as executable', async () => { diff --git a/client/src/utils/testData.js b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecutionTestData.js similarity index 100% rename from client/src/utils/testData.js rename to frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecutionTestData.js diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js similarity index 97% rename from client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js rename to frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index efef808f..cd0a7e2f 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -1,15 +1,15 @@ -import customNotification from '../../notificationUtils'; +import customNotification from '../../componentsFunctionality/notificationUtils'; const { parseString } = require('xmljs2'); /** - * @category Client + * @category Frontend * @module */ -const SsotBaseObjects = require('../SsotBaseObjects'); +const ssotBaseObjects = require('../ssotBaseObjects'); -const ssotBaseElement = SsotBaseObjects.baseElement; +const ssotBaseElement = ssotBaseObjects.baseElement; /** * @description Creates a base element of the single source of truth diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js new file mode 100644 index 00000000..0387360e --- /dev/null +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js @@ -0,0 +1,28 @@ +const parser = require('./bpmnToSsotParsing.js'); + +const BPMN_XML = { + xml: 'Flow_0m7u6buFlow_0m7u6buFlow_08r9hfxFlow_08r9hfxFlow_1lycczuFlow_1lycczuFlow_19rmn01Flow_19rmn01', +}; +const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; + +describe('Parsing Tests', () => { + test('Parser testing', async () => { + // expect.assertions(1); + sessionStorage.setItem('robotName', 'AwesomeTestRobot'); + const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); + expect(Ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); + expect(Ssot).toHaveProperty('starterId', 'Event_1wm4a0f'); + + expect(Ssot.elements[0]).toHaveProperty('name', 'Start Event'); + expect(Ssot.elements[0]).toHaveProperty('predecessorIds', []); + + expect(Ssot.elements[1]).toHaveProperty('name', 'activity One'); + expect(Ssot.elements[1]).toHaveProperty('type', 'INSTRUCTION'); + + expect(Ssot.elements[2]).toHaveProperty('name', 'activity Two'); + expect(Ssot.elements[2]).toHaveProperty('type', 'INSTRUCTION'); + + expect(Ssot.elements[4]).toHaveProperty('name', 'finished'); + expect(Ssot.elements[4]).toHaveProperty('type', 'MARKER'); + }); +}); diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js similarity index 100% rename from client/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js rename to frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js similarity index 96% rename from client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js rename to frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 0259a0d2..c08f6570 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -1,9 +1,11 @@ /** - * @category Client + * @category Frontend * @module */ -const { default: customNotification } = require('../../notificationUtils'); +const { + default: customNotification, +} = require('../../componentsFunctionality/notificationUtils'); const FOURSPACE = ' '; @@ -232,12 +234,10 @@ const getInstructionBlocksFromTaskSection = ( robotCodeTaskSection.slice(1).forEach((line) => { if (errorWasThrown) return; let currentLine = line; - const currentLineIncludesSplitPlaceholder = currentLine.includes( - splitPlaceholder - ); - const currentLineDefinesOutputValue = regexForOutputVariable.test( - currentLine - ); + const currentLineIncludesSplitPlaceholder = + currentLine.includes(splitPlaceholder); + const currentLineDefinesOutputValue = + regexForOutputVariable.test(currentLine); const currentLineStartsWithFourspace = currentLine.startsWith(FOURSPACE); if (!currentLineStartsWithFourspace) { @@ -258,9 +258,8 @@ const getInstructionBlocksFromTaskSection = ( if (currentLineDefinesOutputValue) { const outputValueName = getOutputName(currentLine); - instructionBlocks[ - instructionBlocks.length - 1 - ].outputName = outputValueName; + instructionBlocks[instructionBlocks.length - 1].outputName = + outputValueName; currentLine = currentLineWithoutOutputVariableName( currentLine, @@ -297,9 +296,8 @@ const getInstructionBlocksFromTaskSection = ( const rpaParameters = getRpaParameters(currentLine, splitPlaceholder); instructionBlocks[instructionBlocks.length - 1].rpaTask = rpaTask; - instructionBlocks[ - instructionBlocks.length - 1 - ].paramArray = rpaParameters; + instructionBlocks[instructionBlocks.length - 1].paramArray = + rpaParameters; instructionBlocks[instructionBlocks.length - 1].rpaApplication = matchingCombination.Application; } @@ -369,12 +367,8 @@ const buildSingleParameterObject = ( singleElementFromTasksSection, taskAndApplicationCombinations ) => { - const { - rpaApplication, - activityId, - rpaTask, - robotId, - } = singleAtrributeObject; + const { rpaApplication, activityId, rpaTask, robotId } = + singleAtrributeObject; const singleParamArray = singleElementFromTasksSection.paramArray; const combinationObject = taskAndApplicationCombinations.filter( @@ -396,7 +390,8 @@ const buildSingleParameterObject = ( singleParamArray[index].endsWith('}'); const singleParameterObject = { ...singleInputVariable }; - singleParameterObject.requireUserInput = currentParameterRequiresUserInput; + singleParameterObject.requireUserInput = + currentParameterRequiresUserInput; if (currentParameterIsEmpty || currentParameterRequiresUserInput) { singleParameterObject.value = ''; } else if (currentParameterTakesOutputValue) { diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js similarity index 97% rename from client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js rename to frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index efeb4b45..f94a0a8b 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -7,9 +7,9 @@ import { correctInstructionBlocks, } from './robotCodeTestData'; -jest.mock('../../notificationUtils'); +jest.mock('../../componentsFunctionality/notificationUtils'); -import customNotification from '../../notificationUtils'; +import customNotification from '../../componentsFunctionality/notificationUtils'; const parser = require('./robotCodeToSsotParsing'); diff --git a/client/src/utils/parser/SsotBaseObjects.js b/frontend/src/utils/parser/ssotBaseObjects.js similarity index 100% rename from client/src/utils/parser/SsotBaseObjects.js rename to frontend/src/utils/parser/ssotBaseObjects.js diff --git a/client/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js similarity index 99% rename from client/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js rename to frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index c89c6947..fcb4f624 100644 --- a/client/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/utils/rpaFunctionality/functionalities.js b/frontend/src/utils/rpaFunctionality/functionalities.js similarity index 96% rename from client/src/utils/rpaFunctionality/functionalities.js rename to frontend/src/utils/rpaFunctionality/functionalities.js index cf3c76fb..7988a3db 100644 --- a/client/src/utils/rpaFunctionality/functionalities.js +++ b/frontend/src/utils/rpaFunctionality/functionalities.js @@ -1,5 +1,5 @@ /** - * @category Client + * @category Frontend * @module */ diff --git a/client/src/utils/localSsot/attributes.js b/frontend/src/utils/sessionStorageUtils/localSsotController/attributes.js similarity index 98% rename from client/src/utils/localSsot/attributes.js rename to frontend/src/utils/sessionStorageUtils/localSsotController/attributes.js index 5303bde6..297ff276 100644 --- a/client/src/utils/localSsot/attributes.js +++ b/frontend/src/utils/sessionStorageUtils/localSsotController/attributes.js @@ -1,8 +1,8 @@ /** - * @category Client + * @category Frontend * @module */ -import { deleteAttributesForActivities } from '../../api/ssot'; +import { deleteAttributesForActivities } from '../../../api/ssotRetrieval'; const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; diff --git a/client/src/utils/localSsot/parameters.js b/frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js similarity index 98% rename from client/src/utils/localSsot/parameters.js rename to frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js index 8301e25c..06b40503 100644 --- a/client/src/utils/localSsot/parameters.js +++ b/frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js @@ -1,9 +1,9 @@ /** - * @category Client + * @category Frontend * @module */ -import { deleteParametersForActivities } from '../../api/ssot'; -import getRpaFunctionalitiesObject from '../rpaFunctionality/functionalities'; +import { deleteParametersForActivities } from '../../../api/ssotRetrieval'; +import getRpaFunctionalitiesObject from '../../rpaFunctionality/functionalities'; import { getAttributeObjectForActivity } from './attributes'; const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; diff --git a/client/src/utils/localSsot/ssot.js b/frontend/src/utils/sessionStorageUtils/localSsotController/ssot.js similarity index 92% rename from client/src/utils/localSsot/ssot.js rename to frontend/src/utils/sessionStorageUtils/localSsotController/ssot.js index 7fb95298..f0a4704e 100644 --- a/client/src/utils/localSsot/ssot.js +++ b/frontend/src/utils/sessionStorageUtils/localSsotController/ssot.js @@ -1,22 +1,22 @@ /** - * @category Client + * @category Frontend * @module */ -import customNotification from '../notificationUtils'; -import { getSsot, updateRobot } from '../../api/ssot'; +import customNotification from '../../componentsFunctionality/notificationUtils'; +import { getSsot, updateRobot } from '../../../api/ssotRetrieval'; import { getAllAttributes, updateManyAttributes, -} from '../../api/attributeRetrieval'; -import { initSessionStorage } from '../sessionStorageUtils/sessionStorageUtils'; +} from '../../../api/attributeRetrieval'; +import { initSessionStorage } from '../sessionStorageUtils'; import { getAvailableApplications, getAllRpaFunctionalities, -} from '../../api/applicationAndTaskSelection'; +} from '../../../api/applicationAndTaskRetrieval'; import { getAllParametersForRobot, updateManyParameters, -} from '../../api/variableRetrieval'; +} from '../../../api/parameterRetrieval'; import { getParameterStorage, deleteUnusedParameterFromDB } from './parameters'; import { getAttributeStorage, diff --git a/client/src/utils/sessionStorageUtils/sessionStorageUtils.js b/frontend/src/utils/sessionStorageUtils/sessionStorageUtils.js similarity index 98% rename from client/src/utils/sessionStorageUtils/sessionStorageUtils.js rename to frontend/src/utils/sessionStorageUtils/sessionStorageUtils.js index 47e8fa5b..3dd121e3 100644 --- a/client/src/utils/sessionStorageUtils/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorageUtils/sessionStorageUtils.js @@ -1,4 +1,4 @@ -import { getAvailableApplications } from '../../api/applicationAndTaskSelection'; +import { getAvailableApplications } from '../../api/applicationAndTaskRetrieval'; /** * @description Checks if passed item already exists in session storage and initializes with given value if not existing. diff --git a/client/src/utils/socket/socketConnections.js b/frontend/src/utils/socket/socketConnections.js similarity index 100% rename from client/src/utils/socket/socketConnections.js rename to frontend/src/utils/socket/socketConnections.js diff --git a/server/services/SsotToRobotParsing/SsotToRobotParser.js b/server/services/SsotToRobotParsing/SsotToRobotParser.js index 193b0487..ac89ed79 100644 --- a/server/services/SsotToRobotParsing/SsotToRobotParser.js +++ b/server/services/SsotToRobotParsing/SsotToRobotParser.js @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ /* eslint-disable no-useless-escape */ /** - * @category Client + * @category Frontend * @module */ const mongoose = require('mongoose'); diff --git a/wiki/How-to-write-code-documentation.md b/wiki/How-to-write-code-documentation.md index 97c24fb4..8ee5cd27 100644 --- a/wiki/How-to-write-code-documentation.md +++ b/wiki/How-to-write-code-documentation.md @@ -1,49 +1,60 @@ ## General + We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. Documentation will be generated as a website under which the individual parts of the software (server/client) are visible and listed with their respective classes and modules. -It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the *Classes* part of the documentation. +It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. ## How to write documentation + ### React Components + As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. Because of that tag all methods in the same file are For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): + ``` /** * @description Some documented component - * @category Client/Server + * @category Frontend/Server * @component * @example * const text = 'some example text' * return ( ) */ ``` + The attributes are: -* description: Describe the component, its use case and/or where it could be used -* category: Either *Client* or *Server*, based on where it is used (for React components this should most likely always be *Client*) -* component: Tag to specify this as a component -* example: Code which describes a possible use scenario for this component + +- description: Describe the component, its use case and/or where it could be used +- category: Either _Client_ or _Server_, based on where it is used (for React components this should most likely always be _Client_) +- component: Tag to specify this as a component +- example: Code which describes a possible use scenario for this component ### Classes + To document classes, please follow the following scheme in front of the constructor method: + ``` /** * @description This is a description of the MyClass constructor function. - * @category Client/Server + * @category Frontend/Server * @class * @classdesc This is a description of the MyClass class. */ ``` + The attributes are: -* description: Describe the constructor function -* category: Either *Client* or *Server*, based on where it is used -* class: Tag to specify this as a class constructor -* classdesc: Describe the functionality and behavior of the class +- description: Describe the constructor function +- category: Either _Client_ or _Server_, based on where it is used +- class: Tag to specify this as a class constructor +- classdesc: Describe the functionality and behavior of the class ### Functions/Methods + When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + ``` /** * @description This is the description of what the function does @@ -52,19 +63,25 @@ When grouping related functions loosely in a file because of the same context, p * @returns {number} number of interest which is returned */ ``` + The attributes are: -* description: Describe the functionality and/or behavior of the function/method -* param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using *. Specify the name of the parameter and separated from that name specify what this parameter should represent. -* returns {datatype}: Specify the datatype returned by the function and what that value represents + +- description: Describe the functionality and/or behavior of the function/method +- param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using \*. Specify the name of the parameter and separated from that name specify what this parameter should represent. +- returns {datatype}: Specify the datatype returned by the function and what that value represents #### Group as module + When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + ``` /** - * @category Client/Server + * @category Frontend/Server * @module optionalString */ ``` + The attributes are: -* category: Either *Client* or *Server*, based on where it is used -* module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. + +- category: Either _Client_ or _Server_, based on where it is used +- module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. From a8544bafcaed37f5da5e835802064e56d5cca485 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 17:57:52 +0200 Subject: [PATCH 009/149] fixing frontend linter --- .github/workflows/linter client.yml | 9 ++++----- .vscode/settings.json | 2 -- server/services/SsotToRobotParsing/SsotToRobotParser.js | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.github/workflows/linter client.yml b/.github/workflows/linter client.yml index 77742d31..dcb9c745 100644 --- a/.github/workflows/linter client.yml +++ b/.github/workflows/linter client.yml @@ -3,7 +3,7 @@ ## Linter GitHub Actions ## ########################### ########################### -name: Lint Client Code Base +name: Lint Frontend Code Base # # Documentation: @@ -31,9 +31,8 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2-beta with: - node-version: "14" + node-version: '14' - run: npm ci - working-directory: client + working-directory: frontend - run: npm run lint - working-directory: client - + working-directory: frontend diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7a73a41b..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/server/services/SsotToRobotParsing/SsotToRobotParser.js b/server/services/SsotToRobotParsing/SsotToRobotParser.js index ac89ed79..4343b85b 100644 --- a/server/services/SsotToRobotParsing/SsotToRobotParser.js +++ b/server/services/SsotToRobotParsing/SsotToRobotParser.js @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ /* eslint-disable no-useless-escape */ /** - * @category Frontend + * @category Server * @module */ const mongoose = require('mongoose'); From e38688e7361eabb145cdc5798b04c371998e0432 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 18:02:15 +0200 Subject: [PATCH 010/149] test new workflows --- .github/workflows/frontendTesting.yml | 6 +++--- .github/workflows/heroku_deploy.yml | 10 +++++----- .../{linter client.yml => linter frontend.yml} | 0 .github/workflows/publishDocumentation.yml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename .github/workflows/{linter client.yml => linter frontend.yml} (100%) diff --git a/.github/workflows/frontendTesting.yml b/.github/workflows/frontendTesting.yml index 8667de9e..8f108962 100644 --- a/.github/workflows/frontendTesting.yml +++ b/.github/workflows/frontendTesting.yml @@ -2,7 +2,7 @@ name: Frontend testing on: push: - branches: [DEV] + branches: [DEV, 279_refactor_folder_structure] pull_request: branches: [DEV] workflow_dispatch: @@ -24,6 +24,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci - working-directory: client + working-directory: frontend - run: npm test - working-directory: client + working-directory: frontend diff --git a/.github/workflows/heroku_deploy.yml b/.github/workflows/heroku_deploy.yml index c29e4b24..c4df65c9 100644 --- a/.github/workflows/heroku_deploy.yml +++ b/.github/workflows/heroku_deploy.yml @@ -11,17 +11,17 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 - - name: build client; do dir magic + - name: build frontend; do dir magic run: | - cd client/ && npm install && CI=false npm run build + cd frontend/ && npm install && CI=false npm run build cd .. - mv ./client/build ./ - rm -r client + mv ./frontend/build ./ + rm -r frontend mv ./server/* ./ - uses: akhileshns/heroku-deploy@v3.11.10 with: heroku_api_key: ${{secrets.HEROKU_API_KEY}} - heroku_app_name: "ark-automate" + heroku_app_name: 'ark-automate' heroku_email: ${{secrets.HEROKU_EMAIL}} justlogin: true - run: heroku git:remote -a ark-automate diff --git a/.github/workflows/linter client.yml b/.github/workflows/linter frontend.yml similarity index 100% rename from .github/workflows/linter client.yml rename to .github/workflows/linter frontend.yml diff --git a/.github/workflows/publishDocumentation.yml b/.github/workflows/publishDocumentation.yml index 128eb726..4257c8b8 100644 --- a/.github/workflows/publishDocumentation.yml +++ b/.github/workflows/publishDocumentation.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 - name: navigate to client and build - run: cd ./client/ && npm install --save-dev better-docs jsdoc && npm run docs + run: cd ./frontend/ && npm install --save-dev better-docs jsdoc && npm run docs - name: Deploy uses: peaceiris/actions-gh-pages@v3 From afe3aab313bb1a3b8a858c09e3ad2a484549ab65 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 18:10:33 +0200 Subject: [PATCH 011/149] fix uppercase letter for tests --- .../modelerSidebarFunctionality.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 2002fc99..7b7a8e1f 100644 --- a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -5,7 +5,7 @@ jest.mock('../../../api/ssotRetrieval'); jest.mock('./downloadStringAsFile'); jest.mock('../../sessionStorageUtils/localSsotController/ssot'); -jest.mock('../../parser/BpmnToSsotParsing/BpmnToSsotParsing'); +jest.mock('../../parser/bpmnToSsotParsing/bpmnToSsotParsing'); jest.mock('../../../api/applicationAndTaskRetrieval'); jest.mock('../../sessionStorageUtils/localSsotController/parameters'); From ffdbb59f69d6586c9d0b5613759dc90e44e62696 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 18:32:27 +0200 Subject: [PATCH 012/149] refactor components folder --- .../{content => }/HeaderNavbar/HeaderNavbar.jsx | 2 +- frontend/src/components/pages/Error/Error.jsx | 2 +- .../Modeler}/BpmnModeler/BpmnModeler.jsx | 2 +- .../Modeler}/BpmnModeler/BpmnModeler.module.css | 0 .../BpmnModeler/RemoveUnsupportedBpmnFunctions.js | 0 frontend/src/components/pages/Modeler/Modeler.jsx | 6 +++--- .../Modeler}/ModelerSidebar/ModelerSidebar.jsx | 4 ++-- .../Modeler}/ModelerSidebar/ModelerSidebar.module.css | 0 .../ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx | 0 .../PropertiesPanelComponents/PPApplicationDropdown.jsx | 2 +- .../PropertiesPanelComponents/PPParameterInput.jsx | 2 +- .../PropertiesPanelComponents/PPTaskDropdown.jsx | 2 +- .../PropertiesPanelSections/PPIdSection.jsx | 0 .../PropertiesPanelSections/PPNameSection.jsx | 2 +- .../PropertiesPanelSections/PPOutputValueSection.jsx | 2 +- .../PropertiesPanelSections/PPParameterSection.jsx | 0 .../PropertiesPanelSections/PPRpaSection.jsx | 0 .../PropertiesPanelSections/PPTitleSection.jsx | 0 frontend/src/components/pages/RobotFile/RobotFile.jsx | 4 ++-- .../RobotFileSyntaxModal/RobotFileSyntaxModal.jsx | 0 .../RobotInteractionCockpit/RobotInteractionCockpit.jsx | 4 ++-- .../RobotInteractionInputParameter.jsx | 2 +- .../RobotInteractionInputSection.jsx | 0 .../RobotContainer/CreateRobotContainer.jsx | 2 +- .../RobotOverview}/RobotContainer/RobotContainer.jsx | 9 ++++++--- .../RobotContainer/RobotContainer.module.css | 0 .../src/components/pages/RobotOverview/RobotOverview.jsx | 6 +++--- 27 files changed, 28 insertions(+), 25 deletions(-) rename frontend/src/components/{content => }/HeaderNavbar/HeaderNavbar.jsx (97%) rename frontend/src/components/{content => pages/Modeler}/BpmnModeler/BpmnModeler.jsx (96%) rename frontend/src/components/{content => pages/Modeler}/BpmnModeler/BpmnModeler.module.css (100%) rename frontend/src/components/{content => pages/Modeler}/BpmnModeler/RemoveUnsupportedBpmnFunctions.js (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/ModelerSidebar.jsx (96%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/ModelerSidebar.module.css (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx (90%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx (97%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx (90%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx (92%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx (95%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx (100%) rename frontend/src/components/{content => pages/Modeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx (100%) rename frontend/src/components/{content => pages/RobotFile}/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx (100%) rename frontend/src/components/{content => pages/RobotInteractionCockpit}/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx (94%) rename frontend/src/components/{content => pages/RobotInteractionCockpit}/RobotInteractionSections/RobotInteractionInputSection.jsx (100%) rename frontend/src/components/{content => pages/RobotOverview}/RobotContainer/CreateRobotContainer.jsx (94%) rename frontend/src/components/{content => pages/RobotOverview}/RobotContainer/RobotContainer.jsx (94%) rename frontend/src/components/{content => pages/RobotOverview}/RobotContainer/RobotContainer.module.css (100%) diff --git a/frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/HeaderNavbar/HeaderNavbar.jsx similarity index 97% rename from frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx rename to frontend/src/components/HeaderNavbar/HeaderNavbar.jsx index 38a6a054..0451d47b 100644 --- a/frontend/src/components/content/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../../resources/images/logo_cta.png'; +import logoCTA from '../../resources/images/logo_cta.png'; const { Header } = Layout; diff --git a/frontend/src/components/pages/Error/Error.jsx b/frontend/src/components/pages/Error/Error.jsx index 3c5b1325..0d22a51d 100644 --- a/frontend/src/components/pages/Error/Error.jsx +++ b/frontend/src/components/pages/Error/Error.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Layout, Typography } from 'antd'; -import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; const { Title } = Typography; diff --git a/frontend/src/components/content/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.jsx similarity index 96% rename from frontend/src/components/content/BpmnModeler/BpmnModeler.jsx rename to frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.jsx index f5507d19..12c0b508 100644 --- a/frontend/src/components/content/BpmnModeler/BpmnModeler.jsx +++ b/frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.jsx @@ -5,7 +5,7 @@ import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camu import PropTypes from 'prop-types'; import CliModule from 'bpmn-js-cli'; import removeUnsupportedBpmnFunctions from './RemoveUnsupportedBpmnFunctions'; -import { emptyBpmn } from '../../../resources/modeler/empty.bpmn'; +import { emptyBpmn } from '../../../../resources/modeler/empty.bpmn'; import styles from './BpmnModeler.module.css'; import 'bpmn-js/dist/assets/diagram-js.css'; import 'bpmn-font/dist/css/bpmn-embedded.css'; diff --git a/frontend/src/components/content/BpmnModeler/BpmnModeler.module.css b/frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.module.css similarity index 100% rename from frontend/src/components/content/BpmnModeler/BpmnModeler.module.css rename to frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.module.css diff --git a/frontend/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/pages/Modeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js similarity index 100% rename from frontend/src/components/content/BpmnModeler/RemoveUnsupportedBpmnFunctions.js rename to frontend/src/components/pages/Modeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js diff --git a/frontend/src/components/pages/Modeler/Modeler.jsx b/frontend/src/components/pages/Modeler/Modeler.jsx index 701d6b46..975cb430 100644 --- a/frontend/src/components/pages/Modeler/Modeler.jsx +++ b/frontend/src/components/pages/Modeler/Modeler.jsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react'; import { Layout } from 'antd'; -import BpmnModeler from '../../content/BpmnModeler/BpmnModeler'; -import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; -import ModelerSidebar from '../../content/ModelerSidebar/ModelerSidebar'; +import BpmnModeler from './BpmnModeler/BpmnModeler'; +import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/ssotRetrieval'; import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; import { getAllAttributes } from '../../../api/attributeRetrieval'; diff --git a/frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx similarity index 96% rename from frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx index 43921200..48910035 100644 --- a/frontend/src/components/content/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx @@ -4,7 +4,7 @@ import { Typography, Layout, Space, Button } from 'antd'; import PropTypes from 'prop-types'; import PropertiesPanel from './PropertiesPanel/PropertiesPanel'; import styles from './ModelerSidebar.module.css'; -import parseSsotToBpmn from '../../../utils/parser/ssotToBpmnParsing/ssotToBpmnParsing'; +import parseSsotToBpmn from '../../../../utils/parser/ssotToBpmnParsing/ssotToBpmnParsing'; import { nameChangedHandler, applicationChangedHandler, @@ -15,7 +15,7 @@ import { modelerElementChangeHandler, downloadRobotFile, onSaveToCloud, -} from '../../../utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality'; +} from '../../../../utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality'; const { Title } = Typography; const { Sider } = Layout; diff --git a/frontend/src/components/content/ModelerSidebar/ModelerSidebar.module.css b/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.module.css similarity index 100% rename from frontend/src/components/content/ModelerSidebar/ModelerSidebar.module.css rename to frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.module.css diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx similarity index 100% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx similarity index 90% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx index f5eee42e..a41b21a1 100644 --- a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../ModelerSidebar.module.css'; -import { getRpaApplication } from '../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import { getRpaApplication } from '../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx similarity index 97% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx index 20b731e0..6e1f3449 100644 --- a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx @@ -10,7 +10,7 @@ import styles from '../../ModelerSidebar.module.css'; import { setPropertyForParameter, parameterPropertyStatus, -} from '../../../../../utils/sessionStorageUtils/localSsotController/parameters'; +} from '../../../../../../utils/sessionStorageUtils/localSsotController/parameters'; const { Text } = Typography; diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx similarity index 90% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx index 13c3300c..e2ecabe0 100644 --- a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../ModelerSidebar.module.css'; -import { getRpaTask } from '../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import { getRpaTask } from '../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx similarity index 100% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx similarity index 92% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx index 02417d76..6a5657e7 100644 --- a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Input, Typography, Tooltip } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; -import corporateDesign from '../../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../../layout/corporateDesign'; const { Text } = Typography; diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx similarity index 95% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx index 8ae9c51c..7825ab8f 100644 --- a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Space, Typography, Tooltip, Input } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import corporateDesign from '../../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../../layout/corporateDesign'; const { Text } = Typography; diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx similarity index 100% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx similarity index 100% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx diff --git a/frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx similarity index 100% rename from frontend/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx diff --git a/frontend/src/components/pages/RobotFile/RobotFile.jsx b/frontend/src/components/pages/RobotFile/RobotFile.jsx index 10b299e7..50c28002 100644 --- a/frontend/src/components/pages/RobotFile/RobotFile.jsx +++ b/frontend/src/components/pages/RobotFile/RobotFile.jsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { Layout, Button, Space, Row, Col } from 'antd'; import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; -import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; import { getParsedRobotFile } from '../../../api/ssotRetrieval'; import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; @@ -11,7 +11,7 @@ import 'prismjs/components/prism-robotframework'; import 'prismjs/themes/prism.css'; import styles from './RobotFile.module.css'; import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; -import RobotFileSyntaxModal from '../../content/RobotFileSyntaxModal/RobotFileSyntaxModal'; +import RobotFileSyntaxModal from './RobotFileSyntaxModal/RobotFileSyntaxModal'; /** * @description View of the robot file diff --git a/frontend/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx b/frontend/src/components/pages/RobotFile/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx similarity index 100% rename from frontend/src/components/content/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx rename to frontend/src/components/pages/RobotFile/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index 1cf08281..2ea21fac 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -8,8 +8,8 @@ import { Loading3QuartersOutlined, PauseCircleOutlined, } from '@ant-design/icons'; -import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; -import RobotInteractionInputSection from '../../content/RobotInteractionSections/RobotInteractionInputSection'; +import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import RobotInteractionInputSection from './RobotInteractionSections/RobotInteractionInputSection'; import { isRobotExecutable } from '../../../utils/componentsFunctionality/robotExecutionFunctionality/robotExecution'; import { startRobotForUser } from '../../../api/socketHandler/socketEmitter'; import { getActivityAndParameterInformation } from './RobotInteractionCockpitFunctionality'; diff --git a/frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx similarity index 94% rename from frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx index f8171631..4b2d28f4 100644 --- a/frontend/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Typography, Input, Tooltip } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import corporateDesign from '../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../layout/corporateDesign'; const { Text } = Typography; /** diff --git a/frontend/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection.jsx similarity index 100% rename from frontend/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection.jsx diff --git a/frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/CreateRobotContainer.jsx similarity index 94% rename from frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx rename to frontend/src/components/pages/RobotOverview/RobotContainer/CreateRobotContainer.jsx index 8a84be04..31ba7b37 100644 --- a/frontend/src/components/content/RobotContainer/CreateRobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/CreateRobotContainer.jsx @@ -3,7 +3,7 @@ import { Col, Row, Typography } from 'antd'; import { PlusCircleOutlined } from '@ant-design/icons'; import PropTypes from 'prop-types'; import styles from './RobotContainer.module.css'; -import corporateDesign from '../../../layout/corporateDesign'; +import corporateDesign from '../../../../layout/corporateDesign'; const { Title } = Typography; diff --git a/frontend/src/components/content/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx similarity index 94% rename from frontend/src/components/content/RobotContainer/RobotContainer.jsx rename to frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index b9fee66f..5015722b 100644 --- a/frontend/src/components/content/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -9,9 +9,12 @@ import { import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import styles from './RobotContainer.module.css'; -import { initSsotSessionStorage } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; -import { changeSsotName, deleteRobotFromDB } from '../../../api/ssotRetrieval'; -import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; +import { initSsotSessionStorage } from '../../../../utils/sessionStorageUtils/localSsotController/ssot'; +import { + changeSsotName, + deleteRobotFromDB, +} from '../../../../api/ssotRetrieval'; +import customNotification from '../../../../utils/componentsFunctionality/notificationUtils'; const { Title } = Typography; diff --git a/frontend/src/components/content/RobotContainer/RobotContainer.module.css b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.module.css similarity index 100% rename from frontend/src/components/content/RobotContainer/RobotContainer.module.css rename to frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.module.css diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 84ee1cb4..b60daf02 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -1,14 +1,14 @@ import React, { useState, useEffect } from 'react'; import { Layout, Input, Space, Row, Select } from 'antd'; -import HeaderNavbar from '../../content/HeaderNavbar/HeaderNavbar'; -import RobotContainer from '../../content/RobotContainer/RobotContainer'; +import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import RobotContainer from './RobotContainer/RobotContainer'; import { joinRoomForUser } from '../../../api/socketHandler/socketEmitter'; import { successRoomConnection, errorRoomConnection, newClientJoined, } from '../../../api/socketHandler/socketListeners'; -import CreateRobotContainer from '../../content/RobotContainer/CreateRobotContainer'; +import CreateRobotContainer from './RobotContainer/CreateRobotContainer'; import { initSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; import { fetchSsotsForUser, createNewRobot } from '../../../api/ssotRetrieval'; From eb77ad8e6b8713eefb23d3593d3a6a3536033919 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 14 May 2021 20:19:42 +0200 Subject: [PATCH 013/149] refactor pages folder --- .../PropertiesPanel/PropertiesPanel.jsx | 12 +++++----- .../PropertiesPanelSections/PPIdSection.jsx | 18 --------------- .../PPIdSection/PPIdSection.jsx | 22 +++++++++++++++++++ .../{ => PPNameSection}/PPNameSection.jsx | 2 +- .../PPOutputValueSection.jsx | 2 +- .../PPParameterSection.jsx | 2 +- .../singleComponents}/PPParameterInput.jsx | 4 ++-- .../{ => PPRpaSection}/PPRpaSection.jsx | 4 ++-- .../PPApplicationDropdown.jsx | 4 ++-- .../singleComponents}/PPTaskDropdown.jsx | 4 ++-- .../{ => PPTitleSection}/PPTitleSection.jsx | 3 ++- 11 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx create mode 100644 frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/{ => PPNameSection}/PPNameSection.jsx (92%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/{ => PPOutputValueSection}/PPOutputValueSection.jsx (95%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/{ => PPParameterSection}/PPParameterSection.jsx (94%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/{PropertiesPanelComponents => PropertiesPanelSections/PPParameterSection/singleComponents}/PPParameterInput.jsx (95%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/{ => PPRpaSection}/PPRpaSection.jsx (88%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/{PropertiesPanelComponents => PropertiesPanelSections/PPRpaSection/singleComponents}/PPApplicationDropdown.jsx (84%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/{PropertiesPanelComponents => PropertiesPanelSections/PPRpaSection/singleComponents}/PPTaskDropdown.jsx (85%) rename frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/{ => PPTitleSection}/PPTitleSection.jsx (83%) diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index a48f5d4f..5e835f4a 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -3,12 +3,12 @@ import { is } from 'bpmn-js/lib/util/ModelUtil'; import { Space } from 'antd'; import PropTypes from 'prop-types'; -import PPIdSection from './PropertiesPanelSections/PPIdSection'; -import PPTitle from './PropertiesPanelSections/PPTitleSection'; -import PPNameSection from './PropertiesPanelSections/PPNameSection'; -import PPParameterSection from './PropertiesPanelSections/PPParameterSection'; -import PPRpaSection from './PropertiesPanelSections/PPRpaSection'; -import PPOutputValueSection from './PropertiesPanelSections/PPOutputValueSection'; +import PPIdSection from './PropertiesPanelSections/PPIdSection/PPIdSection'; +import PPTitle from './PropertiesPanelSections/PPTitleSection/PPTitleSection'; +import PPNameSection from './PropertiesPanelSections/PPNameSection/PPNameSection'; +import PPParameterSection from './PropertiesPanelSections/PPParameterSection/PPParameterSection'; +import PPRpaSection from './PropertiesPanelSections/PPRpaSection/PPRpaSection'; +import PPOutputValueSection from './PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection'; /** * @description Shows PropertiesPanel for one selected BPMN-Element. diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx deleted file mode 100644 index 1ca2d189..00000000 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import { Space, Typography } from 'antd'; - -const { Text } = Typography; - -/** - * @description Renders the task-dropdown based on passed list of task. - * @category Frontend - * @component - */ -const PPIdSection = (element) => ( - - ID: - {element.element.id} - -); - -export default PPIdSection; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx new file mode 100644 index 00000000..5e8b6479 --- /dev/null +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Space, Typography } from 'antd'; + +const { Text } = Typography; + +/** + * @description Renders the task-dropdown based on passed list of task. + * @category Frontend + * @component + */ +const PPIdSection = (element) => { + const { element: selectedElement } = element; + const { id } = selectedElement; + return ( + + ID: + {id} + + ); +}; + +export default PPIdSection; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx similarity index 92% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx index 6a5657e7..0f01e68c 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Input, Typography, Tooltip } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; -import corporateDesign from '../../../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../../../layout/corporateDesign'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx similarity index 95% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx index 7825ab8f..dd04fb6b 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Space, Typography, Tooltip, Input } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import corporateDesign from '../../../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../../../layout/corporateDesign'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx similarity index 94% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx index 768c84bd..9d7f58ad 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Typography, Space } from 'antd'; -import PPParameterInput from '../PropertiesPanelComponents/PPParameterInput'; +import PPParameterInput from './singleComponents/PPParameterInput'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx similarity index 95% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx index 6e1f3449..64ad95a9 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx @@ -6,11 +6,11 @@ import { UnlockOutlined, } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import styles from '../../ModelerSidebar.module.css'; +import styles from '../../../../ModelerSidebar.module.css'; import { setPropertyForParameter, parameterPropertyStatus, -} from '../../../../../../utils/sessionStorageUtils/localSsotController/parameters'; +} from '../../../../../../../../utils/sessionStorageUtils/localSsotController/parameters'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx similarity index 88% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx index 02f74577..c6aa9a5b 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx @@ -1,8 +1,8 @@ import React from 'react'; import { Typography, Space } from 'antd'; import PropTypes from 'prop-types'; -import PropertiesPanelApplicationDropdown from '../PropertiesPanelComponents/PPApplicationDropdown'; -import PropertiesPanelTaskDropdown from '../PropertiesPanelComponents/PPTaskDropdown'; +import PropertiesPanelApplicationDropdown from './singleComponents/PPApplicationDropdown'; +import PropertiesPanelTaskDropdown from './singleComponents/PPTaskDropdown'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx similarity index 84% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx index a41b21a1..e917295d 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPApplicationDropdown.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx @@ -1,8 +1,8 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; -import styles from '../../ModelerSidebar.module.css'; -import { getRpaApplication } from '../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import styles from '../../../../ModelerSidebar.module.css'; +import { getRpaApplication } from '../../../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx similarity index 85% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx index e2ecabe0..57774dbb 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPTaskDropdown.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx @@ -1,8 +1,8 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; -import styles from '../../ModelerSidebar.module.css'; -import { getRpaTask } from '../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import styles from '../../../../ModelerSidebar.module.css'; +import { getRpaTask } from '../../../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx similarity index 83% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx rename to frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx index e690d1da..1d8008e0 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection.jsx +++ b/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx @@ -9,7 +9,8 @@ const { Text } = Typography; * @component */ const PPTitleSection = (element) => { - let title = element.element.type; + const { element: selectedElement } = element; + let { type: title } = selectedElement; title = title.replace('bpmn:', ''); return ( From 075756eddc0b19816f1dd64eccae59886f1ba853 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 14:20:43 +0200 Subject: [PATCH 014/149] refactor robotInteractionCockpit --- .../RobotInteractionCockpit.jsx | 104 ++-------------- .../RobotInteractionExecutionSection.jsx | 111 ++++++++++++++++++ .../singleComponents/RobotLogEntryCard.jsx} | 0 .../RobotInteractionInputSection.jsx | 4 +- .../RobotInteractionParameterInput.jsx} | 2 +- .../robotInteractionCockpitFunctionality.js} | 0 6 files changed, 123 insertions(+), 98 deletions(-) create mode 100644 frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx rename frontend/src/components/pages/RobotInteractionCockpit/{RobotLogCard.jsx => RobotInteractionSections/RobotInteractionExecutionSection/singleComponents/RobotLogEntryCard.jsx} (100%) rename frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/{ => RobotInteractionInputSection}/RobotInteractionInputSection.jsx (87%) rename frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/{RobotInteractionComponents/RobotInteractionInputParameter.jsx => RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx} (94%) rename frontend/src/{components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js => utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js} (100%) diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index 2ea21fac..0b25a136 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -1,25 +1,17 @@ /* eslint-disable react/destructuring-assignment */ -/* eslint-disable no-plusplus */ import React, { useState, useEffect, useRef } from 'react'; -import { Layout, Card, Steps, Space, Button, Typography, Row, Col } from 'antd'; -import { - CheckCircleOutlined, - CloseCircleOutlined, - Loading3QuartersOutlined, - PauseCircleOutlined, -} from '@ant-design/icons'; +import { Layout, Card, Steps, Space, Button, Typography } from 'antd'; import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; -import RobotInteractionInputSection from './RobotInteractionSections/RobotInteractionInputSection'; +import RobotInteractionInputSection from './RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection'; +import RobotInteractionExecutionSection from './RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection'; import { isRobotExecutable } from '../../../utils/componentsFunctionality/robotExecutionFunctionality/robotExecution'; import { startRobotForUser } from '../../../api/socketHandler/socketEmitter'; -import { getActivityAndParameterInformation } from './RobotInteractionCockpitFunctionality'; +import { getActivityAndParameterInformation } from '../../../utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality'; import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; import { newRobotMonitorUpdate, newRobotStatusUpdate, } from '../../../api/socketHandler/socketListeners'; -import RobotLogCard from './RobotLogCard'; -import styles from './RobotInteractionCockpit.module.css'; const { Step } = Steps; const { Title } = Typography; @@ -88,7 +80,7 @@ const RobotInteractionCockpit = (match) => { const updateParameterValue = (parameterId, value) => { const currentParameters = [...parameters]; let found = false; - for (let i = 0; i < currentParameters.length; i++) { + for (let i = 0; i < currentParameters.length; i += 1) { if (currentParameters[i].parameterId === parameterId) { found = true; break; @@ -108,42 +100,6 @@ const RobotInteractionCockpit = (match) => { setParameters(currentParameters); }; - const displayStatusIcon = (status) => { - if (status === 'PASS' || status === 'successful') { - return ( - - ); - } - if (status === 'FAIL' || status === 'failed') { - return ( - - ); - } - if (status === 'running') { - return ( - - ); - } - if (status === 'waiting') { - return ( - - ); - } - return undefined; - }; - return ( @@ -179,52 +135,10 @@ const RobotInteractionCockpit = (match) => { )} {currentStep !== 0 && ( - <> - - - - Robot Status - - - - - - {robotState.toLocaleUpperCase()} - - - {displayStatusIcon(robotState)} - - - - - - Robot Run Logs - - {logs.robot_run && - logs.robot_run.activities.map((log) => ( - - ))} - - - + )} diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx new file mode 100644 index 00000000..7fff7b45 --- /dev/null +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -0,0 +1,111 @@ +import React from 'react'; +import { Col, Row, Typography, Card } from 'antd'; +import { + CheckCircleOutlined, + CloseCircleOutlined, + Loading3QuartersOutlined, + PauseCircleOutlined, +} from '@ant-design/icons'; +import PropTypes from 'prop-types'; +import RobotLogEntryCard from './singleComponents/RobotLogEntryCard'; +import styles from '../../RobotInteractionCockpit.module.css'; + +const { Title } = Typography; +/** + * @description Renders the robot logs and robot status while execution + * @category Frontend + * @component + */ +const RobotInteractionExecutionSection = (props) => { + const { executionLogs } = props; + const { robotState } = props; + + const displayStatusIcon = (status) => { + if (status === 'PASS' || status === 'successful') { + return ( + + ); + } + if (status === 'FAIL' || status === 'failed') { + return ( + + ); + } + if (status === 'running') { + return ( + + ); + } + if (status === 'waiting') { + return ( + + ); + } + return undefined; + }; + + return ( + <> + + + + Robot Status + + + + + + {robotState.toLocaleUpperCase()} + + + {displayStatusIcon(robotState)} + + + + + + Robot Run Logs + + {executionLogs.robot_run && + executionLogs.robot_run.activities.map((log) => ( + + ))} + + + + ); +}; + +RobotInteractionExecutionSection.propTypes = { + executionLogs: PropTypes.objectOf(PropTypes.shape).isRequired, + robotState: PropTypes.string.isRequired, +}; + +export default RobotInteractionExecutionSection; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/singleComponents/RobotLogEntryCard.jsx similarity index 100% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotLogCard.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/singleComponents/RobotLogEntryCard.jsx diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx similarity index 87% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx index 3f0ad50b..27af5305 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Typography, Space } from 'antd'; -import RobotInteractionInputParameter from './RobotInteractionComponents/RobotInteractionInputParameter'; +import RobotInteractionInputParameter from './singleComponents/RobotInteractionParameterInput'; const { Title } = Typography; /** - * @description Renders the name input field with the corresponding label. + * @description Renders all necessary input fields for inserting the missing parameters before execution * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx similarity index 94% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx index 4b2d28f4..ebf48562 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Typography, Input, Tooltip } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import corporateDesign from '../../../../../layout/corporateDesign'; +import corporateDesign from '../../../../../../layout/corporateDesign'; const { Text } = Typography; /** diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js b/frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js similarity index 100% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js rename to frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js From 1e18afb1d3b22b8d291b9c2a682a26fdfba20d4a Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 14:22:50 +0200 Subject: [PATCH 015/149] refactor backend --- .../__tests__/SsotForTesting.json | 47 +++ .../__tests__/SsotToRobotParser.test.js | 122 ++++++ .../ssotToRobotParsing/generateCodeBase.js | 96 +++++ .../generateCodeForRpaTasks.js | 175 +++++++++ .../ssotToRobotParsing/retrieveParameters.js | 102 +++++ .../ssotToRobotParsing/robotCodeConstants.js | 13 + .../ssotToRobotParsing/ssotToRobotParser.js | 77 ++++ server/utils/.keep | 0 server/utils/testingUtils/databaseLoader.js | 67 ++++ server/utils/testingUtils/testData.js | 349 ++++++++++++++++++ .../utils/testingUtils/testDatabaseHandler.js | 48 +++ server/utils/testingUtils/testRobotFile.txt | 12 + 12 files changed, 1108 insertions(+) create mode 100644 server/services/ssotToRobotParsing/__tests__/SsotForTesting.json create mode 100644 server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js create mode 100644 server/services/ssotToRobotParsing/generateCodeBase.js create mode 100644 server/services/ssotToRobotParsing/generateCodeForRpaTasks.js create mode 100644 server/services/ssotToRobotParsing/retrieveParameters.js create mode 100644 server/services/ssotToRobotParsing/robotCodeConstants.js create mode 100644 server/services/ssotToRobotParsing/ssotToRobotParser.js delete mode 100644 server/utils/.keep create mode 100644 server/utils/testingUtils/databaseLoader.js create mode 100644 server/utils/testingUtils/testData.js create mode 100644 server/utils/testingUtils/testDatabaseHandler.js create mode 100644 server/utils/testingUtils/testRobotFile.txt diff --git a/server/services/ssotToRobotParsing/__tests__/SsotForTesting.json b/server/services/ssotToRobotParsing/__tests__/SsotForTesting.json new file mode 100644 index 00000000..8eca9421 --- /dev/null +++ b/server/services/ssotToRobotParsing/__tests__/SsotForTesting.json @@ -0,0 +1,47 @@ +{ + "id": "606199015d691786a44a608f", + "starterId": "Event_1wm4a0f", + "robotName": "Sandros Testbot", + "elements": [ + { + "predecessorIds": [], + "successorIds": ["Activity_1elomab"], + "_id": "6062f0ad92ffd3044c6ee382", + "type": "MARKER", + "name": "Start Event", + "id": "Event_1wm4a0f" + }, + { + "predecessorIds": ["Event_1wm4a0f"], + "successorIds": ["Activity_175v5b5"], + "_id": "6062f0ad92ffd3044c6ee383", + "type": "INSTRUCTION", + "name": "FirstActivity", + "id": "Activity_1elomab" + }, + { + "predecessorIds": ["Activity_1elomab"], + "successorIds": ["Activity_1x8wlwh"], + "_id": "6062f0ad92ffd3044c6ee384", + "type": "INSTRUCTION", + "name": "SecondActivity", + "id": "Activity_175v5b5" + }, + { + "predecessorIds": ["Activity_175v5b5"], + "successorIds": ["Event_1cuknwt"], + "_id": "6062f0ad92ffd3044c6ee385", + "type": "INSTRUCTION", + "name": "ThirdActivity", + "id": "Activity_1x8wlwh" + }, + { + "predecessorIds": ["Activity_1x8wlwh"], + "successorIds": [], + "_id": "6062f0ad92ffd3044c6ee386", + "type": "MARKER", + "name": "finished", + "id": "Event_1cuknwt" + } + ] +} diff --git a/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js new file mode 100644 index 00000000..b7bd4b40 --- /dev/null +++ b/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -0,0 +1,122 @@ +/* eslint-disable no-undef */ +const parser = require('../SsotToRobotParser'); +const testSsot = require('./SsotForTesting.json'); +const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); +const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const { + testRobotId, + testJobId, + testRobotCode, +} = require('../../../utils/TestingUtils/testData'); + +const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; +const OPEN_WORKBOOK_CMD = 'Open Workbook'; +const EXCEL1_ACTIVITY_PARAM = 'C://Users/Filepath'; + +const EXCEL2_ACTIVITY_NAME = 'SecondActivity'; +const FIND_EMPTY_ROW_CMD = 'Find Empty Row'; +const EXCEL2_ACTIVITY_PARAM = 'StonksOnlyGoUp.xls'; + +const BROWSER_ACTIVITY_NAME = 'ThirdActivity'; +const OPEN_BROWSER_CMD = 'Open Browser'; +const BROWSER_ACTIVITY_PARAM = 'http://localhost:3000'; + +const LIBRARY_EXCEL = 'Library RPA.Excel.Application'; +const LIBRARY_BROWSER = 'Library RPA.Browser'; +const SETTING_STRING = '*** Settings ***'; +const TASK_STRING = '*** Tasks ***'; + +/** + * Connect to a new in-memory database before running any tests. + */ +beforeAll(async () => dbHandler.connect()); + +/** + * Clear all test data after every test. + */ +afterEach(async () => dbHandler.clearDatabase()); + +/** + * Remove and close the db and server. + */ +afterAll(async () => dbHandler.closeDatabase()); + +describe('Ssot Parsing', () => { + it('parses all the elements of the ssot correctly', async () => { + await dbLoader.loadAttributesInDb(); + await dbLoader.loadParametersInDb(); + + const parserResultString = await parser.parseSsotToRobotCode(testSsot); + + expect(parserResultString).toMatch(SETTING_STRING); + expect(parserResultString).toMatch(LIBRARY_EXCEL); + + expect(parserResultString).toMatch(EXCEL1_ACTIVITY_NAME); + expect(parserResultString).toMatch(OPEN_WORKBOOK_CMD); + expect(parserResultString).toMatch(EXCEL1_ACTIVITY_PARAM); + + expect(parserResultString).toMatch(EXCEL2_ACTIVITY_NAME); + expect(parserResultString).toMatch(FIND_EMPTY_ROW_CMD); + expect(parserResultString).toMatch(EXCEL2_ACTIVITY_PARAM); + + expect(parserResultString).toMatch(BROWSER_ACTIVITY_NAME); + expect(parserResultString).toMatch(OPEN_BROWSER_CMD); + expect(parserResultString).toMatch(BROWSER_ACTIVITY_PARAM); + }); + + it('parses all the elements of the ssot in the correct order', async () => { + await dbLoader.loadAttributesInDb(); + await dbLoader.loadParametersInDb(); + + const parserResultString = await parser.parseSsotToRobotCode(testSsot); + + expect(parserResultString.indexOf(SETTING_STRING)).toBeLessThan( + parserResultString.indexOf(TASK_STRING) + ); + expect(parserResultString.indexOf(LIBRARY_BROWSER)).toBeLessThan( + parserResultString.indexOf(TASK_STRING) + ); + expect(parserResultString.indexOf(LIBRARY_EXCEL)).toBeLessThan( + parserResultString.indexOf(TASK_STRING) + ); + + expect(parserResultString.indexOf(EXCEL1_ACTIVITY_NAME)).toBeLessThan( + parserResultString.lastIndexOf(OPEN_WORKBOOK_CMD) + ); + expect(parserResultString.indexOf(OPEN_WORKBOOK_CMD)).toBeLessThan( + parserResultString.lastIndexOf(EXCEL1_ACTIVITY_PARAM) + ); + + expect(parserResultString.indexOf(EXCEL2_ACTIVITY_NAME)).toBeLessThan( + parserResultString.indexOf(FIND_EMPTY_ROW_CMD) + ); + expect(parserResultString.indexOf(FIND_EMPTY_ROW_CMD)).toBeLessThan( + parserResultString.indexOf(EXCEL2_ACTIVITY_PARAM) + ); + + expect(parserResultString.indexOf(BROWSER_ACTIVITY_NAME)).toBeLessThan( + parserResultString.lastIndexOf(OPEN_BROWSER_CMD) + ); + expect(parserResultString.indexOf(OPEN_BROWSER_CMD)).toBeLessThan( + parserResultString.lastIndexOf(BROWSER_ACTIVITY_PARAM) + ); + }); + + it('parses all the elements of the ssot and job object correctly', async () => { + await dbLoader.loadSsotInDb(); + await dbLoader.loadAttributesInDb(); + await dbLoader.loadParametersInDb(); + await dbLoader.loadJobInDb(); + await dbLoader.loadTasksInDb(); + + const parserResultString = await parser.parseCodeForJob( + testRobotId, + testJobId + ); + expect(parserResultString).not.toBeUndefined(); + expect(parserResultString).not.toBeNull(); + expect(String(parserResultString).replace(/\s/g, '')).toEqual( + String(testRobotCode).replace(/\s/g, '') + ); + }); +}); diff --git a/server/services/ssotToRobotParsing/generateCodeBase.js b/server/services/ssotToRobotParsing/generateCodeBase.js new file mode 100644 index 00000000..5038137e --- /dev/null +++ b/server/services/ssotToRobotParsing/generateCodeBase.js @@ -0,0 +1,96 @@ +/** + * @category Server + * @module + */ +const mongoose = require('mongoose'); +const { + ACTIVITY_IDENTIFIER, + FOURSPACE, + LINEBREAK, +} = require('./robotCodeConstants'); + +// eslint-disable-next-line no-unused-vars +const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); + +/** + * @description Collects the applications used by the robot + * @param {Array} elements All the elements from the SSoT + * @returns {Array} All unique Applications that occur in the ssot + */ +const collectApplications = (elements) => { + const applications = []; + if (elements !== undefined && elements.length > 0) { + elements.forEach((element) => { + if ( + element.rpaApplication !== undefined && + !applications.includes(element.rpaApplication) + ) { + applications.push(element.rpaApplication); + } + }); + } + return applications; +}; + +/** + * @description Generates the Library Import Code of the .robot file + * @param {Array} elements All the elements from the SSoT + * @returns {string} Library Import Code that has to be put in .robot file + */ +const generateCodeForLibraryImports = (elements) => { + let libraryImports = ''; + const applications = collectApplications(elements); + if (applications.length > 0) { + Object.values(applications).forEach((application) => { + libraryImports += `Library${FOURSPACE}RPA.${application}${LINEBREAK}`; + }); + } + + return libraryImports; +}; + +/** + * @description For all activities in the ssot this method will retrieve the associated parameter objects + * @param {Object} ssot The ssot for which the parameters should be retrieved + * @returns {Array} Array of attribute objects + */ +const retrieveAttributes = async (ssot) => { + const { id } = ssot; + const { elements } = ssot; + const listOfActivityIds = []; + + elements.forEach((element) => { + if (element.type === ACTIVITY_IDENTIFIER) { + listOfActivityIds.push(element.id); + } + }); + + const attributeObjects = await mongoose + .model('rpaAttributes') + .find({ + robotId: id, + activityId: { $in: listOfActivityIds }, + }) + .exec(); + + return attributeObjects; +}; + +/** + * @description Generates that basic code that every robot has + * @param {Object} ssot The ssot + * @returns {string} Basic code for the .robot file + */ +const generateCodeBase = async (ssot) => { + let parsedCode = ''; + parsedCode += `*** Settings ***${LINEBREAK}`; + const attributeObjects = await retrieveAttributes(ssot); + parsedCode += generateCodeForLibraryImports(attributeObjects); + // ideally we use the keyword statement for each task, currently not working out of the box + parsedCode += `${LINEBREAK}*** Tasks ***${LINEBREAK}`; + return { parsedCode, attributeObjects }; +}; + +module.exports = { + generateCodeBase, +}; diff --git a/server/services/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/services/ssotToRobotParsing/generateCodeForRpaTasks.js new file mode 100644 index 00000000..9bf5064d --- /dev/null +++ b/server/services/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -0,0 +1,175 @@ +/** + * @category Server + * @module + */ +const mongoose = require('mongoose'); +const { + ACTIVITY_IDENTIFIER, + FOURSPACE, + LINEBREAK, +} = require('./robotCodeConstants'); +// eslint-disable-next-line no-unused-vars +const rpaModels = require('../../api/models/rpaTaskModel'); + +/** + * @description Checks whether the given element is of type instruction and contains rpa attributes + * @param {Object} currentElement Element to check + * @returns {Boolean} Value specifies if object is of type instruction and contains rpa attributes + */ +const isAnRpaInstruction = (currentElement) => + currentElement.type === ACTIVITY_IDENTIFIER; + +/** + * @description Will create a prefix to catch the output variable of an activity, if one is present + * @param {Object} paramObject The parameter object to check and loop through + * @returns {String} String specifying the output variables name + */ +const setOutputVar = (paramObject) => { + let newCodeLine = FOURSPACE; + + if (paramObject.outputVariable) { + newCodeLine += `\${${paramObject.outputVariable}} = `; + } + return newCodeLine; +}; + +/** + * @description Will append all provided parameters to a string which can be used to generate the RPAf file + * @param {Object} parameterObject The parameter object to check and loop through + * @returns {String} String specifying the input parameters with the needed spacing in between + */ +const appendRpaInputParameter = (parameterObject) => { + let newCodeLine = ''; + + const sortedInputs = parameterObject.rpaParameters.sort( + (a, b) => a.index - b.index + ); + sortedInputs.forEach((parameter) => { + newCodeLine += FOURSPACE; + if (parameter.requireUserInput && parameter.value === '') { + newCodeLine += `!!${parameter.name}!!`; + return; + } + if (parameter.value === '') { + newCodeLine += `%%${parameter.name}%%`; + return; + } + if (parameter.value.search(/\$\$(.*?)\$\$/) >= 0) { + // eslint-disable-next-line no-useless-escape + newCodeLine += `$\{${parameter.value.split('$$')[1]}\}`; + return; + } + + newCodeLine += parameter.value; + }); + + return newCodeLine; +}; + +/** + * @description Checks whether the given element has a successor element + * @param {Object} currentElement Element to check + * @returns {Boolean} Value specifies if element has a successor element + */ +const successorTasksExist = (currentElement) => + currentElement.successorIds !== undefined && + currentElement.successorIds[0] !== ''; + +/** + * @description Receives an array of all elements and generates the .robot code for the elements recursively. + * @param {String} id Id of the element we are looking for + * @param {Array} elements All the elements from the ssot + * @param {Array} parameters All parameter objects of the robot + * @param {Array} attributes All attribute objects of the robot + * @param {String} codeToAppend The current code we want to extend + * @returns {string} Generated .robot code for the tasks section + */ +const writeCodeForElement = ( + id, + elements, + parameters, + attributes, + codeToAppend, + duplicateTasks +) => { + const currentElement = elements.find((element) => element.id === id); + let combinedCode = codeToAppend; + let newCodeLine = ''; + if (isAnRpaInstruction(currentElement)) { + const currentAttributeObject = attributes.find( + (attribute) => attribute.activityId === id + ); + if (currentAttributeObject) { + newCodeLine += currentElement.name + LINEBREAK; + const currentParameterObject = parameters.find( + (parameter) => parameter.activityId === id + ); + if (currentParameterObject) { + newCodeLine += setOutputVar(currentParameterObject); + } + if (duplicateTasks.includes(currentAttributeObject.rpaTask)) { + newCodeLine += `RPA.${currentAttributeObject.rpaApplication}.${currentAttributeObject.rpaTask}`; + } else { + newCodeLine += currentAttributeObject.rpaTask; + } + if (currentParameterObject) { + newCodeLine += appendRpaInputParameter(currentParameterObject); + } + + newCodeLine += LINEBREAK; + combinedCode += newCodeLine; + } + } + + if (successorTasksExist(currentElement)) { + // Xor handling is needed here in the future + currentElement.successorIds.forEach((successorId) => { + combinedCode = writeCodeForElement( + successorId, + elements, + parameters, + attributes, + combinedCode, + duplicateTasks + ); + }); + } + return combinedCode.endsWith(LINEBREAK) + ? combinedCode.slice(0, -1) + : combinedCode; +}; + +/** + * @description Receives an array of all elements and generates the .robot code for all RPA Tasks + * @param {Array} elements All the elements from the SSoT + * @param {Object} metaData MetaData of the robot + * @returns {string} Generated .robot code for the tasks section + */ +const generateCodeForRpaTasks = async (elements, parameters, attributes) => { + const startElement = elements.find( + (element) => element.predecessorIds.length === 0 + ); + + const groupedByTask = await mongoose + .model('rpa-task') + .aggregate([{ $group: { _id: '$Task', count: { $sum: 1 } } }]); + const listOfDuplicates = groupedByTask + .filter((singleTask) => singleTask.count > 1) + // eslint-disable-next-line no-underscore-dangle + .map((singleDuplicateTask) => singleDuplicateTask._id); + + const codeForRpaTasks = writeCodeForElement( + startElement.id, + elements, + parameters, + attributes, + '', + listOfDuplicates + ); + + return codeForRpaTasks; +}; + +module.exports = { + generateCodeForRpaTasks, +}; diff --git a/server/services/ssotToRobotParsing/retrieveParameters.js b/server/services/ssotToRobotParsing/retrieveParameters.js new file mode 100644 index 00000000..2e90220a --- /dev/null +++ b/server/services/ssotToRobotParsing/retrieveParameters.js @@ -0,0 +1,102 @@ +/** + * @category Server + * @module + */ +const mongoose = require('mongoose'); +const { ACTIVITY_IDENTIFIER } = require('./robotCodeConstants'); +// eslint-disable-next-line no-unused-vars +const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); +// eslint-disable-next-line no-unused-vars +const jobsModel = require('../../api/models/robotJobModel.js'); + +/** + * @description For all activities in the ssot this method will retrieve the associated parameter objects + * @param {Object} ssot The ssot for which the parameters should be retrieved + * @returns {Array} Array of parameter objects + */ +const retrieveParameters = async (ssot) => { + const { id } = ssot; + const { elements } = ssot; + const listOfActivityIds = []; + + elements.forEach((element) => { + if (element.type === ACTIVITY_IDENTIFIER) { + listOfActivityIds.push(element.id); + } + }); + + const parameterObjects = await mongoose + .model('parameter') + .find( + { + robotId: id, + activityId: { $in: listOfActivityIds }, + }, + { + activityId: 1, + rpaParameters: 1, + outputVariable: 1, + } + ) + .exec(); + + return parameterObjects; +}; + +/** + * @description Update Parameter Objects with new parameters + * @param {Array} parameterObjects The selection of parameter objects this function will have a look at + * @param {Array} newParameters New parameters in the form {id, value} that the function will use to update the parameter objects + */ +const updateParameterObjects = (parameterObjects, newParameters) => { + parameterObjects.map((parameterObject) => { + if (parameterObject.rpaParameters.length !== 0) { + parameterObject.rpaParameters.map((currentParameter) => { + newParameters.forEach((newParameter) => { + if ( + // eslint-disable-next-line no-underscore-dangle + String(newParameter.parameterId) === String(currentParameter._id) + ) { + // eslint-disable-next-line no-param-reassign + currentParameter.value = newParameter.value; + } + }); + return currentParameter; + }); + } + return parameterObject; + }); + return parameterObjects; +}; + +/** + * @description Retrieve all parameters for a specific job + * @param {String} jobId The id of the job + */ +const getAllParametersForJob = async (jobId) => { + const jobParametersObject = await mongoose + .model('job') + .findById(jobId, { parameters: 1 }); + return jobParametersObject.parameters; +}; + +/** + * @description For all activities in the ssot this method will retrieve the associated parameter objects + * @param {Object} ssot The ssot for which the parameters should be retrieved + * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters + * @returns {Array} Array of parameter objects + */ +const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { + const parameterObjects = await retrieveParameters(ssot); + const newParameters = await getAllParametersForJob(jobId); + const parameterObjectsUpdated = await updateParameterObjects( + parameterObjects, + newParameters + ); + return parameterObjectsUpdated; +}; + +module.exports = { + retrieveParameters, + retrieveParametersFromSsotAndJob, +}; diff --git a/server/services/ssotToRobotParsing/robotCodeConstants.js b/server/services/ssotToRobotParsing/robotCodeConstants.js new file mode 100644 index 00000000..c09918af --- /dev/null +++ b/server/services/ssotToRobotParsing/robotCodeConstants.js @@ -0,0 +1,13 @@ +const ACTIVITY_IDENTIFIER = 'INSTRUCTION'; +const LINEBREAK = '\n'; +const COMMENT = '#'; +const DOUBLESPACE = ' '; +const FOURSPACE = ' '; + +module.exports = { + ACTIVITY_IDENTIFIER, + LINEBREAK, + COMMENT, + DOUBLESPACE, + FOURSPACE, +}; diff --git a/server/services/ssotToRobotParsing/ssotToRobotParser.js b/server/services/ssotToRobotParsing/ssotToRobotParser.js new file mode 100644 index 00000000..4343b85b --- /dev/null +++ b/server/services/ssotToRobotParsing/ssotToRobotParser.js @@ -0,0 +1,77 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-useless-escape */ +/** + * @category Server + * @module + */ +const mongoose = require('mongoose'); +const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); +const jobsModel = require('../../api/models/robotJobModel.js'); +const { generateCodeBase } = require('./generateCodeBase'); +const { + retrieveParameters, + retrieveParametersFromSsotAndJob, +} = require('./retrieveParameters'); +const { generateCodeForRpaTasks } = require('./generateCodeForRpaTasks'); + +/** + * @description Parses the given SSoT to an executable .robot file + * @param {Object} ssot The SSoT + * @returns {string} Code that has to be put in .robot file + */ +const parseSsotToRobotCode = async (ssot) => { + // eslint-disable-next-line prefer-const + const result = await generateCodeBase(ssot); + const parameters = await retrieveParameters(ssot); + result.parsedCode += await generateCodeForRpaTasks( + ssot.elements, + parameters, + result.attributeObjects + ); + return result.parsedCode; +}; + +/** + * @description Parses the given SSoT and parameters of the robot job to an executable .robot file + * @param {Object} ssot The SSoT + * @param {Object} jobId The id of the job + * @returns {string} Code that has to be put in .robot file + */ +const parseSsotAndJobToRobotCode = async (ssot, jobId) => { + // eslint-disable-next-line prefer-const + const result = await generateCodeBase(ssot); + const parameters = await retrieveParametersFromSsotAndJob(ssot, jobId); + result.parsedCode += await generateCodeForRpaTasks( + ssot.elements, + parameters, + result.attributeObjects + ); + return result.parsedCode; +}; + +/** + * @description Parses the SSoT provided by its id to an executable .robot file + * @param {String} robotId The id of the ssot which should be parsed + * @returns {string} Code that has to be put in .robot file + */ +const parseSsotById = async (robotId) => { + const ssot = await mongoose.model('SSoT').findById(robotId).exec(); + return parseSsotToRobotCode(ssot); +}; + +/** + * @description Parses the SSoT provided by its id to an executable .robot file + * @param {String} robotId The id of the ssot which should be parsed + * @param {String} jobId The id of the current robotJob that is to be executed + * @returns {string} Code that has to be put in .robot file + */ +const parseCodeForJob = async (robotId, jobId) => { + const ssot = await mongoose.model('SSoT').findById(robotId).exec(); + return parseSsotAndJobToRobotCode(ssot, jobId); +}; + +module.exports = { + parseSsotToRobotCode, + parseSsotById, + parseCodeForJob, +}; diff --git a/server/utils/.keep b/server/utils/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/server/utils/testingUtils/databaseLoader.js b/server/utils/testingUtils/databaseLoader.js new file mode 100644 index 00000000..ac4efc43 --- /dev/null +++ b/server/utils/testingUtils/databaseLoader.js @@ -0,0 +1,67 @@ +const mongoose = require('mongoose'); +const testData = require('./testData'); + +const loadSsotInDb = async () => { + const SsotModel = mongoose.model('SSoT'); + const ssot = new SsotModel(testData.testSsot); + await ssot.save(); +}; + +const loadUserAccessObjectsInDb = async () => { + const UserAccessObjectModel = mongoose.model('userAccessObject'); + const userAccessObject = UserAccessObjectModel(testData.testUserAccessObject); + await userAccessObject.save(); + const userAccessObject2 = UserAccessObjectModel( + testData.testUserAccessObject2 + ); + await userAccessObject2.save(); +}; + +const loadJobInDb = async () => { + const JobModel = mongoose.model('job'); + const job = new JobModel(testData.testJob); + await job.save(); +}; + +const loadAttributesInDb = async () => { + const RpaAttribute = mongoose.model('rpaAttributes'); + const rpaAttribute = new RpaAttribute(testData.testAttributes1); + await rpaAttribute.save(); + const rpaAttribute2 = new RpaAttribute(testData.testAttributes2); + await rpaAttribute2.save(); + const rpaAttribute3 = new RpaAttribute(testData.testAttributes3); + await rpaAttribute3.save(); +}; + +const loadParametersInDb = async () => { + const RpaParam = mongoose.model('parameter'); + const rpaParamter = new RpaParam(testData.testParameter1); + await rpaParamter.save(); + const rpaParamter2 = new RpaParam(testData.testParameter2); + await rpaParamter2.save(); + const rpaParamter3 = new RpaParam(testData.testParameter3); + await rpaParamter3.save(); +}; + +const loadTasksInDb = async () => { + const RpaTask = mongoose.model('rpa-task'); + const rpaTask = await new RpaTask(testData.testRpaTask1); + await rpaTask.save(); + const rpaTask2 = await new RpaTask(testData.testRpaTask2); + await rpaTask2.save(); + const rpaTask3 = await new RpaTask(testData.testRpaTask3); + await rpaTask3.save(); + const rpaTask4 = await new RpaTask(testData.testRpaTask4); + await rpaTask4.save(); + const rpaTask5 = await new RpaTask(testData.testRpaTask5); + await rpaTask5.save(); +}; + +module.exports = { + loadJobInDb, + loadUserAccessObjectsInDb, + loadSsotInDb, + loadAttributesInDb, + loadParametersInDb, + loadTasksInDb, +}; diff --git a/server/utils/testingUtils/testData.js b/server/utils/testingUtils/testData.js new file mode 100644 index 00000000..d1ec8511 --- /dev/null +++ b/server/utils/testingUtils/testData.js @@ -0,0 +1,349 @@ +const testUserId = '604a3ba6561e2d1fad4eda60'; +const user2Id = '604a3ba6561e2d1fad4eda00'; + +const testRobotId = '606199015d691786a44a608f'; +const testJobId = '605c68a86d596e0d6bed0077'; + +const testSsot = { + id: testRobotId, + _id: testRobotId, // needed because we sometimes access the id with _id, sometimes with id + starterId: 'Event_1wm4a0f', + robotName: 'Sandros Testbot', + elements: [ + { + predecessorIds: [], + successorIds: ['Activity_1elomab'], + _id: '6062f0ad92ffd3044c6ee382', + type: 'MARKER', + name: 'Start Event', + id: 'Event_1wm4a0f', + }, + { + predecessorIds: ['Event_1wm4a0f'], + successorIds: ['Activity_175v5b5'], + _id: '6062f0ad92ffd3044c6ee383', + type: 'INSTRUCTION', + name: 'FirstActivity', + id: 'Activity_1elomab', + }, + { + predecessorIds: ['Activity_1elomab'], + successorIds: ['Activity_1x8wlwh'], + _id: '6062f0ad92ffd3044c6ee384', + type: 'INSTRUCTION', + name: 'SecondActivity', + id: 'Activity_175v5b5', + }, + { + predecessorIds: ['Activity_175v5b5'], + successorIds: ['Event_1cuknwt'], + _id: '6062f0ad92ffd3044c6ee385', + type: 'INSTRUCTION', + name: 'ThirdActivity', + id: 'Activity_1x8wlwh', + }, + { + predecessorIds: ['Activity_1x8wlwh'], + successorIds: [], + _id: '6062f0ad92ffd3044c6ee386', + type: 'MARKER', + name: 'finished', + id: 'Event_1cuknwt', + }, + ], +}; + +const testUserAccessObject = { + AccessLevel: '0', + robotId: testRobotId, + userId: testUserId, +}; + +const testUserAccessObject2 = { + AccessLevel: '0', + robotId: '604a3ba6561e2d1fad4eda11', + userId: user2Id, +}; + +const numberOfTestTasks = 5; +const testRpaTask1 = { + Application: 'Browser', + Task: 'Click Button', + Code: 'Click Button', + outputValue: false, + inputVars: [ + { + name: 'path', + type: 'String', + isRequired: true, + infoText: 'Path to button', + index: 0, + }, + ], +}; + +const testRpaTask2 = { + Application: 'Excel', + Task: 'Input Text', + Code: 'Input Text', + outputValue: false, + inputVars: [ + { + name: 'coloumn', + type: 'Integer', + isRequired: true, + infoText: 'Target Coloumn', + index: 0, + }, + { + name: 'row', + type: 'Integer', + isRequired: true, + infoText: 'Target row', + index: 1, + }, + ], +}; + +const testRpaTask3 = { + Application: 'Browser', + Task: 'Input Password', + Code: 'Input Password', + outputValue: false, + inputVars: [ + { + name: 'password', + type: 'String', + isRequired: true, + infoText: 'password', + index: 0, + }, + ], +}; + +const testRpaTask4 = { + Application: 'Excel.Application', + Task: 'Open Workbook', + Code: 'Open Workbook', + outputValue: false, + inputVars: [ + { + name: 'path', + type: 'String', + isRequired: true, + infoText: 'path', + index: 0, + }, + ], +}; + +const testRpaTask5 = { + Application: 'Excel.Files', + Task: 'Open Workbook', + Code: 'Open Workbook', + outputValue: false, + inputVars: [ + { + name: 'path', + type: 'String', + isRequired: true, + infoText: 'path', + index: 0, + }, + ], +}; + +const testJob = { + _id: testJobId, + __v: 0, + user_id: testUserId, + robot_id: testRobotId, + status: 'waiting', + parameters: [ + { + _id: '60780432cb11ef12444785ee', + parameterId: '6062f0ad92ffd3044c6ee387', + value: 'TESTVALUE', + }, + ], + loggedErrors: [], +}; + +const testAttributes1 = { + _id: '6062f0ad1abb38158c2dfa41', + activityId: 'Activity_1elomab', + robotId: testRobotId, + rpaApplication: 'Excel.Application', + rpaTask: 'Open Workbook', + __v: 0, +}; + +const testAttributes2 = { + _id: '6062f0ad1abb38158c2dfa42', + activityId: 'Activity_175v5b5', + robotId: testRobotId, + rpaApplication: 'Excel.Application', + rpaTask: 'Find Empty Row', + __v: 0, +}; + +const testAttributes3 = { + _id: '6062f0ad1abb38158c2dfa43', + activityId: 'Activity_1x8wlwh', + robotId: testRobotId, + rpaApplication: 'Browser', + rpaTask: 'Open Browser', + __v: 0, +}; + +const testParameter1 = { + _id: '6062f0ad1abb38158c2dfa69', + __v: 0, + activityId: 'Activity_1elomab', + robotId: '606199015d691786a44a608f', + rpaParameters: [ + { + _id: '6062f0ad92ffd3044c6ee389', + name: 'filename', + type: 'String', + isRequired: true, + infoText: 'Path to filename', + index: 0, + value: 'C://Users/Filepath', + }, + ], +}; + +const testParameter2 = { + _id: '6062f0ad1abb38158c2dfa68', + __v: 0, + activityId: 'Activity_175v5b5', + robotId: '606199015d691786a44a608f', + rpaParameters: [ + { + _id: '6062f0ad92ffd3044c6ee388', + name: 'filename', + type: 'String', + isRequired: true, + infoText: 'Find Empty Row', + index: 0, + value: 'StonksOnlyGoUp.xls', + }, + ], +}; + +const testParameter3 = { + _id: '6062f0ad1abb38158c2dfa67', + __v: 0, + activityId: 'Activity_1x8wlwh', + robotId: testRobotId, + rpaParameters: [ + { + _id: '6062f0ad92ffd3044c6ee387', + name: 'save_changes', + type: 'Boolean', + isRequired: true, + infoText: 'Open Browser', + index: 0, + value: 'http://localhost:3000', + requireUserInput: true, + }, + ], +}; + +const testRobotCode = + '*** Settings *** Library RPA.Excel.Application Library RPA.Browser *** Tasks *** FirstActivity RPA.Excel.Application.Open Workbook C://Users/Filepath SecondActivity Find Empty Row StonksOnlyGoUp.xls ThirdActivity Open Browser TESTVALUE'; + +const failingRobotRunLog = { + robot_run: { + name: 'DanielTest2', + activity_count: 8, + activities: [ + { + activity_name: 'Browser1', + tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], + status: 'PASS', + message: '', + }, + { + activity_name: 'Say hello', + tasks: [{ task_name: 'Open Workbook', status: 'PASS' }], + status: 'PASS', + message: '', + }, + { + activity_name: 'Say Goodbye!', + tasks: [ + { task_name: 'Set Worksheet Value', status: 'PASS' }, + { task_name: 'Set Worksheet Value', status: 'PASS' }, + ], + status: 'PASS', + message: '', + }, + { + activity_name: 'Browser2', + tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], + status: 'PASS', + message: '', + }, + { + activity_name: 'Browser3', + tasks: [ + { task_name: 'Open Chro Browser', status: 'FAIL' }, + { task_name: 'Set Worksheet Value', status: 'NOT RUN' }, + ], + status: 'FAIL', + message: + "No keyword with name 'Open Chro Browser' found. Did you mean:\n RPA.Browser.Selenium.Open Chrome Browser", + }, + { + activity_name: 'Interrupt', + tasks: [{ task_name: 'Set Worksheet Value', status: 'PASS' }], + status: 'PASS', + message: '', + }, + { + activity_name: 'Browser4', + tasks: [ + { task_name: 'Open Chrome Browser', status: 'PASS' }, + { task_name: 'Set Worksheet Value', status: 'PASS' }, + ], + status: 'PASS', + message: '', + }, + { + activity_name: 'Save file', + tasks: [{ task_name: 'Save Workbook', status: 'FAIL' }], + status: 'FAIL', + message: 'Test Failing Message', + }, + ], + status: 'FAIL', + }, + final_message: 'Execution completed', +}; + +module.exports = { + testSsot, + testUserAccessObject, + testUserAccessObject2, + testUserId, + user2Id, + testRobotId, + numberOfTestTasks, + testRpaTask1, + testRpaTask2, + testRpaTask3, + testRpaTask4, + testRpaTask5, + testJob, + testJobId, + testAttributes1, + testAttributes2, + testAttributes3, + testParameter1, + testParameter2, + testParameter3, + testRobotCode, + failingRobotRunLog, +}; diff --git a/server/utils/testingUtils/testDatabaseHandler.js b/server/utils/testingUtils/testDatabaseHandler.js new file mode 100644 index 00000000..d92de9e7 --- /dev/null +++ b/server/utils/testingUtils/testDatabaseHandler.js @@ -0,0 +1,48 @@ +const mongoose = require('mongoose'); +const { MongoMemoryServer } = require('mongodb-memory-server'); + +const mongooseOpts = { + useNewUrlParser: true, + useUnifiedTopology: true, +}; + +const mongod = new MongoMemoryServer({ + instance: { + dbName: 'ark-automate', + port: 59051, + }, +}); + +/** + * Connect to the in-memory database. + */ +exports.connect = async () => { + const uri = await mongod.getUri(); + await mongoose.createConnection(uri, mongooseOpts); + await mongoose.connect(uri, mongooseOpts); +}; + +/** + * Drop database, close the connection and stop mongod. + */ +exports.closeDatabase = async () => { + await mongoose.connection.dropDatabase(); + await mongoose.connection.close(); + await mongoose.disconnect(); + await mongod.stop(); +}; + +/** + * Remove all the data for all db collections. + */ +exports.clearDatabase = async () => { + const { collections } = mongoose.connection; + + // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html + const result = []; + for (const key in collections) { + const collection = collections[key]; + result.push(collection.deleteMany()); + } + return Promise.all(result); +}; diff --git a/server/utils/testingUtils/testRobotFile.txt b/server/utils/testingUtils/testRobotFile.txt new file mode 100644 index 00000000..ed758755 --- /dev/null +++ b/server/utils/testingUtils/testRobotFile.txt @@ -0,0 +1,12 @@ +*** Settings *** +Library RPA.Excel.Application +Library RPA.Browser +*** Tasks *** +Excel.Application +#FirstActivity + Open Workbook C://Users/Filepath +#SecondActivity + Find Empty Row StonksOnlyGoUp.xls +Browser +#ThirdActivity + Open Browser TESTVALUE \ No newline at end of file From b7e95eecd6a8271334bdb3daa18211d83e544fae Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 14:23:29 +0200 Subject: [PATCH 016/149] check backendTestingWorkflow --- .github/workflows/backendTesting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backendTesting.yml b/.github/workflows/backendTesting.yml index e1bf5525..c9c810cb 100644 --- a/.github/workflows/backendTesting.yml +++ b/.github/workflows/backendTesting.yml @@ -2,7 +2,7 @@ name: Backend testing on: push: - branches: [DEV] + branches: [DEV, 279_refactor_folder_structure] pull_request: branches: [DEV] workflow_dispatch: From 6c9544271b2b120dcfd5556c8926f1bee36cc676 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 14:28:46 +0200 Subject: [PATCH 017/149] fix backend tests --- server/api/controllers/ssotParsingController.js | 2 +- .../__tests__/SsotToRobotParser.test.js | 8 ++++---- .../__tests__/SsotToRobotParser.test.js | 8 ++++---- server/socket/socketHelperFunctions.js | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/api/controllers/ssotParsingController.js b/server/api/controllers/ssotParsingController.js index 07c272bc..b778c7b0 100644 --- a/server/api/controllers/ssotParsingController.js +++ b/server/api/controllers/ssotParsingController.js @@ -1,4 +1,4 @@ -const ssotToRobotparser = require('../../services/SsotToRobotParsing/SsotToRobotParser.js'); +const ssotToRobotparser = require('../../services/ssotToRobotParsing/ssotToRobotParser.js'); /** * @swagger diff --git a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js index b7bd4b40..3cd66cd4 100644 --- a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -1,13 +1,13 @@ /* eslint-disable no-undef */ -const parser = require('../SsotToRobotParser'); +const parser = require('../ssotToRobotParser'); const testSsot = require('./SsotForTesting.json'); -const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../utils/testingUtils/databaseLoader'); const { testRobotId, testJobId, testRobotCode, -} = require('../../../utils/TestingUtils/testData'); +} = require('../../../utils/testingUtils/testData'); const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; const OPEN_WORKBOOK_CMD = 'Open Workbook'; diff --git a/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js index b7bd4b40..3cd66cd4 100644 --- a/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -1,13 +1,13 @@ /* eslint-disable no-undef */ -const parser = require('../SsotToRobotParser'); +const parser = require('../ssotToRobotParser'); const testSsot = require('./SsotForTesting.json'); -const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../utils/testingUtils/databaseLoader'); const { testRobotId, testJobId, testRobotCode, -} = require('../../../utils/TestingUtils/testData'); +} = require('../../../utils/testingUtils/testData'); const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; const OPEN_WORKBOOK_CMD = 'Open Workbook'; diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 65eff1f9..9fa01222 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ require('express'); const mongoose = require('mongoose'); -const ssotToRobotParser = require('../services/SsotToRobotParsing/SsotToRobotParser.js'); +const ssotToRobotParser = require('../services/ssotToRobotParsing/ssotToRobotParser.js'); const ssotModels = require('../api/models/singleSourceOfTruthModel.js'); const userAccessObject = require('../api/models/userAccessObjectModel.js'); const jobsModel = require('../api/models/robotJobModel.js'); From 45d7a911fb69d27ece445cf62fdd9ed2d70d7f27 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Sat, 15 May 2021 14:31:26 +0200 Subject: [PATCH 018/149] Delete server/services/SsotToRobotParsing directory --- .../SsotToRobotParsing/SsotToRobotParser.js | 77 -------- .../__tests__/SsotForTesting.json | 47 ----- .../__tests__/SsotToRobotParser.test.js | 122 ------------ .../SsotToRobotParsing/generateCodeBase.js | 96 ---------- .../generateCodeForRpaTasks.js | 175 ------------------ .../SsotToRobotParsing/retrieveParameters.js | 102 ---------- .../SsotToRobotParsing/robotCodeConstants.js | 13 -- 7 files changed, 632 deletions(-) delete mode 100644 server/services/SsotToRobotParsing/SsotToRobotParser.js delete mode 100644 server/services/SsotToRobotParsing/__tests__/SsotForTesting.json delete mode 100644 server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js delete mode 100644 server/services/SsotToRobotParsing/generateCodeBase.js delete mode 100644 server/services/SsotToRobotParsing/generateCodeForRpaTasks.js delete mode 100644 server/services/SsotToRobotParsing/retrieveParameters.js delete mode 100644 server/services/SsotToRobotParsing/robotCodeConstants.js diff --git a/server/services/SsotToRobotParsing/SsotToRobotParser.js b/server/services/SsotToRobotParsing/SsotToRobotParser.js deleted file mode 100644 index 4343b85b..00000000 --- a/server/services/SsotToRobotParsing/SsotToRobotParser.js +++ /dev/null @@ -1,77 +0,0 @@ -/* eslint-disable no-unused-vars */ -/* eslint-disable no-useless-escape */ -/** - * @category Server - * @module - */ -const mongoose = require('mongoose'); -const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); -const jobsModel = require('../../api/models/robotJobModel.js'); -const { generateCodeBase } = require('./generateCodeBase'); -const { - retrieveParameters, - retrieveParametersFromSsotAndJob, -} = require('./retrieveParameters'); -const { generateCodeForRpaTasks } = require('./generateCodeForRpaTasks'); - -/** - * @description Parses the given SSoT to an executable .robot file - * @param {Object} ssot The SSoT - * @returns {string} Code that has to be put in .robot file - */ -const parseSsotToRobotCode = async (ssot) => { - // eslint-disable-next-line prefer-const - const result = await generateCodeBase(ssot); - const parameters = await retrieveParameters(ssot); - result.parsedCode += await generateCodeForRpaTasks( - ssot.elements, - parameters, - result.attributeObjects - ); - return result.parsedCode; -}; - -/** - * @description Parses the given SSoT and parameters of the robot job to an executable .robot file - * @param {Object} ssot The SSoT - * @param {Object} jobId The id of the job - * @returns {string} Code that has to be put in .robot file - */ -const parseSsotAndJobToRobotCode = async (ssot, jobId) => { - // eslint-disable-next-line prefer-const - const result = await generateCodeBase(ssot); - const parameters = await retrieveParametersFromSsotAndJob(ssot, jobId); - result.parsedCode += await generateCodeForRpaTasks( - ssot.elements, - parameters, - result.attributeObjects - ); - return result.parsedCode; -}; - -/** - * @description Parses the SSoT provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which should be parsed - * @returns {string} Code that has to be put in .robot file - */ -const parseSsotById = async (robotId) => { - const ssot = await mongoose.model('SSoT').findById(robotId).exec(); - return parseSsotToRobotCode(ssot); -}; - -/** - * @description Parses the SSoT provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which should be parsed - * @param {String} jobId The id of the current robotJob that is to be executed - * @returns {string} Code that has to be put in .robot file - */ -const parseCodeForJob = async (robotId, jobId) => { - const ssot = await mongoose.model('SSoT').findById(robotId).exec(); - return parseSsotAndJobToRobotCode(ssot, jobId); -}; - -module.exports = { - parseSsotToRobotCode, - parseSsotById, - parseCodeForJob, -}; diff --git a/server/services/SsotToRobotParsing/__tests__/SsotForTesting.json b/server/services/SsotToRobotParsing/__tests__/SsotForTesting.json deleted file mode 100644 index 8eca9421..00000000 --- a/server/services/SsotToRobotParsing/__tests__/SsotForTesting.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "id": "606199015d691786a44a608f", - "starterId": "Event_1wm4a0f", - "robotName": "Sandros Testbot", - "elements": [ - { - "predecessorIds": [], - "successorIds": ["Activity_1elomab"], - "_id": "6062f0ad92ffd3044c6ee382", - "type": "MARKER", - "name": "Start Event", - "id": "Event_1wm4a0f" - }, - { - "predecessorIds": ["Event_1wm4a0f"], - "successorIds": ["Activity_175v5b5"], - "_id": "6062f0ad92ffd3044c6ee383", - "type": "INSTRUCTION", - "name": "FirstActivity", - "id": "Activity_1elomab" - }, - { - "predecessorIds": ["Activity_1elomab"], - "successorIds": ["Activity_1x8wlwh"], - "_id": "6062f0ad92ffd3044c6ee384", - "type": "INSTRUCTION", - "name": "SecondActivity", - "id": "Activity_175v5b5" - }, - { - "predecessorIds": ["Activity_175v5b5"], - "successorIds": ["Event_1cuknwt"], - "_id": "6062f0ad92ffd3044c6ee385", - "type": "INSTRUCTION", - "name": "ThirdActivity", - "id": "Activity_1x8wlwh" - }, - { - "predecessorIds": ["Activity_1x8wlwh"], - "successorIds": [], - "_id": "6062f0ad92ffd3044c6ee386", - "type": "MARKER", - "name": "finished", - "id": "Event_1cuknwt" - } - ] -} diff --git a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js deleted file mode 100644 index 3cd66cd4..00000000 --- a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ /dev/null @@ -1,122 +0,0 @@ -/* eslint-disable no-undef */ -const parser = require('../ssotToRobotParser'); -const testSsot = require('./SsotForTesting.json'); -const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../utils/testingUtils/databaseLoader'); -const { - testRobotId, - testJobId, - testRobotCode, -} = require('../../../utils/testingUtils/testData'); - -const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; -const OPEN_WORKBOOK_CMD = 'Open Workbook'; -const EXCEL1_ACTIVITY_PARAM = 'C://Users/Filepath'; - -const EXCEL2_ACTIVITY_NAME = 'SecondActivity'; -const FIND_EMPTY_ROW_CMD = 'Find Empty Row'; -const EXCEL2_ACTIVITY_PARAM = 'StonksOnlyGoUp.xls'; - -const BROWSER_ACTIVITY_NAME = 'ThirdActivity'; -const OPEN_BROWSER_CMD = 'Open Browser'; -const BROWSER_ACTIVITY_PARAM = 'http://localhost:3000'; - -const LIBRARY_EXCEL = 'Library RPA.Excel.Application'; -const LIBRARY_BROWSER = 'Library RPA.Browser'; -const SETTING_STRING = '*** Settings ***'; -const TASK_STRING = '*** Tasks ***'; - -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('Ssot Parsing', () => { - it('parses all the elements of the ssot correctly', async () => { - await dbLoader.loadAttributesInDb(); - await dbLoader.loadParametersInDb(); - - const parserResultString = await parser.parseSsotToRobotCode(testSsot); - - expect(parserResultString).toMatch(SETTING_STRING); - expect(parserResultString).toMatch(LIBRARY_EXCEL); - - expect(parserResultString).toMatch(EXCEL1_ACTIVITY_NAME); - expect(parserResultString).toMatch(OPEN_WORKBOOK_CMD); - expect(parserResultString).toMatch(EXCEL1_ACTIVITY_PARAM); - - expect(parserResultString).toMatch(EXCEL2_ACTIVITY_NAME); - expect(parserResultString).toMatch(FIND_EMPTY_ROW_CMD); - expect(parserResultString).toMatch(EXCEL2_ACTIVITY_PARAM); - - expect(parserResultString).toMatch(BROWSER_ACTIVITY_NAME); - expect(parserResultString).toMatch(OPEN_BROWSER_CMD); - expect(parserResultString).toMatch(BROWSER_ACTIVITY_PARAM); - }); - - it('parses all the elements of the ssot in the correct order', async () => { - await dbLoader.loadAttributesInDb(); - await dbLoader.loadParametersInDb(); - - const parserResultString = await parser.parseSsotToRobotCode(testSsot); - - expect(parserResultString.indexOf(SETTING_STRING)).toBeLessThan( - parserResultString.indexOf(TASK_STRING) - ); - expect(parserResultString.indexOf(LIBRARY_BROWSER)).toBeLessThan( - parserResultString.indexOf(TASK_STRING) - ); - expect(parserResultString.indexOf(LIBRARY_EXCEL)).toBeLessThan( - parserResultString.indexOf(TASK_STRING) - ); - - expect(parserResultString.indexOf(EXCEL1_ACTIVITY_NAME)).toBeLessThan( - parserResultString.lastIndexOf(OPEN_WORKBOOK_CMD) - ); - expect(parserResultString.indexOf(OPEN_WORKBOOK_CMD)).toBeLessThan( - parserResultString.lastIndexOf(EXCEL1_ACTIVITY_PARAM) - ); - - expect(parserResultString.indexOf(EXCEL2_ACTIVITY_NAME)).toBeLessThan( - parserResultString.indexOf(FIND_EMPTY_ROW_CMD) - ); - expect(parserResultString.indexOf(FIND_EMPTY_ROW_CMD)).toBeLessThan( - parserResultString.indexOf(EXCEL2_ACTIVITY_PARAM) - ); - - expect(parserResultString.indexOf(BROWSER_ACTIVITY_NAME)).toBeLessThan( - parserResultString.lastIndexOf(OPEN_BROWSER_CMD) - ); - expect(parserResultString.indexOf(OPEN_BROWSER_CMD)).toBeLessThan( - parserResultString.lastIndexOf(BROWSER_ACTIVITY_PARAM) - ); - }); - - it('parses all the elements of the ssot and job object correctly', async () => { - await dbLoader.loadSsotInDb(); - await dbLoader.loadAttributesInDb(); - await dbLoader.loadParametersInDb(); - await dbLoader.loadJobInDb(); - await dbLoader.loadTasksInDb(); - - const parserResultString = await parser.parseCodeForJob( - testRobotId, - testJobId - ); - expect(parserResultString).not.toBeUndefined(); - expect(parserResultString).not.toBeNull(); - expect(String(parserResultString).replace(/\s/g, '')).toEqual( - String(testRobotCode).replace(/\s/g, '') - ); - }); -}); diff --git a/server/services/SsotToRobotParsing/generateCodeBase.js b/server/services/SsotToRobotParsing/generateCodeBase.js deleted file mode 100644 index 5038137e..00000000 --- a/server/services/SsotToRobotParsing/generateCodeBase.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @category Server - * @module - */ -const mongoose = require('mongoose'); -const { - ACTIVITY_IDENTIFIER, - FOURSPACE, - LINEBREAK, -} = require('./robotCodeConstants'); - -// eslint-disable-next-line no-unused-vars -const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); - -/** - * @description Collects the applications used by the robot - * @param {Array} elements All the elements from the SSoT - * @returns {Array} All unique Applications that occur in the ssot - */ -const collectApplications = (elements) => { - const applications = []; - if (elements !== undefined && elements.length > 0) { - elements.forEach((element) => { - if ( - element.rpaApplication !== undefined && - !applications.includes(element.rpaApplication) - ) { - applications.push(element.rpaApplication); - } - }); - } - return applications; -}; - -/** - * @description Generates the Library Import Code of the .robot file - * @param {Array} elements All the elements from the SSoT - * @returns {string} Library Import Code that has to be put in .robot file - */ -const generateCodeForLibraryImports = (elements) => { - let libraryImports = ''; - const applications = collectApplications(elements); - if (applications.length > 0) { - Object.values(applications).forEach((application) => { - libraryImports += `Library${FOURSPACE}RPA.${application}${LINEBREAK}`; - }); - } - - return libraryImports; -}; - -/** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved - * @returns {Array} Array of attribute objects - */ -const retrieveAttributes = async (ssot) => { - const { id } = ssot; - const { elements } = ssot; - const listOfActivityIds = []; - - elements.forEach((element) => { - if (element.type === ACTIVITY_IDENTIFIER) { - listOfActivityIds.push(element.id); - } - }); - - const attributeObjects = await mongoose - .model('rpaAttributes') - .find({ - robotId: id, - activityId: { $in: listOfActivityIds }, - }) - .exec(); - - return attributeObjects; -}; - -/** - * @description Generates that basic code that every robot has - * @param {Object} ssot The ssot - * @returns {string} Basic code for the .robot file - */ -const generateCodeBase = async (ssot) => { - let parsedCode = ''; - parsedCode += `*** Settings ***${LINEBREAK}`; - const attributeObjects = await retrieveAttributes(ssot); - parsedCode += generateCodeForLibraryImports(attributeObjects); - // ideally we use the keyword statement for each task, currently not working out of the box - parsedCode += `${LINEBREAK}*** Tasks ***${LINEBREAK}`; - return { parsedCode, attributeObjects }; -}; - -module.exports = { - generateCodeBase, -}; diff --git a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js b/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js deleted file mode 100644 index 9bf5064d..00000000 --- a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @category Server - * @module - */ -const mongoose = require('mongoose'); -const { - ACTIVITY_IDENTIFIER, - FOURSPACE, - LINEBREAK, -} = require('./robotCodeConstants'); -// eslint-disable-next-line no-unused-vars -const rpaModels = require('../../api/models/rpaTaskModel'); - -/** - * @description Checks whether the given element is of type instruction and contains rpa attributes - * @param {Object} currentElement Element to check - * @returns {Boolean} Value specifies if object is of type instruction and contains rpa attributes - */ -const isAnRpaInstruction = (currentElement) => - currentElement.type === ACTIVITY_IDENTIFIER; - -/** - * @description Will create a prefix to catch the output variable of an activity, if one is present - * @param {Object} paramObject The parameter object to check and loop through - * @returns {String} String specifying the output variables name - */ -const setOutputVar = (paramObject) => { - let newCodeLine = FOURSPACE; - - if (paramObject.outputVariable) { - newCodeLine += `\${${paramObject.outputVariable}} = `; - } - return newCodeLine; -}; - -/** - * @description Will append all provided parameters to a string which can be used to generate the RPAf file - * @param {Object} parameterObject The parameter object to check and loop through - * @returns {String} String specifying the input parameters with the needed spacing in between - */ -const appendRpaInputParameter = (parameterObject) => { - let newCodeLine = ''; - - const sortedInputs = parameterObject.rpaParameters.sort( - (a, b) => a.index - b.index - ); - sortedInputs.forEach((parameter) => { - newCodeLine += FOURSPACE; - if (parameter.requireUserInput && parameter.value === '') { - newCodeLine += `!!${parameter.name}!!`; - return; - } - if (parameter.value === '') { - newCodeLine += `%%${parameter.name}%%`; - return; - } - if (parameter.value.search(/\$\$(.*?)\$\$/) >= 0) { - // eslint-disable-next-line no-useless-escape - newCodeLine += `$\{${parameter.value.split('$$')[1]}\}`; - return; - } - - newCodeLine += parameter.value; - }); - - return newCodeLine; -}; - -/** - * @description Checks whether the given element has a successor element - * @param {Object} currentElement Element to check - * @returns {Boolean} Value specifies if element has a successor element - */ -const successorTasksExist = (currentElement) => - currentElement.successorIds !== undefined && - currentElement.successorIds[0] !== ''; - -/** - * @description Receives an array of all elements and generates the .robot code for the elements recursively. - * @param {String} id Id of the element we are looking for - * @param {Array} elements All the elements from the ssot - * @param {Array} parameters All parameter objects of the robot - * @param {Array} attributes All attribute objects of the robot - * @param {String} codeToAppend The current code we want to extend - * @returns {string} Generated .robot code for the tasks section - */ -const writeCodeForElement = ( - id, - elements, - parameters, - attributes, - codeToAppend, - duplicateTasks -) => { - const currentElement = elements.find((element) => element.id === id); - let combinedCode = codeToAppend; - let newCodeLine = ''; - if (isAnRpaInstruction(currentElement)) { - const currentAttributeObject = attributes.find( - (attribute) => attribute.activityId === id - ); - if (currentAttributeObject) { - newCodeLine += currentElement.name + LINEBREAK; - const currentParameterObject = parameters.find( - (parameter) => parameter.activityId === id - ); - if (currentParameterObject) { - newCodeLine += setOutputVar(currentParameterObject); - } - if (duplicateTasks.includes(currentAttributeObject.rpaTask)) { - newCodeLine += `RPA.${currentAttributeObject.rpaApplication}.${currentAttributeObject.rpaTask}`; - } else { - newCodeLine += currentAttributeObject.rpaTask; - } - if (currentParameterObject) { - newCodeLine += appendRpaInputParameter(currentParameterObject); - } - - newCodeLine += LINEBREAK; - combinedCode += newCodeLine; - } - } - - if (successorTasksExist(currentElement)) { - // Xor handling is needed here in the future - currentElement.successorIds.forEach((successorId) => { - combinedCode = writeCodeForElement( - successorId, - elements, - parameters, - attributes, - combinedCode, - duplicateTasks - ); - }); - } - return combinedCode.endsWith(LINEBREAK) - ? combinedCode.slice(0, -1) - : combinedCode; -}; - -/** - * @description Receives an array of all elements and generates the .robot code for all RPA Tasks - * @param {Array} elements All the elements from the SSoT - * @param {Object} metaData MetaData of the robot - * @returns {string} Generated .robot code for the tasks section - */ -const generateCodeForRpaTasks = async (elements, parameters, attributes) => { - const startElement = elements.find( - (element) => element.predecessorIds.length === 0 - ); - - const groupedByTask = await mongoose - .model('rpa-task') - .aggregate([{ $group: { _id: '$Task', count: { $sum: 1 } } }]); - const listOfDuplicates = groupedByTask - .filter((singleTask) => singleTask.count > 1) - // eslint-disable-next-line no-underscore-dangle - .map((singleDuplicateTask) => singleDuplicateTask._id); - - const codeForRpaTasks = writeCodeForElement( - startElement.id, - elements, - parameters, - attributes, - '', - listOfDuplicates - ); - - return codeForRpaTasks; -}; - -module.exports = { - generateCodeForRpaTasks, -}; diff --git a/server/services/SsotToRobotParsing/retrieveParameters.js b/server/services/SsotToRobotParsing/retrieveParameters.js deleted file mode 100644 index 2e90220a..00000000 --- a/server/services/SsotToRobotParsing/retrieveParameters.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @category Server - * @module - */ -const mongoose = require('mongoose'); -const { ACTIVITY_IDENTIFIER } = require('./robotCodeConstants'); -// eslint-disable-next-line no-unused-vars -const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); -// eslint-disable-next-line no-unused-vars -const jobsModel = require('../../api/models/robotJobModel.js'); - -/** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved - * @returns {Array} Array of parameter objects - */ -const retrieveParameters = async (ssot) => { - const { id } = ssot; - const { elements } = ssot; - const listOfActivityIds = []; - - elements.forEach((element) => { - if (element.type === ACTIVITY_IDENTIFIER) { - listOfActivityIds.push(element.id); - } - }); - - const parameterObjects = await mongoose - .model('parameter') - .find( - { - robotId: id, - activityId: { $in: listOfActivityIds }, - }, - { - activityId: 1, - rpaParameters: 1, - outputVariable: 1, - } - ) - .exec(); - - return parameterObjects; -}; - -/** - * @description Update Parameter Objects with new parameters - * @param {Array} parameterObjects The selection of parameter objects this function will have a look at - * @param {Array} newParameters New parameters in the form {id, value} that the function will use to update the parameter objects - */ -const updateParameterObjects = (parameterObjects, newParameters) => { - parameterObjects.map((parameterObject) => { - if (parameterObject.rpaParameters.length !== 0) { - parameterObject.rpaParameters.map((currentParameter) => { - newParameters.forEach((newParameter) => { - if ( - // eslint-disable-next-line no-underscore-dangle - String(newParameter.parameterId) === String(currentParameter._id) - ) { - // eslint-disable-next-line no-param-reassign - currentParameter.value = newParameter.value; - } - }); - return currentParameter; - }); - } - return parameterObject; - }); - return parameterObjects; -}; - -/** - * @description Retrieve all parameters for a specific job - * @param {String} jobId The id of the job - */ -const getAllParametersForJob = async (jobId) => { - const jobParametersObject = await mongoose - .model('job') - .findById(jobId, { parameters: 1 }); - return jobParametersObject.parameters; -}; - -/** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved - * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters - * @returns {Array} Array of parameter objects - */ -const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { - const parameterObjects = await retrieveParameters(ssot); - const newParameters = await getAllParametersForJob(jobId); - const parameterObjectsUpdated = await updateParameterObjects( - parameterObjects, - newParameters - ); - return parameterObjectsUpdated; -}; - -module.exports = { - retrieveParameters, - retrieveParametersFromSsotAndJob, -}; diff --git a/server/services/SsotToRobotParsing/robotCodeConstants.js b/server/services/SsotToRobotParsing/robotCodeConstants.js deleted file mode 100644 index c09918af..00000000 --- a/server/services/SsotToRobotParsing/robotCodeConstants.js +++ /dev/null @@ -1,13 +0,0 @@ -const ACTIVITY_IDENTIFIER = 'INSTRUCTION'; -const LINEBREAK = '\n'; -const COMMENT = '#'; -const DOUBLESPACE = ' '; -const FOURSPACE = ' '; - -module.exports = { - ACTIVITY_IDENTIFIER, - LINEBREAK, - COMMENT, - DOUBLESPACE, - FOURSPACE, -}; From d8c3333b21a45922983c638058fb0929cad621d4 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Sat, 15 May 2021 14:32:04 +0200 Subject: [PATCH 019/149] Delete server/utils/TestingUtils directory --- .../utils/TestingUtils/TestDatabaseHandler.js | 48 --- server/utils/TestingUtils/databaseLoader.js | 67 ---- server/utils/TestingUtils/testData.js | 349 ------------------ server/utils/TestingUtils/testRobotFile.txt | 12 - 4 files changed, 476 deletions(-) delete mode 100644 server/utils/TestingUtils/TestDatabaseHandler.js delete mode 100644 server/utils/TestingUtils/databaseLoader.js delete mode 100644 server/utils/TestingUtils/testData.js delete mode 100644 server/utils/TestingUtils/testRobotFile.txt diff --git a/server/utils/TestingUtils/TestDatabaseHandler.js b/server/utils/TestingUtils/TestDatabaseHandler.js deleted file mode 100644 index d92de9e7..00000000 --- a/server/utils/TestingUtils/TestDatabaseHandler.js +++ /dev/null @@ -1,48 +0,0 @@ -const mongoose = require('mongoose'); -const { MongoMemoryServer } = require('mongodb-memory-server'); - -const mongooseOpts = { - useNewUrlParser: true, - useUnifiedTopology: true, -}; - -const mongod = new MongoMemoryServer({ - instance: { - dbName: 'ark-automate', - port: 59051, - }, -}); - -/** - * Connect to the in-memory database. - */ -exports.connect = async () => { - const uri = await mongod.getUri(); - await mongoose.createConnection(uri, mongooseOpts); - await mongoose.connect(uri, mongooseOpts); -}; - -/** - * Drop database, close the connection and stop mongod. - */ -exports.closeDatabase = async () => { - await mongoose.connection.dropDatabase(); - await mongoose.connection.close(); - await mongoose.disconnect(); - await mongod.stop(); -}; - -/** - * Remove all the data for all db collections. - */ -exports.clearDatabase = async () => { - const { collections } = mongoose.connection; - - // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html - const result = []; - for (const key in collections) { - const collection = collections[key]; - result.push(collection.deleteMany()); - } - return Promise.all(result); -}; diff --git a/server/utils/TestingUtils/databaseLoader.js b/server/utils/TestingUtils/databaseLoader.js deleted file mode 100644 index ac4efc43..00000000 --- a/server/utils/TestingUtils/databaseLoader.js +++ /dev/null @@ -1,67 +0,0 @@ -const mongoose = require('mongoose'); -const testData = require('./testData'); - -const loadSsotInDb = async () => { - const SsotModel = mongoose.model('SSoT'); - const ssot = new SsotModel(testData.testSsot); - await ssot.save(); -}; - -const loadUserAccessObjectsInDb = async () => { - const UserAccessObjectModel = mongoose.model('userAccessObject'); - const userAccessObject = UserAccessObjectModel(testData.testUserAccessObject); - await userAccessObject.save(); - const userAccessObject2 = UserAccessObjectModel( - testData.testUserAccessObject2 - ); - await userAccessObject2.save(); -}; - -const loadJobInDb = async () => { - const JobModel = mongoose.model('job'); - const job = new JobModel(testData.testJob); - await job.save(); -}; - -const loadAttributesInDb = async () => { - const RpaAttribute = mongoose.model('rpaAttributes'); - const rpaAttribute = new RpaAttribute(testData.testAttributes1); - await rpaAttribute.save(); - const rpaAttribute2 = new RpaAttribute(testData.testAttributes2); - await rpaAttribute2.save(); - const rpaAttribute3 = new RpaAttribute(testData.testAttributes3); - await rpaAttribute3.save(); -}; - -const loadParametersInDb = async () => { - const RpaParam = mongoose.model('parameter'); - const rpaParamter = new RpaParam(testData.testParameter1); - await rpaParamter.save(); - const rpaParamter2 = new RpaParam(testData.testParameter2); - await rpaParamter2.save(); - const rpaParamter3 = new RpaParam(testData.testParameter3); - await rpaParamter3.save(); -}; - -const loadTasksInDb = async () => { - const RpaTask = mongoose.model('rpa-task'); - const rpaTask = await new RpaTask(testData.testRpaTask1); - await rpaTask.save(); - const rpaTask2 = await new RpaTask(testData.testRpaTask2); - await rpaTask2.save(); - const rpaTask3 = await new RpaTask(testData.testRpaTask3); - await rpaTask3.save(); - const rpaTask4 = await new RpaTask(testData.testRpaTask4); - await rpaTask4.save(); - const rpaTask5 = await new RpaTask(testData.testRpaTask5); - await rpaTask5.save(); -}; - -module.exports = { - loadJobInDb, - loadUserAccessObjectsInDb, - loadSsotInDb, - loadAttributesInDb, - loadParametersInDb, - loadTasksInDb, -}; diff --git a/server/utils/TestingUtils/testData.js b/server/utils/TestingUtils/testData.js deleted file mode 100644 index d1ec8511..00000000 --- a/server/utils/TestingUtils/testData.js +++ /dev/null @@ -1,349 +0,0 @@ -const testUserId = '604a3ba6561e2d1fad4eda60'; -const user2Id = '604a3ba6561e2d1fad4eda00'; - -const testRobotId = '606199015d691786a44a608f'; -const testJobId = '605c68a86d596e0d6bed0077'; - -const testSsot = { - id: testRobotId, - _id: testRobotId, // needed because we sometimes access the id with _id, sometimes with id - starterId: 'Event_1wm4a0f', - robotName: 'Sandros Testbot', - elements: [ - { - predecessorIds: [], - successorIds: ['Activity_1elomab'], - _id: '6062f0ad92ffd3044c6ee382', - type: 'MARKER', - name: 'Start Event', - id: 'Event_1wm4a0f', - }, - { - predecessorIds: ['Event_1wm4a0f'], - successorIds: ['Activity_175v5b5'], - _id: '6062f0ad92ffd3044c6ee383', - type: 'INSTRUCTION', - name: 'FirstActivity', - id: 'Activity_1elomab', - }, - { - predecessorIds: ['Activity_1elomab'], - successorIds: ['Activity_1x8wlwh'], - _id: '6062f0ad92ffd3044c6ee384', - type: 'INSTRUCTION', - name: 'SecondActivity', - id: 'Activity_175v5b5', - }, - { - predecessorIds: ['Activity_175v5b5'], - successorIds: ['Event_1cuknwt'], - _id: '6062f0ad92ffd3044c6ee385', - type: 'INSTRUCTION', - name: 'ThirdActivity', - id: 'Activity_1x8wlwh', - }, - { - predecessorIds: ['Activity_1x8wlwh'], - successorIds: [], - _id: '6062f0ad92ffd3044c6ee386', - type: 'MARKER', - name: 'finished', - id: 'Event_1cuknwt', - }, - ], -}; - -const testUserAccessObject = { - AccessLevel: '0', - robotId: testRobotId, - userId: testUserId, -}; - -const testUserAccessObject2 = { - AccessLevel: '0', - robotId: '604a3ba6561e2d1fad4eda11', - userId: user2Id, -}; - -const numberOfTestTasks = 5; -const testRpaTask1 = { - Application: 'Browser', - Task: 'Click Button', - Code: 'Click Button', - outputValue: false, - inputVars: [ - { - name: 'path', - type: 'String', - isRequired: true, - infoText: 'Path to button', - index: 0, - }, - ], -}; - -const testRpaTask2 = { - Application: 'Excel', - Task: 'Input Text', - Code: 'Input Text', - outputValue: false, - inputVars: [ - { - name: 'coloumn', - type: 'Integer', - isRequired: true, - infoText: 'Target Coloumn', - index: 0, - }, - { - name: 'row', - type: 'Integer', - isRequired: true, - infoText: 'Target row', - index: 1, - }, - ], -}; - -const testRpaTask3 = { - Application: 'Browser', - Task: 'Input Password', - Code: 'Input Password', - outputValue: false, - inputVars: [ - { - name: 'password', - type: 'String', - isRequired: true, - infoText: 'password', - index: 0, - }, - ], -}; - -const testRpaTask4 = { - Application: 'Excel.Application', - Task: 'Open Workbook', - Code: 'Open Workbook', - outputValue: false, - inputVars: [ - { - name: 'path', - type: 'String', - isRequired: true, - infoText: 'path', - index: 0, - }, - ], -}; - -const testRpaTask5 = { - Application: 'Excel.Files', - Task: 'Open Workbook', - Code: 'Open Workbook', - outputValue: false, - inputVars: [ - { - name: 'path', - type: 'String', - isRequired: true, - infoText: 'path', - index: 0, - }, - ], -}; - -const testJob = { - _id: testJobId, - __v: 0, - user_id: testUserId, - robot_id: testRobotId, - status: 'waiting', - parameters: [ - { - _id: '60780432cb11ef12444785ee', - parameterId: '6062f0ad92ffd3044c6ee387', - value: 'TESTVALUE', - }, - ], - loggedErrors: [], -}; - -const testAttributes1 = { - _id: '6062f0ad1abb38158c2dfa41', - activityId: 'Activity_1elomab', - robotId: testRobotId, - rpaApplication: 'Excel.Application', - rpaTask: 'Open Workbook', - __v: 0, -}; - -const testAttributes2 = { - _id: '6062f0ad1abb38158c2dfa42', - activityId: 'Activity_175v5b5', - robotId: testRobotId, - rpaApplication: 'Excel.Application', - rpaTask: 'Find Empty Row', - __v: 0, -}; - -const testAttributes3 = { - _id: '6062f0ad1abb38158c2dfa43', - activityId: 'Activity_1x8wlwh', - robotId: testRobotId, - rpaApplication: 'Browser', - rpaTask: 'Open Browser', - __v: 0, -}; - -const testParameter1 = { - _id: '6062f0ad1abb38158c2dfa69', - __v: 0, - activityId: 'Activity_1elomab', - robotId: '606199015d691786a44a608f', - rpaParameters: [ - { - _id: '6062f0ad92ffd3044c6ee389', - name: 'filename', - type: 'String', - isRequired: true, - infoText: 'Path to filename', - index: 0, - value: 'C://Users/Filepath', - }, - ], -}; - -const testParameter2 = { - _id: '6062f0ad1abb38158c2dfa68', - __v: 0, - activityId: 'Activity_175v5b5', - robotId: '606199015d691786a44a608f', - rpaParameters: [ - { - _id: '6062f0ad92ffd3044c6ee388', - name: 'filename', - type: 'String', - isRequired: true, - infoText: 'Find Empty Row', - index: 0, - value: 'StonksOnlyGoUp.xls', - }, - ], -}; - -const testParameter3 = { - _id: '6062f0ad1abb38158c2dfa67', - __v: 0, - activityId: 'Activity_1x8wlwh', - robotId: testRobotId, - rpaParameters: [ - { - _id: '6062f0ad92ffd3044c6ee387', - name: 'save_changes', - type: 'Boolean', - isRequired: true, - infoText: 'Open Browser', - index: 0, - value: 'http://localhost:3000', - requireUserInput: true, - }, - ], -}; - -const testRobotCode = - '*** Settings *** Library RPA.Excel.Application Library RPA.Browser *** Tasks *** FirstActivity RPA.Excel.Application.Open Workbook C://Users/Filepath SecondActivity Find Empty Row StonksOnlyGoUp.xls ThirdActivity Open Browser TESTVALUE'; - -const failingRobotRunLog = { - robot_run: { - name: 'DanielTest2', - activity_count: 8, - activities: [ - { - activity_name: 'Browser1', - tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], - status: 'PASS', - message: '', - }, - { - activity_name: 'Say hello', - tasks: [{ task_name: 'Open Workbook', status: 'PASS' }], - status: 'PASS', - message: '', - }, - { - activity_name: 'Say Goodbye!', - tasks: [ - { task_name: 'Set Worksheet Value', status: 'PASS' }, - { task_name: 'Set Worksheet Value', status: 'PASS' }, - ], - status: 'PASS', - message: '', - }, - { - activity_name: 'Browser2', - tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], - status: 'PASS', - message: '', - }, - { - activity_name: 'Browser3', - tasks: [ - { task_name: 'Open Chro Browser', status: 'FAIL' }, - { task_name: 'Set Worksheet Value', status: 'NOT RUN' }, - ], - status: 'FAIL', - message: - "No keyword with name 'Open Chro Browser' found. Did you mean:\n RPA.Browser.Selenium.Open Chrome Browser", - }, - { - activity_name: 'Interrupt', - tasks: [{ task_name: 'Set Worksheet Value', status: 'PASS' }], - status: 'PASS', - message: '', - }, - { - activity_name: 'Browser4', - tasks: [ - { task_name: 'Open Chrome Browser', status: 'PASS' }, - { task_name: 'Set Worksheet Value', status: 'PASS' }, - ], - status: 'PASS', - message: '', - }, - { - activity_name: 'Save file', - tasks: [{ task_name: 'Save Workbook', status: 'FAIL' }], - status: 'FAIL', - message: 'Test Failing Message', - }, - ], - status: 'FAIL', - }, - final_message: 'Execution completed', -}; - -module.exports = { - testSsot, - testUserAccessObject, - testUserAccessObject2, - testUserId, - user2Id, - testRobotId, - numberOfTestTasks, - testRpaTask1, - testRpaTask2, - testRpaTask3, - testRpaTask4, - testRpaTask5, - testJob, - testJobId, - testAttributes1, - testAttributes2, - testAttributes3, - testParameter1, - testParameter2, - testParameter3, - testRobotCode, - failingRobotRunLog, -}; diff --git a/server/utils/TestingUtils/testRobotFile.txt b/server/utils/TestingUtils/testRobotFile.txt deleted file mode 100644 index ed758755..00000000 --- a/server/utils/TestingUtils/testRobotFile.txt +++ /dev/null @@ -1,12 +0,0 @@ -*** Settings *** -Library RPA.Excel.Application -Library RPA.Browser -*** Tasks *** -Excel.Application -#FirstActivity - Open Workbook C://Users/Filepath -#SecondActivity - Find Empty Row StonksOnlyGoUp.xls -Browser -#ThirdActivity - Open Browser TESTVALUE \ No newline at end of file From f7726249703f99be291e6779053e2982f6641953 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 14:40:53 +0200 Subject: [PATCH 020/149] fix backend tests --- server/api/models/robotJobModel.test.js | 4 ++-- server/api/models/rpaTaskModel.test.js | 4 ++-- server/api/models/singleSourceOfTruthModel.test.js | 4 ++-- server/api/models/userAccessObjectModel.test.js | 4 ++-- server/api/routes/functionalities/functionalities.test.js | 6 +++--- server/api/routes/robots/parameters/parameters.test.js | 8 ++++---- server/api/routes/robots/robots.test.js | 6 +++--- .../api/routes/robots/rpaattributes/rpaattributes.test.js | 8 ++++---- server/api/routes/users/users.test.js | 6 +++--- server/socket/socketHelper.test.js | 8 ++++---- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index 70aefb71..e827c771 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -2,8 +2,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); -const { testJob } = require('../../utils/TestingUtils/testData.js'); +const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); +const { testJob } = require('../../utils/testingUtils/testData.js'); // eslint-disable-next-line no-unused-vars const jobsModel = require('./robotJobModel.js'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 5b8ce35b..38f6eae8 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -1,8 +1,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); -const { testRpaTask1 } = require('../../utils/TestingUtils/testData.js'); +const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); +const { testRpaTask1 } = require('../../utils/testingUtils/testData.js'); // eslint-disable-next-line no-unused-vars const taskModel = require('./rpaTaskModel.js'); diff --git a/server/api/models/singleSourceOfTruthModel.test.js b/server/api/models/singleSourceOfTruthModel.test.js index 8cdf4701..796871c7 100644 --- a/server/api/models/singleSourceOfTruthModel.test.js +++ b/server/api/models/singleSourceOfTruthModel.test.js @@ -1,8 +1,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); -const { testSsot } = require('../../utils/TestingUtils/testData.js'); +const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); +const { testSsot } = require('../../utils/testingUtils/testData.js'); // eslint-disable-next-line no-unused-vars const ssotModel = require('./singleSourceOfTruthModel.js'); diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 5cfc80f2..7672cdd6 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -1,10 +1,10 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); +const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); const { testUserAccessObject, -} = require('../../utils/TestingUtils/testData.js'); +} = require('../../utils/testingUtils/testData.js'); // eslint-disable-next-line no-unused-vars const userAccessObjectModel = require('./userAccessObjectModel.js'); diff --git a/server/api/routes/functionalities/functionalities.test.js b/server/api/routes/functionalities/functionalities.test.js index 07aa85d0..26f3df10 100644 --- a/server/api/routes/functionalities/functionalities.test.js +++ b/server/api/routes/functionalities/functionalities.test.js @@ -1,10 +1,10 @@ /* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../utils/testingUtils/databaseLoader'); const rpaController = require('../../controllers/rpaFrameworkCommandsController'); -const testData = require('../../../utils/TestingUtils/testData'); +const testData = require('../../../utils/testingUtils/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/robots/parameters/parameters.test.js b/server/api/routes/robots/parameters/parameters.test.js index eac520ae..693e1aff 100644 --- a/server/api/routes/robots/parameters/parameters.test.js +++ b/server/api/routes/robots/parameters/parameters.test.js @@ -2,18 +2,18 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); const ssotVariableController = require('../../../controllers/ssotVariableController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); -const testData = require('../../../../utils/TestingUtils/testData'); +const testData = require('../../../../utils/testingUtils/testData'); const { testSsot, testRobotId, -} = require('../../../../utils/TestingUtils/testData'); +} = require('../../../../utils/testingUtils/testData'); beforeAll(async () => dbHandler.connect()); diff --git a/server/api/routes/robots/robots.test.js b/server/api/routes/robots/robots.test.js index d633fcf9..2702d625 100644 --- a/server/api/routes/robots/robots.test.js +++ b/server/api/routes/robots/robots.test.js @@ -2,8 +2,8 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../utils/testingUtils/databaseLoader'); const ssotRetrievalController = require('../../controllers/ssotRetrievalController'); const ssotParsingController = require('../../controllers/ssotParsingController'); @@ -13,7 +13,7 @@ const rpaTaskModel = require('../../models/rpaTaskModel'); const { testSsot, testRobotId, -} = require('../../../utils/TestingUtils/testData'); +} = require('../../../utils/testingUtils/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js index 62eda922..30715cf1 100644 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ b/server/api/routes/robots/rpaattributes/rpaattributes.test.js @@ -2,18 +2,18 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); -const testData = require('../../../../utils/TestingUtils/testData'); +const testData = require('../../../../utils/testingUtils/testData'); const { testSsot, testRobotId, -} = require('../../../../utils/TestingUtils/testData'); +} = require('../../../../utils/testingUtils/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index fc6d0d94..7b1d1e07 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -2,8 +2,8 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/TestingUtils/TestDatabaseHandler'); -const dbLoader = require('../../../utils/TestingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../utils/testingUtils/databaseLoader'); const ssotRetrievalController = require('../../controllers/ssotRetrievalController'); // eslint-disable-next-line no-unused-vars @@ -13,7 +13,7 @@ const { testSsot, testRobotId, testUserId, -} = require('../../../utils/TestingUtils/testData'); +} = require('../../../utils/testingUtils/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index 36f19eab..cf1ebe49 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -1,18 +1,18 @@ /* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); -const dbHandler = require('../utils/TestingUtils/TestDatabaseHandler'); +const dbHandler = require('../utils/testingUtils/testDatabaseHandler'); const socketHelperFunctions = require('./socketHelperFunctions'); -const testData = require('../utils/TestingUtils/testData'); +const testData = require('../utils/testingUtils/testData'); const { testRobotId, testUserId, testJobId, testRobotCode, -} = require('../utils/TestingUtils/testData'); +} = require('../utils/testingUtils/testData'); -const dbLoader = require('../utils/TestingUtils/databaseLoader'); +const dbLoader = require('../utils/testingUtils/databaseLoader'); /** * Connect to a new in-memory database before running any tests. From ad8944bccb5725151cd3de053299673faf9a8e39 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 15:10:14 +0200 Subject: [PATCH 021/149] update Doku --- wiki/Documentation-Folder-structure.md | 69 +++++++++++++++----------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index a734b9bd..d2ea7059 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -1,37 +1,48 @@ # General -There is a clear separation of the server side of the application and the client side. Therefore, next to the gitignore and the Readme file there are only two folders in the top structure: -* One client folder with its own package.json. There you can find everything regarding the React frontend. -* One server folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. + +There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: + +- A `frontend` folder with its own package.json. There you can find everything regarding the React frontend. +- A `server` folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. +- A `wiki` which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. +- A `.github` which contains all workflows, our issue & pull request templates as well as some notes for the open source project. + +The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). ## server + The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). The central file here is the **server.js**. Here all the different routers are being used. -* **routes/**: All the different routers are implemented here. For different routes there are different routers. -Each router forwards the corresponding HTTP request to an appropriate controller by calling a suitable function of the controller. -* **controllers/**: In the controllers the HTTP request actually gets handled. While handling the request the functions in controllers use supporting functions from the folder services and data models from the folder models. Test files for a controller should be put right next to the controller file and both should be wrapped in a folder that is named like the controller file. -* **models/**: Schemas and models are being stored here which interact with a database (in our case MongoDB). -* **services/**: Functionality that is being used in the controllers. Test files for a service file should be put right next to the service file and both should be wrapped in a folder that is named like the service file. -* **utils/**: Helper functions. - -## client -On the top level there are only two folders next to the package.json the public folder and the src folder. + +- **routes/**: All the different routers are implemented here. For different routes there are different routers. + Each router forwards the corresponding HTTP request to an appropriate controller by calling a suitable function of the controller. +- **controllers/**: In the controllers the HTTP request actually gets handled. While handling the request the functions in controllers use supporting functions from the folder services and data models from the folder models. Test files for a controller should be put right next to the controller file and both should be wrapped in a folder that is named like the controller file. +- **models/**: Schemas and models are being stored here which interact with a database (in our case MongoDB). +- **services/**: Functionality that is being used in the controllers. Test files for a service file should be put right next to the service file and both should be wrapped in a folder that is named like the service file. +- **utils/**: Helper functions. + +## frontend + +On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. +The `public` folder contains the known meta information of a web page, as well as the favicon. Let's focus on the src folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: -* **api/**: API call related functions. -* **assets/**: Images, fonts and other static files. -* **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. -The components aren't structured regarding stateful/stateless characteristics but rather according to the three subfolders: - * **content/**: All the key components that actually create the webpages content. - * **layout/**: General layout components that can be used in content components (e.g. special Button). - * **pages/**: Components that represent a specific webpage. -* **config/**: Config files. -* **context/**: React context components (Context provides a way to pass data through the component tree without having to pass props down manually at every level). -* **hoc/**: React higher order components (Wrapper functions that take components as input and alter the component in a specific way) -* **store/**: State management with Redux. Two subfolders for actions and reducers. -* **utils/**: Helper functions. + +- **api/**: API call related functions. +- **resources/**: Images, fonts and other static files. +- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. + Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that is imported from each page. + In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. +- **utils/**: Contains the following subfolders: + _ - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. + _ - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests + _ - **rpaFunctionality/**: #todo + _ - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage. + \_ - **socket/**: #todo # Naming conventions -* All components are saved as .jsx files (excluding index.js and App.js) -* All non-component JavaScript files are saved as .js -* Component names are written in _PascalCase_ -* Non-component JavaScript files are written in _camelCase_ -* The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. + +- All components are saved as .jsx files (including index.jsx and App.jsx) +- All non-component JavaScript files are saved as .js +- Component names are written in _PascalCase_ +- Non-component JavaScript files are written in _camelCase_ +- The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. From 3d983acee38efa5eaf8a7e84e02183c498d080fd Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 15:15:22 +0200 Subject: [PATCH 022/149] update doku 2 --- wiki/Documentation-Folder-structure.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index d2ea7059..4d19f6d3 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -2,10 +2,10 @@ There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: -- A `frontend` folder with its own package.json. There you can find everything regarding the React frontend. -- A `server` folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. -- A `wiki` which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. -- A `.github` which contains all workflows, our issue & pull request templates as well as some notes for the open source project. +- A **frontend/** folder with its own package.json. There you can find everything regarding the React frontend. +- A **server/** folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. +- A **wiki/** folder which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. +- A **.github/** folder which contains all workflows, our issue & pull request templates as well as some notes for the open source project. The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). @@ -24,19 +24,19 @@ The central file here is the **server.js**. Here all the different routers are b ## frontend On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. -The `public` folder contains the known meta information of a web page, as well as the favicon. -Let's focus on the src folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: +The **public/** folder contains the known meta information of a web page, as well as the favicon. +Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: - **api/**: API call related functions. - **resources/**: Images, fonts and other static files. - **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that is imported from each page. In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. -- **utils/**: Contains the following subfolders: - _ - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - _ - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - _ - **rpaFunctionality/**: #todo - _ - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage. +- **utils/**: Contains the following subfolders: + _ - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. + _ - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests + _ - **rpaFunctionality/**: #todo + _ - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage \_ - **socket/**: #todo # Naming conventions From e25b88be77813452c675e280d6fb71d5eb4cfa34 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 15:18:03 +0200 Subject: [PATCH 023/149] update doku 3 --- wiki/Documentation-Folder-structure.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index 4d19f6d3..9ee93e88 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -28,16 +28,17 @@ The **public/** folder contains the known meta information of a web page, as wel Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: - **api/**: API call related functions. -- **resources/**: Images, fonts and other static files. - **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that is imported from each page. In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. -- **utils/**: Contains the following subfolders: - _ - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - _ - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - _ - **rpaFunctionality/**: #todo - _ - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage - \_ - **socket/**: #todo +- **layout/**: Contains our corporate design and customized theme. +- **resources/**: Contains images, fonts and other static files. +- **utils/**: Contains the following subfolders: + - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. + - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests + - **rpaFunctionality/**: #todo + - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage + - **socket/**: #todo # Naming conventions From 7f20b6d8766afca036de05953836190cfc0a3e89 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Sat, 15 May 2021 15:21:07 +0200 Subject: [PATCH 024/149] fix wiki typo and update workflows --- .github/workflows/backendTesting.yml | 2 +- .github/workflows/frontendTesting.yml | 2 +- wiki/Documentation-Folder-structure.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/backendTesting.yml b/.github/workflows/backendTesting.yml index c9c810cb..e1bf5525 100644 --- a/.github/workflows/backendTesting.yml +++ b/.github/workflows/backendTesting.yml @@ -2,7 +2,7 @@ name: Backend testing on: push: - branches: [DEV, 279_refactor_folder_structure] + branches: [DEV] pull_request: branches: [DEV] workflow_dispatch: diff --git a/.github/workflows/frontendTesting.yml b/.github/workflows/frontendTesting.yml index 8f108962..ae7e387a 100644 --- a/.github/workflows/frontendTesting.yml +++ b/.github/workflows/frontendTesting.yml @@ -2,7 +2,7 @@ name: Frontend testing on: push: - branches: [DEV, 279_refactor_folder_structure] + branches: [DEV] pull_request: branches: [DEV] workflow_dispatch: diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index 9ee93e88..03019bcc 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -29,7 +29,7 @@ Let's focus on the **src/** folder. On the highest level the relevant file is th - **api/**: API call related functions. - **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. - Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that is imported from each page. + Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that gets imported from each page. In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. - **layout/**: Contains our corporate design and customized theme. - **resources/**: Contains images, fonts and other static files. From 5cd7315ad9059e0a930283a9348ec7c2cf5b962e Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Mon, 17 May 2021 10:16:44 +0200 Subject: [PATCH 025/149] pr feedback --- .../robotCodeToSsotParsing/robotCodeToSsotParsing.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index ff5f7705..a8869aa7 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -35,7 +35,7 @@ const taskSectionAsArray = parser.getRobotCodeAsArray(correctTaskSection); const declaredApplications = parser.getApplicationArray(settingsSectionAsArray); describe('RobotCode to SSOT Parsing Tests', () => { - it('ssot contains right robotMetadata', () => { + it('contains the correct robotMetadata', () => { sessionStorage.setItem('idCounter', '5416'); const ssot = parser.parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); From abcc24e7c70cc0995faf1f59d6462e7d9d7be59d Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 17 May 2021 10:30:38 +0200 Subject: [PATCH 026/149] typo fix paramter --- .../RobotInteractionCockpit.jsx | 2 +- client/src/utils/localSsot/parameters.js | 4 ++-- client/src/utils/robotExecution.jsx | 2 +- client/src/utils/robotExecution.test.js | 2 +- .../SsotToRobotParsing/retrieveParameters.js | 2 +- server/utils/TestingUtils/databaseLoader.js | 12 ++++++------ 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index b8a28b56..4b29ade9 100644 --- a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -50,7 +50,7 @@ const RobotInteractionCockpit = (match) => { ); /** - * @description Ensures that we only update the paramterList when the paramters we fetch form the DB have changed + * @description Ensures that we only update the parameterList when the parameters we fetch form the DB have changed */ useEffect(() => { getActivityAndParameterInformation(robotId, setParameterList, isMounted); diff --git a/client/src/utils/localSsot/parameters.js b/client/src/utils/localSsot/parameters.js index f4e36d52..3a725985 100644 --- a/client/src/utils/localSsot/parameters.js +++ b/client/src/utils/localSsot/parameters.js @@ -119,8 +119,8 @@ const checkIfParameterObjectCorrect = ( }; /** - * @description Gets the parameter object for the activity from the session storage and checks if the paramter object is correctly filled. - * If no paramter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. + * @description Gets the parameter object for the activity from the session storage and checks if the parameter object is correctly filled. + * If no parameter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. * If no parameter object and no attributes object exists for the activity it will return undefined. * @param {String} robotId Id of the robot/ssot for which to retrieve the parameter object * @param {String} activityId Id of the activity for which to retrieve the parameter object for diff --git a/client/src/utils/robotExecution.jsx b/client/src/utils/robotExecution.jsx index 04a416e9..12d41079 100644 --- a/client/src/utils/robotExecution.jsx +++ b/client/src/utils/robotExecution.jsx @@ -12,7 +12,7 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { parameter.value === '' ) { console.error( - 'Required parameter not specified in paramter', + 'Required parameter not specified in parameter', parameter ); executability = false; diff --git a/client/src/utils/robotExecution.test.js b/client/src/utils/robotExecution.test.js index fd61e4ab..f24be306 100644 --- a/client/src/utils/robotExecution.test.js +++ b/client/src/utils/robotExecution.test.js @@ -30,7 +30,7 @@ describe('Checking robot parameters for Executability', () => { expect(response).toBe(false); }); - it('correctly recognizes a robot as executable if required paramter is empty but is specified later by user input', () => { + it('correctly recognizes a robot as executable if required parameter is empty but is specified later by user input', () => { const listOfParameters = [ paramObject1, paramObjectWithLaterSpecifiedUserInput, diff --git a/server/services/SsotToRobotParsing/retrieveParameters.js b/server/services/SsotToRobotParsing/retrieveParameters.js index 0a9b08a1..94916dff 100644 --- a/server/services/SsotToRobotParsing/retrieveParameters.js +++ b/server/services/SsotToRobotParsing/retrieveParameters.js @@ -83,7 +83,7 @@ const getAllParametersForJob = async (jobId) => { /** * @description For all activities in the ssot this method will retrieve the associated parameter objects * @param {Object} ssot The ssot for which the parameters should be retrieved - * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters + * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional parameters * @returns {Array} Array of parameter objects */ const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { diff --git a/server/utils/TestingUtils/databaseLoader.js b/server/utils/TestingUtils/databaseLoader.js index ac4efc43..bc090dd0 100644 --- a/server/utils/TestingUtils/databaseLoader.js +++ b/server/utils/TestingUtils/databaseLoader.js @@ -35,12 +35,12 @@ const loadAttributesInDb = async () => { const loadParametersInDb = async () => { const RpaParam = mongoose.model('parameter'); - const rpaParamter = new RpaParam(testData.testParameter1); - await rpaParamter.save(); - const rpaParamter2 = new RpaParam(testData.testParameter2); - await rpaParamter2.save(); - const rpaParamter3 = new RpaParam(testData.testParameter3); - await rpaParamter3.save(); + const rpaParameter = new RpaParam(testData.testParameter1); + await rpaParameter.save(); + const rpaParameter2 = new RpaParam(testData.testParameter2); + await rpaParameter2.save(); + const rpaParameter3 = new RpaParam(testData.testParameter3); + await rpaParameter3.save(); }; const loadTasksInDb = async () => { From accf0f64185e13f499b679da0f1ff6133b263aa5 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 17 May 2021 10:31:15 +0200 Subject: [PATCH 027/149] renamed val to value or fitting descriptor --- .../content/ModelerSidebar/ModelerSidebar.jsx | 10 ++++------ .../pages/RobotOverview/RobotOverview.jsx | 14 +++++++------- .../modelerSidebarFunctionality.js | 4 ++-- .../modelerSidebarFunctionality.test.js | 4 ++-- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx index 4d402195..8ec849d1 100644 --- a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx +++ b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx @@ -10,7 +10,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, } from '../../../utils/modelerSidebarFunctionality/modelerSidebarFunctionality'; @@ -37,10 +37,8 @@ const ModelerSidebar = ({ modeler, robotId }) => { currentElement: null, }); const [selectedApplication, setSelectedApplication] = useState(''); - const [ - tasksForSelectedApplication, - setTasksForSelectedApplication, - ] = useState(['']); + const [tasksForSelectedApplication, setTasksForSelectedApplication] = + useState(['']); const [disableTaskSelection, setDisableTaskSelection] = useState(true); const stateSetters = { setParameterList, @@ -115,7 +113,7 @@ const ModelerSidebar = ({ modeler, robotId }) => { }} outputValueName={outputValueName} outputNameUpdated={(newValue) => { - outputValNameChangeHandler( + outputValueNameChangeHandler( elementState.currentElement.id, newValue ); diff --git a/client/src/components/pages/RobotOverview/RobotOverview.jsx b/client/src/components/pages/RobotOverview/RobotOverview.jsx index 4523c830..99a2b0da 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/client/src/components/pages/RobotOverview/RobotOverview.jsx @@ -101,20 +101,20 @@ const RobotOverview = () => { * @param {String} currentSearchValue Currently stored value of the search bar, by which the boxes to be displayed are selected */ const createRobotBoxes = (currentSearchValue) => { - const filteredBotList = Object.values(robotList) - .filter((val) => val.robotName !== undefined) - .filter((val) => - val.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) + const filteredRobotList = Object.values(robotList) + .filter((robot) => robot.robotName !== undefined) + .filter((robot) => + robot.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) ); return ( <> - {filteredBotList.map((val) => ( + {filteredRobotList.map((robot) => ( retrieveBotList(userId)} /> ))} diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 864869bd..a1c41169 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -225,7 +225,7 @@ const inputParameterChangeHandler = (activityId, value) => { * @param {String} activityId id of the activity selected * @param {Object} newValue new value of the output values name */ -const outputValNameChangeHandler = (activityId, newValue) => { +const outputValueNameChangeHandler = (activityId, newValue) => { setOutputValueName(activityId, newValue); }; @@ -234,7 +234,7 @@ export { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, }; diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 4f597fbf..79480f3b 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -12,7 +12,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, } from './modelerSidebarFunctionality'; @@ -68,7 +68,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(newValue).toEqual(constants.MOCK_NEW_VALUE); }); - outputValNameChangeHandler( + outputValueNameChangeHandler( constants.MOCK_ACTIVITY_ID, constants.MOCK_NEW_VALUE ); From a24a531fa4365766f0c3ef8130b211f509182630 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 17 May 2021 13:38:16 +0200 Subject: [PATCH 028/149] implement team feedback part 1 --- frontend/src/components/App.jsx | 4 +- .../HeaderNavbar/HeaderNavbar.jsx | 13 +- frontend/src/components/pages/Error/Error.jsx | 2 +- .../RobotCodeEditor.jsx} | 10 +- .../RobotCodeEditor.module.css} | 0 .../RobotCodeEditorSyntaxPopup.jsx} | 0 .../RobotInteractionCockpit.jsx | 8 +- .../RobotInteractionExecutionSection.jsx | 2 +- .../RobotLogEntryCard.jsx | 0 .../RobotInteractionInputSection.jsx | 2 +- .../RobotInteractionParameterInput.jsx | 0 .../robotExecution.test.js | 2 +- .../robotExecutionTestData.js | 0 .../robotInteractionCockpitFunctionality.js | 117 ++++++++++++++++ .../BpmnModeler/BpmnModeler.jsx | 0 .../BpmnModeler/BpmnModeler.module.css | 0 .../RemoveUnsupportedBpmnFunctions.js | 0 .../ModelerSidebar/ModelerSidebar.jsx | 2 +- .../ModelerSidebar/ModelerSidebar.module.css | 0 .../PropertiesPanel/PropertiesPanel.jsx | 0 .../PPIdSection/PPIdSection.jsx | 0 .../PPNameSection/PPNameSection.jsx | 0 .../PPOutputValueSection.jsx | 0 .../PPParameterSection/PPParameterSection.jsx | 2 +- .../subComponents}/PPParameterInput.jsx | 2 +- .../PPRpaSection/PPRpaSection.jsx | 4 +- .../subComponents}/PPApplicationDropdown.jsx | 2 +- .../subComponents}/PPTaskDropdown.jsx | 2 +- .../PPTitleSection/PPTitleSection.jsx | 0 .../downloadStringAsFile.js | 0 .../modelerSidebarFunctionality.js | 12 +- .../modelerSidebarFunctionality.test.js | 26 ++-- ...modelerSidebarFunctionalityTestingUtils.js | 0 .../RobotModeler.jsx} | 6 +- .../RobotContainer/RobotContainer.jsx | 2 +- .../pages/RobotOverview/RobotOverview.jsx | 4 +- .../robotExecution.jsx | 67 --------- .../robotInteractionCockpitFunctionality.js | 52 ------- .../functionalities.js | 0 .../localSsotController/attributes.js | 0 .../localSsotController/parameters.js | 2 +- .../localSsotController/ssot.js | 0 .../sessionStorageUtils.js | 0 .../api/controllers/ssotParsingController.js | 2 +- server/api/routes/robots/robots.js | 4 +- .../robots/rpaAttributes/rpaAttributes.js | 10 ++ .../rpaAttributes/rpaAttributes.test.js | 130 ++++++++++++++++++ .../rpaParameters.js} | 0 .../rpaParameters.test.js} | 0 server/socket/socketHelperFunctions.js | 2 +- .../__tests__/SsotForTesting.json | 0 .../__tests__/SsotToRobotParser.test.js | 6 +- .../ssotToRobotParsing/generateCodeBase.js | 0 .../generateCodeForRpaTasks.js | 0 .../ssotToRobotParsing/retrieveParameters.js | 0 .../ssotToRobotParsing/robotCodeConstants.js | 0 .../ssotToRobotParsing/ssotToRobotParser.js | 0 wiki/Documentation-Folder-structure.md | 2 +- 58 files changed, 322 insertions(+), 179 deletions(-) rename frontend/src/components/{ => multiPageComponents}/HeaderNavbar/HeaderNavbar.jsx (87%) rename frontend/src/components/pages/{RobotFile/RobotFile.jsx => RobotCodeEditor/RobotCodeEditor.jsx} (90%) rename frontend/src/components/pages/{RobotFile/RobotFile.module.css => RobotCodeEditor/RobotCodeEditor.module.css} (100%) rename frontend/src/components/pages/{RobotFile/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx => RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx} (100%) rename frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/{singleComponents => subComponents}/RobotLogEntryCard.jsx (100%) rename frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/{singleComponents => subComponents}/RobotInteractionParameterInput.jsx (100%) rename frontend/src/{utils/componentsFunctionality/robotExecutionFunctionality => components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality}/robotExecution.test.js (97%) rename frontend/src/{utils/componentsFunctionality/robotExecutionFunctionality => components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality}/robotExecutionTestData.js (100%) create mode 100644 frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js rename frontend/src/components/pages/{Modeler => RobotModeler}/BpmnModeler/BpmnModeler.jsx (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/BpmnModeler/BpmnModeler.module.css (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/BpmnModeler/RemoveUnsupportedBpmnFunctions.js (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/ModelerSidebar.jsx (97%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/ModelerSidebar.module.css (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx (100%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx (94%) rename frontend/src/components/pages/{Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents => RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents}/PPParameterInput.jsx (97%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx (89%) rename frontend/src/components/pages/{Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents => RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents}/PPApplicationDropdown.jsx (95%) rename frontend/src/components/pages/{Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents => RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents}/PPTaskDropdown.jsx (95%) rename frontend/src/components/pages/{Modeler => RobotModeler}/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx (100%) rename frontend/src/{utils/componentsFunctionality => components/pages/RobotModeler/ModelerSidebar}/modelerSidebarFunctionality/downloadStringAsFile.js (100%) rename frontend/src/{utils/componentsFunctionality => components/pages/RobotModeler/ModelerSidebar}/modelerSidebarFunctionality/modelerSidebarFunctionality.js (95%) rename frontend/src/{utils/componentsFunctionality => components/pages/RobotModeler/ModelerSidebar}/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js (94%) rename frontend/src/{utils/componentsFunctionality => components/pages/RobotModeler/ModelerSidebar}/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js (100%) rename frontend/src/components/pages/{Modeler/Modeler.jsx => RobotModeler/RobotModeler.jsx} (92%) delete mode 100644 frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx delete mode 100644 frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js rename frontend/src/utils/{rpaFunctionality => sessionStorage/localFunctionalitiesController}/functionalities.js (100%) rename frontend/src/utils/{sessionStorageUtils => sessionStorage}/localSsotController/attributes.js (100%) rename frontend/src/utils/{sessionStorageUtils => sessionStorage}/localSsotController/parameters.js (99%) rename frontend/src/utils/{sessionStorageUtils => sessionStorage}/localSsotController/ssot.js (100%) rename frontend/src/utils/{sessionStorageUtils => sessionStorage}/sessionStorageUtils.js (100%) create mode 100644 server/api/routes/robots/rpaAttributes/rpaAttributes.js create mode 100644 server/api/routes/robots/rpaAttributes/rpaAttributes.test.js rename server/api/routes/robots/{parameters/parameters.js => rpaParameters/rpaParameters.js} (100%) rename server/api/routes/robots/{parameters/parameters.test.js => rpaParameters/rpaParameters.test.js} (100%) rename server/{services => utils}/ssotToRobotParsing/__tests__/SsotForTesting.json (100%) rename server/{services => utils}/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js (95%) rename server/{services => utils}/ssotToRobotParsing/generateCodeBase.js (100%) rename server/{services => utils}/ssotToRobotParsing/generateCodeForRpaTasks.js (100%) rename server/{services => utils}/ssotToRobotParsing/retrieveParameters.js (100%) rename server/{services => utils}/ssotToRobotParsing/robotCodeConstants.js (100%) rename server/{services => utils}/ssotToRobotParsing/ssotToRobotParser.js (100%) diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index 1b106522..0ee22be3 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -1,9 +1,9 @@ import React from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; -import Modeler from './pages/Modeler/Modeler'; +import Modeler from './pages/RobotModeler/RobotModeler'; import Home from './pages/Home/Home'; import Error from './pages/Error/Error'; -import RobotFile from './pages/RobotFile/RobotFile'; +import RobotFile from './pages/RobotCodeEditor/RobotCodeEditor'; import RobotOverview from './pages/RobotOverview/RobotOverview'; import RobotInteractionCockpit from './pages/RobotInteractionCockpit/RobotInteractionCockpit'; diff --git a/frontend/src/components/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx similarity index 87% rename from frontend/src/components/HeaderNavbar/HeaderNavbar.jsx rename to frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 0451d47b..adbbc88f 100644 --- a/frontend/src/components/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../resources/images/logo_cta.png'; +import logoCTA from '../../../resources/images/logo_cta.png'; const { Header } = Layout; @@ -15,7 +15,7 @@ const HeaderNavbar = (props) => { const { selectedKey } = props; const robotOverviewPageKey = 1; const bpmnModelerPageKey = 2; - const robotFilePageKey = 3; + const robotCodeEditorPageKey = 3; const robotInteractionPageKey = 4; let onOverview = false; @@ -29,7 +29,10 @@ const HeaderNavbar = (props) => { } let bpmnModelerLink = '/modeler'; - if (selectedKey === bpmnModelerPageKey || selectedKey === robotFilePageKey) { + if ( + selectedKey === bpmnModelerPageKey || + selectedKey === robotCodeEditorPageKey + ) { const robotId = JSON.parse(sessionStorage.getItem('robotId')); bpmnModelerLink += `/${robotId}`; } @@ -61,9 +64,9 @@ const HeaderNavbar = (props) => { )} {!onOverview && ( - + Robot File - + )} diff --git a/frontend/src/components/pages/Error/Error.jsx b/frontend/src/components/pages/Error/Error.jsx index 0d22a51d..a537f1a6 100644 --- a/frontend/src/components/pages/Error/Error.jsx +++ b/frontend/src/components/pages/Error/Error.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Layout, Typography } from 'antd'; -import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; const { Title } = Typography; diff --git a/frontend/src/components/pages/RobotFile/RobotFile.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx similarity index 90% rename from frontend/src/components/pages/RobotFile/RobotFile.jsx rename to frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index 50c28002..5cf11434 100644 --- a/frontend/src/components/pages/RobotFile/RobotFile.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -2,16 +2,16 @@ import React, { useState, useEffect } from 'react'; import { Layout, Button, Space, Row, Col } from 'antd'; import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; -import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import { getParsedRobotFile } from '../../../api/ssotRetrieval'; -import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; +import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; -import { upsert } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; +import { upsert } from '../../../utils/sessionStorage/localSsotController/ssot'; import 'prismjs/components/prism-robotframework'; import 'prismjs/themes/prism.css'; -import styles from './RobotFile.module.css'; +import styles from './RobotCodeEditor.module.css'; import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; -import RobotFileSyntaxModal from './RobotFileSyntaxModal/RobotFileSyntaxModal'; +import RobotFileSyntaxModal from './RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup'; /** * @description View of the robot file diff --git a/frontend/src/components/pages/RobotFile/RobotFile.module.css b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.module.css similarity index 100% rename from frontend/src/components/pages/RobotFile/RobotFile.module.css rename to frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.module.css diff --git a/frontend/src/components/pages/RobotFile/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx similarity index 100% rename from frontend/src/components/pages/RobotFile/RobotFileSyntaxModal/RobotFileSyntaxModal.jsx rename to frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index 0b25a136..dac82c1a 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -1,12 +1,14 @@ /* eslint-disable react/destructuring-assignment */ import React, { useState, useEffect, useRef } from 'react'; import { Layout, Card, Steps, Space, Button, Typography } from 'antd'; -import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import RobotInteractionInputSection from './RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection'; import RobotInteractionExecutionSection from './RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection'; -import { isRobotExecutable } from '../../../utils/componentsFunctionality/robotExecutionFunctionality/robotExecution'; +import { + isRobotExecutable, + getActivityAndParameterInformation, +} from './robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality'; import { startRobotForUser } from '../../../api/socketHandler/socketEmitter'; -import { getActivityAndParameterInformation } from '../../../utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality'; import customNotification from '../../../utils/componentsFunctionality/notificationUtils'; import { newRobotMonitorUpdate, diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 7fff7b45..759e4735 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -7,7 +7,7 @@ import { PauseCircleOutlined, } from '@ant-design/icons'; import PropTypes from 'prop-types'; -import RobotLogEntryCard from './singleComponents/RobotLogEntryCard'; +import RobotLogEntryCard from './subComponents/RobotLogEntryCard'; import styles from '../../RobotInteractionCockpit.module.css'; const { Title } = Typography; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/singleComponents/RobotLogEntryCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx similarity index 100% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/singleComponents/RobotLogEntryCard.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx index 27af5305..499e07ef 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Typography, Space } from 'antd'; -import RobotInteractionInputParameter from './singleComponents/RobotInteractionParameterInput'; +import RobotInteractionInputParameter from './subComponents/RobotInteractionParameterInput'; const { Title } = Typography; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx similarity index 100% rename from frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/singleComponents/RobotInteractionParameterInput.jsx rename to frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx diff --git a/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js similarity index 97% rename from frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js rename to frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js index bd6d2b5c..ac47f58a 100644 --- a/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.test.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js @@ -2,7 +2,7 @@ import { configuredRobotParamsCorrectly, configuredRobotActivitesCorrectly, -} from './robotExecution'; +} from './robotInteractionCockpitFunctionality'; import { paramObject1, paramObject2, diff --git a/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecutionTestData.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecutionTestData.js similarity index 100% rename from frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecutionTestData.js rename to frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecutionTestData.js diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js new file mode 100644 index 00000000..ba3ed13c --- /dev/null +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -0,0 +1,117 @@ +import { getAllParametersForRobot } from '../../../../api/parameterRetrieval'; +import { getAllAttributes } from '../../../../api/attributeRetrieval'; + +const configuredRobotParamsCorrectly = (parameterObjects) => { + let executability = true; + parameterObjects.forEach((parameterObject) => { + parameterObject.rpaParameters.forEach((parameter) => { + if ( + parameter.isRequired === true && + (parameter.requireUserInput === false || + parameter.requireUserInput === undefined) && + parameter.value === '' + ) { + console.error( + 'Required parameter not specified in paramter', + parameter + ); + executability = false; + } + }); + }); + return executability; +}; + +const configuredRobotActivitesCorrectly = (attributeObjects) => { + let executability = true; + attributeObjects.forEach((attributeObject) => { + if (attributeObject.rpaApplication === '') { + console.error( + `RPA Application of ${attributeObject.activityId} not specified`, + attributeObject + ); + executability = false; + } + if (attributeObject.rpaTask === '') { + console.error( + `RPA Task of ${attributeObject.activityId} not specified`, + attributeObject + ); + executability = false; + } + }); + return executability; +}; + +const isRobotExecutable = async (robotId) => { + const attributes = await getAllAttributes(robotId); + const activitiesAreCorrect = configuredRobotActivitesCorrectly( + await attributes.json() + ); + + const parameters = await getAllParametersForRobot(robotId); + const paramsAreCorrect = configuredRobotParamsCorrectly( + await parameters.json() + ); + + if (activitiesAreCorrect && paramsAreCorrect) { + return true; + } + return false; +}; + +/** + * @description For each activity of the current robot get the id, the name and all the parameters that require a user input + * @param {String} robotId Id of the robot for which we want to get all parameters + * @param {Function} setParameterList Setter function for the component state parameterList + * @param {Object} isMounted Describes if the component is currently mounted or not + */ +const getActivityAndParameterInformation = ( + robotId, + setParameterList, + isMounted +) => { + getAllParametersForRobot(robotId) + .then((response) => response.json()) + .then((parameterObjects) => { + if (parameterObjects.length > 0) { + const activityInformationList = []; + parameterObjects.forEach((parameterObject) => { + const { activityId } = parameterObject; + let activityName = ''; + const ssot = JSON.parse(sessionStorage.getItem('ssotLocal')); + ssot.elements.forEach((element) => { + if (element.id === activityId) { + activityName = element.name; + } + }); + const activityParameter = []; + parameterObject.rpaParameters.forEach((parameter) => { + if (parameter.requireUserInput) { + activityParameter.push(parameter); + } + }); + if (activityParameter.length > 0) { + const activityInformation = { + activityId, + activityParameter, + activityName, + }; + activityInformationList.push(activityInformation); + } + }); + + if (isMounted.current) { + setParameterList(activityInformationList); + } + } + }); +}; + +// eslint-disable-next-line import/prefer-default-export +export { + getActivityAndParameterInformation, + isRobotExecutable, + configuredRobotParamsCorrectly, + configuredRobotActivitesCorrectly, +}; diff --git a/frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.jsx rename to frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx diff --git a/frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.module.css b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.module.css similarity index 100% rename from frontend/src/components/pages/Modeler/BpmnModeler/BpmnModeler.module.css rename to frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.module.css diff --git a/frontend/src/components/pages/Modeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js similarity index 100% rename from frontend/src/components/pages/Modeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js rename to frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx similarity index 97% rename from frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx index 48910035..e0c329c2 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx @@ -15,7 +15,7 @@ import { modelerElementChangeHandler, downloadRobotFile, onSaveToCloud, -} from '../../../../utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality'; +} from './modelerSidebarFunctionality/modelerSidebarFunctionality'; const { Title } = Typography; const { Sider } = Layout; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.module.css b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.module.css similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/ModelerSidebar.module.css rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.module.css diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPNameSection/PPNameSection.jsx diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx similarity index 94% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx index 9d7f58ad..32f2495f 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Typography, Space } from 'antd'; -import PPParameterInput from './singleComponents/PPParameterInput'; +import PPParameterInput from './subComponents/PPParameterInput'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx similarity index 97% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx index 64ad95a9..e8ca5ac9 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/singleComponents/PPParameterInput.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx @@ -10,7 +10,7 @@ import styles from '../../../../ModelerSidebar.module.css'; import { setPropertyForParameter, parameterPropertyStatus, -} from '../../../../../../../../utils/sessionStorageUtils/localSsotController/parameters'; +} from '../../../../../../../../utils/sessionStorage/localSsotController/parameters'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx similarity index 89% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx index c6aa9a5b..cfc6891f 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/PPRpaSection.jsx @@ -1,8 +1,8 @@ import React from 'react'; import { Typography, Space } from 'antd'; import PropTypes from 'prop-types'; -import PropertiesPanelApplicationDropdown from './singleComponents/PPApplicationDropdown'; -import PropertiesPanelTaskDropdown from './singleComponents/PPTaskDropdown'; +import PropertiesPanelApplicationDropdown from './subComponents/PPApplicationDropdown'; +import PropertiesPanelTaskDropdown from './subComponents/PPTaskDropdown'; const { Text } = Typography; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPApplicationDropdown.jsx similarity index 95% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPApplicationDropdown.jsx index e917295d..60eea02a 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPApplicationDropdown.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPApplicationDropdown.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../../../ModelerSidebar.module.css'; -import { getRpaApplication } from '../../../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import { getRpaApplication } from '../../../../../../../../utils/sessionStorage/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPTaskDropdown.jsx similarity index 95% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPTaskDropdown.jsx index 57774dbb..6036d092 100644 --- a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/singleComponents/PPTaskDropdown.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPRpaSection/subComponents/PPTaskDropdown.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Select } from 'antd'; import PropTypes from 'prop-types'; import styles from '../../../../ModelerSidebar.module.css'; -import { getRpaTask } from '../../../../../../../../utils/sessionStorageUtils/localSsotController/attributes'; +import { getRpaTask } from '../../../../../../../../utils/sessionStorage/localSsotController/attributes'; const { Option } = Select; diff --git a/frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx similarity index 100% rename from frontend/src/components/pages/Modeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPTitleSection/PPTitleSection.jsx diff --git a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js similarity index 100% rename from frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/downloadStringAsFile.js rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js diff --git a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js similarity index 95% rename from frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index e61dac65..9b401ea5 100644 --- a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -5,20 +5,20 @@ * @module */ -import { fetchTasksFromDB } from '../../../api/applicationAndTaskRetrieval'; +import { fetchTasksFromDB } from '../../../../../api/applicationAndTaskRetrieval'; import { setRpaTask, setRpaApplication, -} from '../../sessionStorageUtils/localSsotController/attributes'; +} from '../../../../../utils/sessionStorage/localSsotController/attributes'; import { setSingleParameter, setOutputValueName, getParameterObject, -} from '../../sessionStorageUtils/localSsotController/parameters'; -import { getParsedRobotFile } from '../../../api/ssotRetrieval'; +} from '../../../../../utils/sessionStorage/localSsotController/parameters'; +import { getParsedRobotFile } from '../../../../../api/ssotRetrieval'; import downloadString from './downloadStringAsFile'; -import { upsert } from '../../sessionStorageUtils/localSsotController/ssot'; -import { parseBpmnToSsot } from '../../parser/bpmnToSsotParsing/bpmnToSsotParsing'; +import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; +import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; /** * @description Gets called when the the button is pressed to save to the cloud. diff --git a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js similarity index 94% rename from frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 7b7a8e1f..0b509c37 100644 --- a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -2,15 +2,15 @@ /* eslint-disable import/first */ /* eslint-disable no-undef */ -jest.mock('../../../api/ssotRetrieval'); +jest.mock('../../../../../api/ssotRetrieval'); jest.mock('./downloadStringAsFile'); -jest.mock('../../sessionStorageUtils/localSsotController/ssot'); -jest.mock('../../parser/bpmnToSsotParsing/bpmnToSsotParsing'); +jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); +jest.mock('../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'); -jest.mock('../../../api/applicationAndTaskRetrieval'); -jest.mock('../../sessionStorageUtils/localSsotController/parameters'); -jest.mock('../../sessionStorageUtils/localSsotController/attributes'); -jest.mock('../../sessionStorageUtils/localSsotController/ssot'); +jest.mock('../../../../../api/applicationAndTaskRetrieval'); +jest.mock('../../../../../utils/sessionStorage/localSsotController/parameters'); +jest.mock('../../../../../utils/sessionStorage/localSsotController/attributes'); +jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); import { nameChangedHandler, @@ -26,18 +26,18 @@ import { import { setRpaTask, setRpaApplication, -} from '../../sessionStorageUtils/localSsotController/attributes'; +} from '../../../../../utils/sessionStorage/localSsotController/attributes'; import { setSingleParameter, setOutputValueName, getParameterObject, -} from '../../sessionStorageUtils/localSsotController/parameters'; -import { fetchTasksFromDB } from '../../../api/applicationAndTaskRetrieval'; +} from '../../../../../utils/sessionStorage/localSsotController/parameters'; +import { fetchTasksFromDB } from '../../../../../api/applicationAndTaskRetrieval'; import constants from './modelerSidebarFunctionalityTestingUtils'; -import { getParsedRobotFile } from '../../../api/ssotRetrieval'; +import { getParsedRobotFile } from '../../../../../api/ssotRetrieval'; import downloadString from './downloadStringAsFile'; -import { upsert } from '../../sessionStorageUtils/localSsotController/ssot'; -import { parseBpmnToSsot } from '../../parser/bpmnToSsotParsing/bpmnToSsotParsing'; +import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; +import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; describe('Robot Metadata Utilities Tests', () => { it('download robot file', async () => { diff --git a/frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js similarity index 100% rename from frontend/src/utils/componentsFunctionality/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js rename to frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js diff --git a/frontend/src/components/pages/Modeler/Modeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx similarity index 92% rename from frontend/src/components/pages/Modeler/Modeler.jsx rename to frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 975cb430..26aa340e 100644 --- a/frontend/src/components/pages/Modeler/Modeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -1,17 +1,17 @@ import React, { useState, useEffect } from 'react'; import { Layout } from 'antd'; import BpmnModeler from './BpmnModeler/BpmnModeler'; -import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/ssotRetrieval'; import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; import { getAllAttributes } from '../../../api/attributeRetrieval'; import { getAllRpaFunctionalities } from '../../../api/applicationAndTaskRetrieval'; -import { setRobotId } from '../../../utils/sessionStorageUtils/localSsotController/ssot'; +import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; import { initAvailableApplicationsSessionStorage, initSessionStorage, -} from '../../../utils/sessionStorageUtils/sessionStorageUtils'; +} from '../../../utils/sessionStorage/sessionStorageUtils'; import 'bpmn-js/dist/assets/diagram-js.css'; import 'bpmn-font/dist/css/bpmn-embedded.css'; diff --git a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index 5015722b..a4859055 100644 --- a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -9,7 +9,7 @@ import { import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import styles from './RobotContainer.module.css'; -import { initSsotSessionStorage } from '../../../../utils/sessionStorageUtils/localSsotController/ssot'; +import { initSsotSessionStorage } from '../../../../utils/sessionStorage/localSsotController/ssot'; import { changeSsotName, deleteRobotFromDB, diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index b60daf02..f9513b36 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { Layout, Input, Space, Row, Select } from 'antd'; -import HeaderNavbar from '../../HeaderNavbar/HeaderNavbar'; +import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import RobotContainer from './RobotContainer/RobotContainer'; import { joinRoomForUser } from '../../../api/socketHandler/socketEmitter'; import { @@ -9,7 +9,7 @@ import { newClientJoined, } from '../../../api/socketHandler/socketListeners'; import CreateRobotContainer from './RobotContainer/CreateRobotContainer'; -import { initSessionStorage } from '../../../utils/sessionStorageUtils/sessionStorageUtils'; +import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import { fetchSsotsForUser, createNewRobot } from '../../../api/ssotRetrieval'; const { Search } = Input; diff --git a/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx b/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx deleted file mode 100644 index d6d0da9a..00000000 --- a/frontend/src/utils/componentsFunctionality/robotExecutionFunctionality/robotExecution.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import { getAllAttributes } from '../../../api/attributeRetrieval'; -import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; - -const configuredRobotParamsCorrectly = (parameterObjects) => { - let executability = true; - parameterObjects.forEach((parameterObject) => { - parameterObject.rpaParameters.forEach((parameter) => { - if ( - parameter.isRequired === true && - (parameter.requireUserInput === false || - parameter.requireUserInput === undefined) && - parameter.value === '' - ) { - console.error( - 'Required parameter not specified in paramter', - parameter - ); - executability = false; - } - }); - }); - return executability; -}; - -const configuredRobotActivitesCorrectly = (attributeObjects) => { - let executability = true; - attributeObjects.forEach((attributeObject) => { - if (attributeObject.rpaApplication === '') { - console.error( - `RPA Application of ${attributeObject.activityId} not specified`, - attributeObject - ); - executability = false; - } - if (attributeObject.rpaTask === '') { - console.error( - `RPA Task of ${attributeObject.activityId} not specified`, - attributeObject - ); - executability = false; - } - }); - return executability; -}; - -const isRobotExecutable = async (robotId) => { - const attributes = await getAllAttributes(robotId); - const activitiesAreCorrect = configuredRobotActivitesCorrectly( - await attributes.json() - ); - - const parameters = await getAllParametersForRobot(robotId); - const paramsAreCorrect = configuredRobotParamsCorrectly( - await parameters.json() - ); - - if (activitiesAreCorrect && paramsAreCorrect) { - return true; - } - return false; -}; - -export { - isRobotExecutable, - configuredRobotParamsCorrectly, - configuredRobotActivitesCorrectly, -}; diff --git a/frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js deleted file mode 100644 index 00a066ca..00000000 --- a/frontend/src/utils/componentsFunctionality/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ /dev/null @@ -1,52 +0,0 @@ -import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; - -/** - * @description For each activity of the current robot get the id, the name and all the parameters that require a user input - * @param {String} robotId Id of the robot for which we want to get all parameters - * @param {Function} setParameterList Setter function for the component state parameterList - * @param {Object} isMounted Describes if the component is currently mounted or not - */ -const getActivityAndParameterInformation = ( - robotId, - setParameterList, - isMounted -) => { - getAllParametersForRobot(robotId) - .then((response) => response.json()) - .then((parameterObjects) => { - if (parameterObjects.length > 0) { - const activityInformationList = []; - parameterObjects.forEach((parameterObject) => { - const { activityId } = parameterObject; - let activityName = ''; - const ssot = JSON.parse(sessionStorage.getItem('ssotLocal')); - ssot.elements.forEach((element) => { - if (element.id === activityId) { - activityName = element.name; - } - }); - const activityParameter = []; - parameterObject.rpaParameters.forEach((parameter) => { - if (parameter.requireUserInput) { - activityParameter.push(parameter); - } - }); - if (activityParameter.length > 0) { - const activityInformation = { - activityId, - activityParameter, - activityName, - }; - activityInformationList.push(activityInformation); - } - }); - - if (isMounted.current) { - setParameterList(activityInformationList); - } - } - }); -}; - -// eslint-disable-next-line import/prefer-default-export -export { getActivityAndParameterInformation }; diff --git a/frontend/src/utils/rpaFunctionality/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js similarity index 100% rename from frontend/src/utils/rpaFunctionality/functionalities.js rename to frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js diff --git a/frontend/src/utils/sessionStorageUtils/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js similarity index 100% rename from frontend/src/utils/sessionStorageUtils/localSsotController/attributes.js rename to frontend/src/utils/sessionStorage/localSsotController/attributes.js diff --git a/frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js similarity index 99% rename from frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js rename to frontend/src/utils/sessionStorage/localSsotController/parameters.js index 06b40503..f8f33f67 100644 --- a/frontend/src/utils/sessionStorageUtils/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -3,7 +3,7 @@ * @module */ import { deleteParametersForActivities } from '../../../api/ssotRetrieval'; -import getRpaFunctionalitiesObject from '../../rpaFunctionality/functionalities'; +import getRpaFunctionalitiesObject from '../localFunctionalitiesController/functionalities'; import { getAttributeObjectForActivity } from './attributes'; const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; diff --git a/frontend/src/utils/sessionStorageUtils/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js similarity index 100% rename from frontend/src/utils/sessionStorageUtils/localSsotController/ssot.js rename to frontend/src/utils/sessionStorage/localSsotController/ssot.js diff --git a/frontend/src/utils/sessionStorageUtils/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js similarity index 100% rename from frontend/src/utils/sessionStorageUtils/sessionStorageUtils.js rename to frontend/src/utils/sessionStorage/sessionStorageUtils.js diff --git a/server/api/controllers/ssotParsingController.js b/server/api/controllers/ssotParsingController.js index b778c7b0..6938da77 100644 --- a/server/api/controllers/ssotParsingController.js +++ b/server/api/controllers/ssotParsingController.js @@ -1,4 +1,4 @@ -const ssotToRobotparser = require('../../services/ssotToRobotParsing/ssotToRobotParser.js'); +const ssotToRobotparser = require('../../utils/ssotToRobotParsing/ssotToRobotParser.js'); /** * @swagger diff --git a/server/api/routes/robots/robots.js b/server/api/routes/robots/robots.js index cf75d7fd..6316b306 100644 --- a/server/api/routes/robots/robots.js +++ b/server/api/routes/robots/robots.js @@ -1,6 +1,6 @@ const express = require('express'); -const rpaattributesRouter = require('./rpaattributes/rpaattributes'); -const parametersRouter = require('./parameters/parameters'); +const rpaattributesRouter = require('./rpaAttributes/rpaAttributes'); +const parametersRouter = require('./rpaParameters/rpaParameters'); const parsingController = require('../../controllers/ssotParsingController'); const retrievalController = require('../../controllers/ssotRetrievalController'); diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.js new file mode 100644 index 00000000..f3a77a5d --- /dev/null +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.js @@ -0,0 +1,10 @@ +const express = require('express'); +const rpaAttributesController = require('../../../controllers/ssotRpaAttributes'); + +const router = express.Router(); + +router.put('/', rpaAttributesController.updateMany); +router.delete('/:robotId', rpaAttributesController.deleteForActivities); +router.get('/:robotId', rpaAttributesController.retrieveAttributesForRobot); + +module.exports = router; diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js new file mode 100644 index 00000000..30715cf1 --- /dev/null +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js @@ -0,0 +1,130 @@ +/* eslint-disable no-undef */ +/* eslint-disable no-underscore-dangle */ +const mongoose = require('mongoose'); +const httpMocks = require('node-mocks-http'); +const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); +const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); + +// eslint-disable-next-line no-unused-vars +const rpaTaskModel = require('../../../models/rpaTaskModel'); + +const testData = require('../../../../utils/testingUtils/testData'); +const { + testSsot, + testRobotId, +} = require('../../../../utils/testingUtils/testData'); + +/** + * Connect to a new in-memory database before running any tests. + */ +beforeAll(async () => dbHandler.connect()); + +/** + * Clear all test data after every test. + */ +afterEach(async () => dbHandler.clearDatabase()); + +/** + * Remove and close the db and server. + */ +afterAll(async () => dbHandler.closeDatabase()); + +describe('PUT /robots/rpaattributes', () => { + it('successfully updates all attributes for a robot', async () => { + await dbLoader.loadAttributesInDb(); + + const newAppValue = 'NewTestApp'; + const newTaskValue = 'NewTestTask'; + + const request = httpMocks.createRequest({ + method: 'POST', + body: { + attributeObjectList: [ + { + activityId: 'Activity_175v5b5', + robotId: '606199015d691786a44a608f', + rpaApplication: newAppValue, + rpaTask: newTaskValue, + }, + ], + }, + }); + const response = httpMocks.createResponse(); + + await ssotAttributesController.updateMany(request, response); + expect(response.statusCode).toBe(200); + const data = await response._getData(); + expect(data.modifiedCount).toBe(1); + + // verify if really in DB + const newAttributesObject = await mongoose + .model('rpaAttributes') + .findOne({ + robotId: testRobotId, + activityId: testSsot.elements[2].id, + }) + .exec(); + + expect(newAttributesObject.rpaApplication).toEqual(newAppValue); + expect(newAttributesObject.rpaTask).toEqual(newTaskValue); + }); +}); + +describe('GET /robots/rpaattributes/{robotId}', () => { + it('successfully retreives all Attributes for a robot', async () => { + await dbLoader.loadAttributesInDb(); + + const request = httpMocks.createRequest({ + params: { + robotId: testRobotId, + }, + }); + const response = httpMocks.createResponse(); + + await ssotAttributesController.retrieveAttributesForRobot( + request, + response + ); + expect(response.statusCode).toBe(200); + const data = await response._getData(); + + expect(data.length).toBe(3); + expect(JSON.stringify(data)).toEqual( + JSON.stringify([ + testData.testAttributes1, + testData.testAttributes2, + testData.testAttributes3, + ]) + ); + }); +}); + +describe('DELETE /robots/rpaattributes/{robotId}', () => { + it('deletes removed activity related attributes', async () => { + await dbLoader.loadSsotInDb(); + await dbLoader.loadAttributesInDb(); + + const deletedActivityList = [ + testSsot.elements[2].id, + testSsot.elements[3].id, + ]; + const payload = { activityIdList: deletedActivityList }; + + const request = httpMocks.createRequest({ + method: 'DELETE', + body: payload, + params: { + robotId: testRobotId, + }, + }); + const response = httpMocks.createResponse(); + + await ssotAttributesController.deleteForActivities(request, response); + + const foundAttributes = await mongoose.model('rpaAttributes').find().exec(); + expect(foundAttributes.length).toBe(1); + + expect(response.statusCode).toBe(200); + }); +}); diff --git a/server/api/routes/robots/parameters/parameters.js b/server/api/routes/robots/rpaParameters/rpaParameters.js similarity index 100% rename from server/api/routes/robots/parameters/parameters.js rename to server/api/routes/robots/rpaParameters/rpaParameters.js diff --git a/server/api/routes/robots/parameters/parameters.test.js b/server/api/routes/robots/rpaParameters/rpaParameters.test.js similarity index 100% rename from server/api/routes/robots/parameters/parameters.test.js rename to server/api/routes/robots/rpaParameters/rpaParameters.test.js diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 9fa01222..84dff022 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ require('express'); const mongoose = require('mongoose'); -const ssotToRobotParser = require('../services/ssotToRobotParsing/ssotToRobotParser.js'); +const ssotToRobotParser = require('../utils/ssotToRobotParsing/ssotToRobotParser.js'); const ssotModels = require('../api/models/singleSourceOfTruthModel.js'); const userAccessObject = require('../api/models/userAccessObjectModel.js'); const jobsModel = require('../api/models/robotJobModel.js'); diff --git a/server/services/ssotToRobotParsing/__tests__/SsotForTesting.json b/server/utils/ssotToRobotParsing/__tests__/SsotForTesting.json similarity index 100% rename from server/services/ssotToRobotParsing/__tests__/SsotForTesting.json rename to server/utils/ssotToRobotParsing/__tests__/SsotForTesting.json diff --git a/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js similarity index 95% rename from server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js rename to server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js index 3cd66cd4..d879c689 100644 --- a/server/services/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -1,13 +1,13 @@ /* eslint-disable no-undef */ const parser = require('../ssotToRobotParser'); const testSsot = require('./SsotForTesting.json'); -const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../testingUtils/testDatabaseHandler'); +const dbLoader = require('../../testingUtils/databaseLoader'); const { testRobotId, testJobId, testRobotCode, -} = require('../../../utils/testingUtils/testData'); +} = require('../../testingUtils/testData'); const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; const OPEN_WORKBOOK_CMD = 'Open Workbook'; diff --git a/server/services/ssotToRobotParsing/generateCodeBase.js b/server/utils/ssotToRobotParsing/generateCodeBase.js similarity index 100% rename from server/services/ssotToRobotParsing/generateCodeBase.js rename to server/utils/ssotToRobotParsing/generateCodeBase.js diff --git a/server/services/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js similarity index 100% rename from server/services/ssotToRobotParsing/generateCodeForRpaTasks.js rename to server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js diff --git a/server/services/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js similarity index 100% rename from server/services/ssotToRobotParsing/retrieveParameters.js rename to server/utils/ssotToRobotParsing/retrieveParameters.js diff --git a/server/services/ssotToRobotParsing/robotCodeConstants.js b/server/utils/ssotToRobotParsing/robotCodeConstants.js similarity index 100% rename from server/services/ssotToRobotParsing/robotCodeConstants.js rename to server/utils/ssotToRobotParsing/robotCodeConstants.js diff --git a/server/services/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js similarity index 100% rename from server/services/ssotToRobotParsing/ssotToRobotParser.js rename to server/utils/ssotToRobotParsing/ssotToRobotParser.js diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index 03019bcc..4fbe9d55 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -37,7 +37,7 @@ Let's focus on the **src/** folder. On the highest level the relevant file is th - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - **rpaFunctionality/**: #todo - - **sessionStorageUtils/**: Contains all the helper files we need to interact with the session storage + - **sessionStorage/**: Contains all the helper files we need to interact with the session storage - **socket/**: #todo # Naming conventions From c56dc5ebf661b52090bd4e506fecd0c81ab68b6b Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 17 May 2021 14:39:01 +0200 Subject: [PATCH 029/149] updated readme --- README.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9f65dc10..dec57901 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ark_automate +# Ark Automate [![GitHub stars](https://img.shields.io/github/stars/bptlab/ark_automate)](https://github.com/bptlab/ark_automate) [![GitHub open issues](https://img.shields.io/github/issues/bptlab/ark_automate)](https://github.com/bptlab/ark_automate/issues) @@ -10,12 +10,19 @@ Ark-Automate is a platform that allows office users and software developers to a ## Installation & Setup -Please try running the latest version of: +### Repository Setup -- Node.js and npm -- nodemon (`npm install nodemon -g`) +Please install: -And then install all dependencies with `npm install` in the server and client directory. +1. [Node.js](https://nodejs.org/en/) (at least v10.19) using the [installer](https://nodejs.org/en/download/) +2. [npm](https://www.npmjs.com/get-npm) (at least v6.14) which is normally installed with Node.js +3. [nodemon](https://www.npmjs.com/package/nodemon)(at least v2) using `npm install nodemon -g` + +Then to complete the repository setup: + +1. Clone this repository using `git clone https://github.com/bptlab/ark_automate.git` +2. Change into the repository folder using `cd ark_automate` +3. Install all dependencies by running `npm install` in the server and frontend directory. You can easily do this by running ` cd server/ && npm install && cd .. && cd frontend/ && npm install && cd ..` in the projects root directory ### Set up Heroku @@ -26,14 +33,14 @@ For this step, an invitation to our Heroku project is necessary. Please create y 3. Create a new .env file in the server directory 4. Add the MongoDb URI to your .env file by running the following command in the server directory `heroku config:get MONGODB_URI -s -a ark-automate >> .env` -### Setup linter +### Setup development tools -We use ESLint with the AirBnB Codestyle. Simply install the Plug-in ([VSCode](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)) for your IDE and it should recognize the config files. Otherwise follow [this guide](https://eslint.org/docs/user-guide/getting-started). +Tools being used in this project are [EsLint](https://eslint.org/) and [Prettier](https://prettier.io/). For information on how to configure them see our [coding standards](https://github.com/bptlab/ark_automate/wiki/Coding-standards#tools) ## Run application -Before running, please always make sure to have the most recent module versions installed using `npm install` in the server, as well as the client directory. -To run a development preview of the app, navigate to the server directory and run `npm run local` to start the API server, navigate into the client folder and run `npm start` again to also start the frontend. +Before running, please always make sure to have the most recent module versions installed using `npm install` in the server, as well as the frontend directory. +To run a development preview of the app, navigate to the server directory and run `npm run local` to start the API server, navigate into the frontend folder and run `npm start` again to also start the frontend. Now check http://localhost:3000/ to have a look at the app. To run the local client, follow the steps in the [Readme of the local client](https://github.com/bptlab/ark_automate_local#readme). @@ -51,10 +58,10 @@ The main contributors to the project are the four members of the [2020/21 Bachel - [Sandro Speh](https://github.com/SanJSp) - [Daniel Woelki](https://github.com/WolfgangDaniel) -These four participants will push the project forward as part of their bachelor's degree until the summer of 2021. +These four participants will push the project forward as part of their bachelor's degree until the summer of 2021. At the same time our commitment to open source means that we are enabling -in fact encouraging- all interested parties to contribute and become part of its developer community. ## Project documentation Our [architecture](https://github.com/bptlab/ark_automate/wiki/Architecture-in-2021), as well as our current [vision of the project](https://github.com/bptlab/ark_automate/wiki/Vision-for-2021) can be found in our [wiki](https://github.com/bptlab/ark_automate/wiki). -Please also see the [code documentation website](https://bptlab.github.io/ark_automate/) for the documentation of the code including examples. +Please also see the [code documentation](https://bptlab.github.io/ark_automate/) on its own website including examples. From 4f717ed2d809fbaa4b32f789c71683e73c51cc4c Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 17 May 2021 14:39:14 +0200 Subject: [PATCH 030/149] added documentation to robotExecution.jsx --- client/src/utils/robotExecution.jsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/client/src/utils/robotExecution.jsx b/client/src/utils/robotExecution.jsx index 12d41079..620a06ad 100644 --- a/client/src/utils/robotExecution.jsx +++ b/client/src/utils/robotExecution.jsx @@ -1,6 +1,12 @@ import { getAllAttributes } from '../api/attributeRetrieval'; import { getAllParametersForRobot } from '../api/parameterRetrieval'; +/** + * @description Will return a boolean regarding the correct configuration of the given parameterObejcts belonging to a robot. + * If a paramter has is required and not value is given and th evalue will not be specified later by the user, the paramter is not correctly configured. + * @param {Object[]} parameterObjects array of parameterObjects that are to be checked + * @returns {boolean} a boolean value regarding the correctness of the parameter configuration + */ const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; parameterObjects.forEach((parameterObject) => { @@ -22,6 +28,12 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { return executability; }; +/** + * @description Will return a boolean regarding the correct configuration regarding the given attributeObjects of a robot. + * If an attribute has no specified application or task, the attribute is not correctly configured. + * @param {Object[]} attributeObjects array of attributeObjects that are to be checked + * @returns {boolean} a boolean value regarding the correctness of the attribute configuration + */ const configuredRobotActivitesCorrectly = (attributeObjects) => { let executability = true; attributeObjects.forEach((attributeObject) => { @@ -43,6 +55,12 @@ const configuredRobotActivitesCorrectly = (attributeObjects) => { return executability; }; +/** + * @description Will return a boolean regarding the correct configuration of a robot. + * If a robot has incorrectly configured attributes or parameters, then the robot is not correctly configured. + * @param {String} robotId RobotId of the robot that is to be checked + * @returns {boolean} a boolean value regarding the executability of the robot + */ const isRobotExecutable = async (robotId) => { const attributes = await getAllAttributes(robotId); const activitiesAreCorrect = configuredRobotActivitesCorrectly( From d599a8c97052c0a7ec919552a0a8dd4fb56f3158 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 17 May 2021 14:47:11 +0200 Subject: [PATCH 031/149] implement team feedback part 2 --- .../functionalities/functionalities.js} | 0 .../robots/robotsRetrieval.js} | 70 ------------------- .../robots/rpaAttributeRetrieval.js} | 24 ++++++- .../robots/rpaParameterRetrieval.js} | 24 ++++++- frontend/src/api/routes/users/users.js | 36 ++++++++++ frontend/src/components/App.jsx | 2 +- .../HeaderNavbar/HeaderNavbar.jsx | 4 +- .../pages/RobotCodeEditor/RobotCodeEditor.jsx | 2 +- .../robotInteractionCockpitFunctionality.js | 4 +- .../modelerSidebarFunctionality.js | 4 +- .../modelerSidebarFunctionality.test.js | 8 +-- .../pages/RobotModeler/RobotModeler.jsx | 8 +-- .../RobotContainer/RobotContainer.jsx | 2 +- .../pages/RobotOverview/RobotOverview.jsx | 5 +- .../localSsotController/attributes.js | 2 +- .../localSsotController/parameters.js | 2 +- .../localSsotController/ssot.js | 11 +-- .../sessionStorage/sessionStorageUtils.js | 2 +- 18 files changed, 113 insertions(+), 97 deletions(-) rename frontend/src/api/{applicationAndTaskRetrieval.js => routes/functionalities/functionalities.js} (100%) rename frontend/src/api/{ssotRetrieval.js => routes/robots/robotsRetrieval.js} (50%) rename frontend/src/api/{attributeRetrieval.js => routes/robots/rpaAttributeRetrieval.js} (61%) rename frontend/src/api/{parameterRetrieval.js => routes/robots/rpaParameterRetrieval.js} (59%) create mode 100644 frontend/src/api/routes/users/users.js diff --git a/frontend/src/api/applicationAndTaskRetrieval.js b/frontend/src/api/routes/functionalities/functionalities.js similarity index 100% rename from frontend/src/api/applicationAndTaskRetrieval.js rename to frontend/src/api/routes/functionalities/functionalities.js diff --git a/frontend/src/api/ssotRetrieval.js b/frontend/src/api/routes/robots/robotsRetrieval.js similarity index 50% rename from frontend/src/api/ssotRetrieval.js rename to frontend/src/api/routes/robots/robotsRetrieval.js index f6bd70ef..3fcd3927 100644 --- a/frontend/src/api/ssotRetrieval.js +++ b/frontend/src/api/routes/robots/robotsRetrieval.js @@ -19,16 +19,6 @@ const getSsot = async (robotId) => { return response; }; -/** - * @description Fetch all those ssot names and ids, which are available for the current user - * @param { String } userId - String including the user id - */ -const fetchSsotsForUser = async (userId) => { - const requestString = `/users/${userId}/robots`; - const response = await fetch(requestString); - return response; -}; - /** * @description This function renames the robot in the ssot * @param { String } robotId - String including the robotId @@ -50,26 +40,6 @@ const changeSsotName = async (robotId, newRobotName) => { return response; }; -/** - * @description Create a new robot with the specified name for the specified user - * @param {String} newName - String including the userId - */ -const createNewRobot = async (userId, robotName) => { - const body = { - userId, - robotName, - }; - const requestString = `/users/${userId}/robots`; - const response = await fetch(requestString, { - body: JSON.stringify(body), - method: 'POST', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }); - return response; -}; - /** * @description Will send a backend call to delete a robot * @param {String} robotId Id of the robot that is deleted @@ -81,42 +51,6 @@ const deleteRobotFromDB = async (robotId) => { }); }; -/** - * @description Sends a callout to the backend to delete parameters for the given activities - * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids - */ -const deleteParametersForActivities = (robotId, activityIdList) => { - const requestStringParameters = `/robots/parameters/${robotId}`; - fetch(requestStringParameters, { - body: JSON.stringify({ activityIdList }), - method: 'DELETE', - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }).catch((err) => { - console.error(err); - }); -}; - -/** - * @description Sends a callout to the backend to delete attributes for the given activities - * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids - */ -const deleteAttributesForActivities = (robotId, activityIdList) => { - const requestStringParameters = `/robots/parameters/${robotId}`; - fetch(requestStringParameters, { - method: 'DELETE', - body: JSON.stringify({ activityIdList }), - headers: { - 'Content-Type': 'application/json;charset=utf-8', - }, - }).catch((err) => { - console.error(err); - }); -}; - /** * @description Overwrites an existing sssot in the backend with a new one * @param {String} robotId Id of the robot that is being overwritten @@ -139,11 +73,7 @@ const updateRobot = async (robotId, ssot) => { export { getParsedRobotFile, getSsot, - fetchSsotsForUser, changeSsotName, - createNewRobot, deleteRobotFromDB, - deleteParametersForActivities, - deleteAttributesForActivities, updateRobot, }; diff --git a/frontend/src/api/attributeRetrieval.js b/frontend/src/api/routes/robots/rpaAttributeRetrieval.js similarity index 61% rename from frontend/src/api/attributeRetrieval.js rename to frontend/src/api/routes/robots/rpaAttributeRetrieval.js index f643e218..7c99ea98 100644 --- a/frontend/src/api/attributeRetrieval.js +++ b/frontend/src/api/routes/robots/rpaAttributeRetrieval.js @@ -31,4 +31,26 @@ const updateManyAttributes = async (attributeObjectList) => { return response; }; -export { getAllAttributes, updateManyAttributes }; +/** + * @description Sends a callout to the backend to delete attributes for the given activities + * @param {String} robotId Id of the robot that is being used + * @param {String} unusedActivityListString Stringified List of Activity Ids + */ +const deleteAttributesForActivities = (robotId, activityIdList) => { + const requestStringParameters = `/robots/parameters/${robotId}`; + fetch(requestStringParameters, { + method: 'DELETE', + body: JSON.stringify({ activityIdList }), + headers: { + 'Content-Type': 'application/json;charset=utf-8', + }, + }).catch((err) => { + console.error(err); + }); +}; + +export { + getAllAttributes, + updateManyAttributes, + deleteAttributesForActivities, +}; diff --git a/frontend/src/api/parameterRetrieval.js b/frontend/src/api/routes/robots/rpaParameterRetrieval.js similarity index 59% rename from frontend/src/api/parameterRetrieval.js rename to frontend/src/api/routes/robots/rpaParameterRetrieval.js index 36947a28..916f1190 100644 --- a/frontend/src/api/parameterRetrieval.js +++ b/frontend/src/api/routes/robots/rpaParameterRetrieval.js @@ -31,4 +31,26 @@ const updateManyParameters = async (parameterObjectsList) => { return response; }; -export { getAllParametersForRobot, updateManyParameters }; +/** + * @description Sends a callout to the backend to delete parameters for the given activities + * @param {String} robotId Id of the robot that is being used + * @param {String} unusedActivityListString Stringified List of Activity Ids + */ +const deleteParametersForActivities = (robotId, activityIdList) => { + const requestStringParameters = `/robots/parameters/${robotId}`; + fetch(requestStringParameters, { + body: JSON.stringify({ activityIdList }), + method: 'DELETE', + headers: { + 'Content-Type': 'application/json;charset=utf-8', + }, + }).catch((err) => { + console.error(err); + }); +}; + +export { + getAllParametersForRobot, + updateManyParameters, + deleteParametersForActivities, +}; diff --git a/frontend/src/api/routes/users/users.js b/frontend/src/api/routes/users/users.js new file mode 100644 index 00000000..8d1f4b0a --- /dev/null +++ b/frontend/src/api/routes/users/users.js @@ -0,0 +1,36 @@ +/** + * @category Frontend + * @module + */ + +/** + * @description Fetch all those ssot names and ids, which are available for the current user + * @param { String } userId - String including the user id + */ +const fetchSsotsForUser = async (userId) => { + const requestString = `/users/${userId}/robots`; + const response = await fetch(requestString); + return response; +}; + +/** + * @description Create a new robot with the specified name for the specified user + * @param {String} newName - String including the userId + */ +const createNewRobot = async (userId, robotName) => { + const body = { + userId, + robotName, + }; + const requestString = `/users/${userId}/robots`; + const response = await fetch(requestString, { + body: JSON.stringify(body), + method: 'POST', + headers: { + 'Content-Type': 'application/json;charset=utf-8', + }, + }); + return response; +}; + +export { fetchSsotsForUser, createNewRobot /* , shareRobotWithUser */ }; diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index 0ee22be3..b0d58dd3 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -18,7 +18,7 @@ const App = () => ( - + { )} {!onOverview && ( - Robot File - + Robot Code + )} diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index 5cf11434..0067df94 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -3,7 +3,7 @@ import { Layout, Button, Space, Row, Col } from 'antd'; import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; -import { getParsedRobotFile } from '../../../api/ssotRetrieval'; +import { getParsedRobotFile } from '../../../api/routes/robots/robotsRetrieval'; import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; import { upsert } from '../../../utils/sessionStorage/localSsotController/ssot'; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index ba3ed13c..4fceb167 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -1,5 +1,5 @@ -import { getAllParametersForRobot } from '../../../../api/parameterRetrieval'; -import { getAllAttributes } from '../../../../api/attributeRetrieval'; +import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameterRetrieval'; +import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributeRetrieval'; const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 9b401ea5..d40fc50c 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -5,7 +5,7 @@ * @module */ -import { fetchTasksFromDB } from '../../../../../api/applicationAndTaskRetrieval'; +import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/functionalities'; import { setRpaTask, setRpaApplication, @@ -15,7 +15,7 @@ import { setOutputValueName, getParameterObject, } from '../../../../../utils/sessionStorage/localSsotController/parameters'; -import { getParsedRobotFile } from '../../../../../api/ssotRetrieval'; +import { getParsedRobotFile } from '../../../../../api/routes/robots/robotsRetrieval'; import downloadString from './downloadStringAsFile'; import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 0b509c37..81286388 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -2,12 +2,12 @@ /* eslint-disable import/first */ /* eslint-disable no-undef */ -jest.mock('../../../../../api/ssotRetrieval'); +jest.mock('../../../../../api/routes/robots/robotsRetrieval'); jest.mock('./downloadStringAsFile'); jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); jest.mock('../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'); -jest.mock('../../../../../api/applicationAndTaskRetrieval'); +jest.mock('../../../../../api/routes/functionalities/functionalities'); jest.mock('../../../../../utils/sessionStorage/localSsotController/parameters'); jest.mock('../../../../../utils/sessionStorage/localSsotController/attributes'); jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); @@ -32,9 +32,9 @@ import { setOutputValueName, getParameterObject, } from '../../../../../utils/sessionStorage/localSsotController/parameters'; -import { fetchTasksFromDB } from '../../../../../api/applicationAndTaskRetrieval'; +import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/functionalities'; import constants from './modelerSidebarFunctionalityTestingUtils'; -import { getParsedRobotFile } from '../../../../../api/ssotRetrieval'; +import { getParsedRobotFile } from '../../../../../api/routes/robots/robotsRetrieval'; import downloadString from './downloadStringAsFile'; import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 26aa340e..563fcd99 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -3,10 +3,10 @@ import { Layout } from 'antd'; import BpmnModeler from './BpmnModeler/BpmnModeler'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; -import { getSsot } from '../../../api/ssotRetrieval'; -import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; -import { getAllAttributes } from '../../../api/attributeRetrieval'; -import { getAllRpaFunctionalities } from '../../../api/applicationAndTaskRetrieval'; +import { getSsot } from '../../../api/routes/robots/robotsRetrieval'; +import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameterRetrieval'; +import { getAllAttributes } from '../../../api/routes/robots/rpaAttributeRetrieval'; +import { getAllRpaFunctionalities } from '../../../api/routes/functionalities/functionalities'; import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; import { initAvailableApplicationsSessionStorage, diff --git a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index a4859055..cd2ea1e4 100644 --- a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -13,7 +13,7 @@ import { initSsotSessionStorage } from '../../../../utils/sessionStorage/localSs import { changeSsotName, deleteRobotFromDB, -} from '../../../../api/ssotRetrieval'; +} from '../../../../api/routes/robots/robotsRetrieval'; import customNotification from '../../../../utils/componentsFunctionality/notificationUtils'; const { Title } = Typography; diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index f9513b36..84e1b06e 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -10,7 +10,10 @@ import { } from '../../../api/socketHandler/socketListeners'; import CreateRobotContainer from './RobotContainer/CreateRobotContainer'; import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; -import { fetchSsotsForUser, createNewRobot } from '../../../api/ssotRetrieval'; +import { + fetchSsotsForUser, + createNewRobot, +} from '../../../api/routes/users/users'; const { Search } = Input; const { Option } = Select; diff --git a/frontend/src/utils/sessionStorage/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js index 297ff276..bd2345fe 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/attributes.js +++ b/frontend/src/utils/sessionStorage/localSsotController/attributes.js @@ -2,7 +2,7 @@ * @category Frontend * @module */ -import { deleteAttributesForActivities } from '../../../api/ssotRetrieval'; +import { deleteAttributesForActivities } from '../../../api/routes/robots/rpaAttributeRetrieval'; const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index f8f33f67..486bb908 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -2,7 +2,7 @@ * @category Frontend * @module */ -import { deleteParametersForActivities } from '../../../api/ssotRetrieval'; +import { deleteParametersForActivities } from '../../../api/routes/robots/rpaParameterRetrieval'; import getRpaFunctionalitiesObject from '../localFunctionalitiesController/functionalities'; import { getAttributeObjectForActivity } from './attributes'; diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index f0a4704e..fcf00042 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -3,20 +3,23 @@ * @module */ import customNotification from '../../componentsFunctionality/notificationUtils'; -import { getSsot, updateRobot } from '../../../api/ssotRetrieval'; +import { + getSsot, + updateRobot, +} from '../../../api/routes/robots/robotsRetrieval'; import { getAllAttributes, updateManyAttributes, -} from '../../../api/attributeRetrieval'; +} from '../../../api/routes/robots/rpaAttributeRetrieval'; import { initSessionStorage } from '../sessionStorageUtils'; import { getAvailableApplications, getAllRpaFunctionalities, -} from '../../../api/applicationAndTaskRetrieval'; +} from '../../../api/routes/functionalities/functionalities'; import { getAllParametersForRobot, updateManyParameters, -} from '../../../api/parameterRetrieval'; +} from '../../../api/routes/robots/rpaParameterRetrieval'; import { getParameterStorage, deleteUnusedParameterFromDB } from './parameters'; import { getAttributeStorage, diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 3dd121e3..7f5f2a1a 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -1,4 +1,4 @@ -import { getAvailableApplications } from '../../api/applicationAndTaskRetrieval'; +import { getAvailableApplications } from '../../api/routes/functionalities/functionalities'; /** * @description Checks if passed item already exists in session storage and initializes with given value if not existing. From cba7b93d8ee1e2fa3c73187f9bbf399c35742ada Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Mon, 17 May 2021 15:59:07 +0200 Subject: [PATCH 032/149] Revert "Rename variable to parameter or outputValue where applicable" --- ...meterRetrieval.js => variableRetrieval.js} | 0 .../content/ModelerSidebar/ModelerSidebar.jsx | 22 ++++---- .../PropertiesPanel/PropertiesPanel.jsx | 16 +++--- .../PPParameterInput.jsx | 30 +++++------ .../PPOutputValueSection.jsx | 12 ++--- .../PPParameterSection.jsx | 8 +-- .../RobotFileSyntaxModal.jsx | 8 +-- .../RobotInteractionInputParameter.jsx | 10 ++-- .../RobotInteractionInputSection.jsx | 2 +- .../src/components/pages/Modeler/Modeler.jsx | 2 +- .../RobotInteractionCockpit.jsx | 2 +- .../RobotInteractionCockpitFunctionality.js | 2 +- .../pages/RobotOverview/RobotOverview.jsx | 14 ++--- client/src/utils/localSsot/parameters.js | 14 ++--- client/src/utils/localSsot/ssot.js | 2 +- .../modelerSidebarFunctionality.js | 26 +++++----- .../modelerSidebarFunctionality.test.js | 52 +++++++++---------- ...modelerSidebarFunctionalityTestingUtils.js | 2 +- .../BpmnToSsotParsing/BpmnToSsotParsing.js | 2 +- .../robotCodeToSsotParsing.js | 20 +++---- client/src/utils/robotExecution.jsx | 4 +- client/src/utils/robotExecution.test.js | 2 +- ...ontroller.js => ssotVariableController.js} | 0 server/api/models/rpaTaskModel.js | 6 +-- server/api/models/singleSourceOfTruthModel.js | 2 +- .../routes/robots/parameters/parameters.js | 8 +-- .../robots/parameters/parameters.test.js | 8 +-- .../generateCodeForRpaTasks.js | 8 +-- .../SsotToRobotParsing/retrieveParameters.js | 4 +- server/utils/TestingUtils/databaseLoader.js | 12 ++--- .../openApiDocumentation/openApiComponents.js | 2 +- wiki/Documentation-single-source-of-truth.md | 2 +- 32 files changed, 153 insertions(+), 151 deletions(-) rename client/src/api/{parameterRetrieval.js => variableRetrieval.js} (100%) rename server/api/controllers/{ssotParameterController.js => ssotVariableController.js} (100%) diff --git a/client/src/api/parameterRetrieval.js b/client/src/api/variableRetrieval.js similarity index 100% rename from client/src/api/parameterRetrieval.js rename to client/src/api/variableRetrieval.js diff --git a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx index 8ec849d1..cd4b0519 100644 --- a/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx +++ b/client/src/components/content/ModelerSidebar/ModelerSidebar.jsx @@ -10,7 +10,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValueNameChangeHandler, + outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, } from '../../../utils/modelerSidebarFunctionality/modelerSidebarFunctionality'; @@ -29,20 +29,22 @@ const { Sider } = Layout; * @component */ const ModelerSidebar = ({ modeler, robotId }) => { - const [parameterList, setParameterList] = useState([]); - const [outputValueName, setOutputValueName] = useState(); + const [variableList, setvariableList] = useState([]); + const [outputVariableName, setOutputVariableName] = useState(); const [elementState, setElementState] = useState({ selectedElements: [], currentElement: null, }); const [selectedApplication, setSelectedApplication] = useState(''); - const [tasksForSelectedApplication, setTasksForSelectedApplication] = - useState(['']); + const [ + tasksForSelectedApplication, + setTasksForSelectedApplication, + ] = useState(['']); const [disableTaskSelection, setDisableTaskSelection] = useState(true); const stateSetters = { - setParameterList, - setOutputValueName, + setvariableList, + setOutputVariableName, setElementState, setSelectedApplication, setTasksForSelectedApplication, @@ -104,16 +106,16 @@ const ModelerSidebar = ({ modeler, robotId }) => { disableTaskSelection={disableTaskSelection} element={elementState.currentElement} robotId={robotId} - parameterList={parameterList} + variableList={variableList} parameterSelectionUpdated={(newValue) => { inputParameterChangeHandler( elementState.currentElement.id, newValue ); }} - outputValueName={outputValueName} + outputVariableName={outputVariableName} outputNameUpdated={(newValue) => { - outputValueNameChangeHandler( + outputVarNameChangeHandler( elementState.currentElement.id, newValue ); diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index e9ceb1c4..1d10eefe 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -24,9 +24,9 @@ const PropertiesPanel = ({ taskSelectionUpdated, disableTaskSelection, robotId, - parameterList, + variableList, parameterSelectionUpdated, - outputValueName, + outputVariableName, outputNameUpdated, }) => (
@@ -45,17 +45,17 @@ const PropertiesPanel = ({ disableTaskSelection={disableTaskSelection} selectedActivity={selectedActivity} /> - {parameterList.length > 0 && ( + {variableList.length > 0 && ( )} - {outputValueName && ( + {outputVariableName && ( )} @@ -73,9 +73,9 @@ PropertiesPanel.propTypes = { taskSelectionUpdated: PropTypes.func.isRequired, selectedActivity: PropTypes.string.isRequired, disableTaskSelection: PropTypes.bool.isRequired, - parameterList: PropTypes.arrayOf(PropTypes.shape).isRequired, + variableList: PropTypes.arrayOf(PropTypes.shape).isRequired, parameterSelectionUpdated: PropTypes.func.isRequired, - outputValueName: PropTypes.string.isRequired, + outputVariableName: PropTypes.string.isRequired, outputNameUpdated: PropTypes.func.isRequired, robotId: PropTypes.string.isRequired, }; diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx index 3cb1e09d..2ce50039 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelComponents/PPParameterInput.jsx @@ -15,12 +15,12 @@ import { const { Text } = Typography; /** - * @description Renders a parameter input field for a given parameter + * @description Renders a parameter input field for a given variable * @category Client * @component */ const PPParameterInput = ({ - parameterName, + variableName, isRequired, // eslint-disable-next-line no-unused-vars dataType, @@ -33,23 +33,23 @@ const PPParameterInput = ({ parameterPropertyStatus( robotId, selectedActivity, - parameterName, + variableName, 'requireUserInput' ) ); const [parameterValue, setParameterValue] = useState( - parameterPropertyStatus(robotId, selectedActivity, parameterName, 'value') + parameterPropertyStatus(robotId, selectedActivity, variableName, 'value') ); /** * @description changes the state for "userInputRequired" and also the parameter value - * @param {String} currentParameterName Name of the currently handled parameter + * @param {String} parameterName Name of the currently handled parameter */ - const changeUserInputRequirement = (currentParameterName) => { + const changeUserInputRequirement = (parameterName) => { setParameterValue(''); setPropertyForParameter( selectedActivity, - currentParameterName, + parameterName, 'requireUserInput', !userInputRequired ); @@ -60,12 +60,12 @@ const PPParameterInput = ({ /** * @description changes the parameter value * @param {Object} event from the input field - * @param {String} currentParameterName Name of the currently handled parameter + * @param {String} parameterName Name of the currently handled parameter */ - const changeParameterValue = (event, currentParameterName) => { + const changeParameterValue = (event, parameterName) => { setPropertyForParameter( selectedActivity, - currentParameterName, + parameterName, 'value', event.target.value ); @@ -84,7 +84,7 @@ const PPParameterInput = ({ return ( <> - {parameterName} + {variableName} {isRequired && (  * @@ -96,13 +96,13 @@ const PPParameterInput = ({ placeholder='Please type in value' defaultValue={value} value={parameterValue} - onChange={(event) => changeParameterValue(event, parameterName)} + onChange={(event) => changeParameterValue(event, variableName)} suffix={ } - addonAfter={returnLockIcon(parameterName)} + addonAfter={returnLockIcon(variableName)} disabled={userInputRequired} /> )} @@ -112,7 +112,7 @@ const PPParameterInput = ({ style={{ width: '100%' }} type='primary' className={styles.parameterButton} - onClick={() => changeUserInputRequirement(parameterName)} + onClick={() => changeUserInputRequirement(variableName)} > Parameter will be set at execution @@ -122,7 +122,7 @@ const PPParameterInput = ({ }; PPParameterInput.propTypes = { - parameterName: PropTypes.string.isRequired, + variableName: PropTypes.string.isRequired, isRequired: PropTypes.bool.isRequired, dataType: PropTypes.string.isRequired, value: PropTypes.string.isRequired, diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx index 8b1ad45e..464b5556 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection.jsx @@ -11,8 +11,8 @@ const { Text } = Typography; * @category Client * @component */ -const PPOutputValueSection = ({ outputValueText, onNameChange }) => { - const handleOutputValueChange = (event) => { +const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { + const handleOutputVariableChange = (event) => { const outputValueName = event.target.value.replace(/\$/g, ''); onNameChange(outputValueName); }; @@ -33,22 +33,22 @@ const PPOutputValueSection = ({ outputValueText, onNameChange }) => { + } - onPressEnter={handleOutputValueChange} + onPressEnter={handleOutputVariableChange} /> ); }; PPOutputValueSection.propTypes = { - outputValueText: PropTypes.string.isRequired, + outputVariableText: PropTypes.string.isRequired, onNameChange: PropTypes.func.isRequired, }; diff --git a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx index 3e9304ec..03529148 100644 --- a/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx +++ b/client/src/components/content/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection.jsx @@ -12,7 +12,7 @@ const { Text } = Typography; */ const PPParameterSection = ({ selectedActivity, - parameterList, + variableList, onValueChange, robotId, }) => ( @@ -20,11 +20,11 @@ const PPParameterSection = ({ Parameter: - {parameterList.map((singleInput) => ( + {variableList.map((singleInput) => ( <> { }, { key: '2', - name: 'Empty Parameter Field', + name: 'Empty Variable Field', syntax: '%%parameterName%%', description: 'Highlights a field which has not been configured yet in the ssot', @@ -32,10 +32,10 @@ const RobotFileSyntaxModal = (props) => { }, { key: '4', - name: 'Parameter', - syntax: '$(parameterName)', + name: 'Variable', + syntax: '$(variableName)', description: - 'Used to pass in a parameter, which could be the output of a previous activity', + 'Used to pass in a variable, which could be the output of a previous activity', }, ]; diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx b/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx index 638fc3c2..d946547a 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx +++ b/client/src/components/content/RobotInteractionSections/RobotInteractionComponents/RobotInteractionInputParameter.jsx @@ -6,12 +6,12 @@ import corporateDesign from '../../../../layout/corporateDesign'; const { Text } = Typography; /** - * @description Renders a parameter input field for a given parameter + * @description Renders a parameter input field for a given variable * @category Client * @component */ const RobotInteractionInputParameter = ({ - parameterName, + variableName, // eslint-disable-next-line no-unused-vars dataType, infoText, @@ -19,9 +19,9 @@ const RobotInteractionInputParameter = ({ parameterId, }) => ( <> - {parameterName} + {variableName} updateParameterValue(parameterId, event.target.value) @@ -38,7 +38,7 @@ const RobotInteractionInputParameter = ({ ); RobotInteractionInputParameter.propTypes = { - parameterName: PropTypes.string.isRequired, + variableName: PropTypes.string.isRequired, dataType: PropTypes.string.isRequired, infoText: PropTypes.string.isRequired, updateParameterValue: PropTypes.func.isRequired, diff --git a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx b/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx index 99feaa68..d4179d87 100644 --- a/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx +++ b/client/src/components/content/RobotInteractionSections/RobotInteractionInputSection.jsx @@ -24,7 +24,7 @@ const RobotInteractionInputSection = ({ {activityInformation.activityParameter.map((params) => ( { ); /** - * @description Ensures that we only update the parameterList when the parameters we fetch form the DB have changed + * @description Ensures that we only update the paramterList when the paramters we fetch form the DB have changed */ useEffect(() => { getActivityAndParameterInformation(robotId, setParameterList, isMounted); diff --git a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js index 00a066ca..aa2a12f3 100644 --- a/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js +++ b/client/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpitFunctionality.js @@ -1,4 +1,4 @@ -import { getAllParametersForRobot } from '../../../api/parameterRetrieval'; +import { getAllParametersForRobot } from '../../../api/variableRetrieval'; /** * @description For each activity of the current robot get the id, the name and all the parameters that require a user input diff --git a/client/src/components/pages/RobotOverview/RobotOverview.jsx b/client/src/components/pages/RobotOverview/RobotOverview.jsx index 99a2b0da..4523c830 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/client/src/components/pages/RobotOverview/RobotOverview.jsx @@ -101,20 +101,20 @@ const RobotOverview = () => { * @param {String} currentSearchValue Currently stored value of the search bar, by which the boxes to be displayed are selected */ const createRobotBoxes = (currentSearchValue) => { - const filteredRobotList = Object.values(robotList) - .filter((robot) => robot.robotName !== undefined) - .filter((robot) => - robot.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) + const filteredBotList = Object.values(robotList) + .filter((val) => val.robotName !== undefined) + .filter((val) => + val.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) ); return ( <> - {filteredRobotList.map((robot) => ( + {filteredBotList.map((val) => ( retrieveBotList(userId)} /> ))} diff --git a/client/src/utils/localSsot/parameters.js b/client/src/utils/localSsot/parameters.js index 3a725985..8301e25c 100644 --- a/client/src/utils/localSsot/parameters.js +++ b/client/src/utils/localSsot/parameters.js @@ -42,7 +42,7 @@ const createParameterObject = ( newParameterObject = { activityId, robotId, - outputValue: `${activityId}_output`, + outputVariable: `${activityId}_output`, rpaParameters, }; } else { @@ -119,8 +119,8 @@ const checkIfParameterObjectCorrect = ( }; /** - * @description Gets the parameter object for the activity from the session storage and checks if the parameter object is correctly filled. - * If no parameter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. + * @description Gets the parameter object for the activity from the session storage and checks if the paramter object is correctly filled. + * If no paramter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. * If no parameter object and no attributes object exists for the activity it will return undefined. * @param {String} robotId Id of the robot/ssot for which to retrieve the parameter object * @param {String} activityId Id of the activity for which to retrieve the parameter object for @@ -263,9 +263,9 @@ const parameterPropertyStatus = ( }; /** - * @description Sets the new value as the name of the output value in the session storage - * @param {String} activityId Id of the activity for which to change the value of the output value for - * @param {String} value The new value for the name of the output value + * @description Sets the new value as the name of the output variable in the session storage + * @param {String} activityId Id of the activity for which to change the value of the output variable for + * @param {String} value The new value for the name of the output variable */ const setOutputValueName = (activityId, value) => { const localParameterStorage = getParameterStorage(); @@ -277,7 +277,7 @@ const setOutputValueName = (activityId, value) => { ); const editedParameterObject = matchingParameterObject; - editedParameterObject.outputValue = value; + editedParameterObject.outputVariable = value; newLocalParameterStorage.push(editedParameterObject); sessionStorage.setItem( diff --git a/client/src/utils/localSsot/ssot.js b/client/src/utils/localSsot/ssot.js index c81d6c0e..7fb95298 100644 --- a/client/src/utils/localSsot/ssot.js +++ b/client/src/utils/localSsot/ssot.js @@ -16,7 +16,7 @@ import { import { getAllParametersForRobot, updateManyParameters, -} from '../../api/parameterRetrieval'; +} from '../../api/variableRetrieval'; import { getParameterStorage, deleteUnusedParameterFromDB } from './parameters'; import { getAttributeStorage, diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js index a1c41169..bc7478a3 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -91,15 +91,15 @@ const checkForApplicationTask = (activityId, setterObject) => { * @param {Object} setterObject object containing the functions for setting the state in the React component */ const updateParamSection = (activityId, robotId, setterObject) => { - setterObject.setOutputValueName(undefined); + setterObject.setOutputVariableName(undefined); const paramObj = getParameterObject(robotId, activityId); if (paramObj) { const paramsInOrder = paramObj.rpaParameters.sort( (a, b) => a.index - b.index ); - setterObject.setParameterList(paramsInOrder); - if (paramObj.outputValue) - setterObject.setOutputValueName(paramObj.outputValue); + setterObject.setvariableList(paramsInOrder); + if (paramObj.outputVariable) + setterObject.setOutputVariableName(paramObj.outputVariable); } }; @@ -120,8 +120,8 @@ const modelerSelectionChangeHandler = ( selectedElements: event.newSelection, currentElement: event.newSelection[0], }); - setterObject.setOutputValueName(undefined); - setterObject.setParameterList([]); + setterObject.setOutputVariableName(undefined); + setterObject.setvariableList([]); // INFO: the updated elementState isn't automatically used in useEffect() therefore we need the following workaround elementState.selectedElements = event.newSelection; @@ -185,8 +185,8 @@ const applicationChangedHandler = ( setRpaApplication(robotId, elementState.currentElement.id, value); getTasksForApplication(value, setterObject); - setterObject.setOutputValueName(undefined); - setterObject.setParameterList([]); + setterObject.setOutputVariableName(undefined); + setterObject.setvariableList([]); }; /** @@ -220,12 +220,12 @@ const inputParameterChangeHandler = (activityId, value) => { }; /** - * @description Gets called when the name of the output value has been changed and updates - * the output values name in the ssot + * @description Gets called when the name of the output variable has been changed and updates + * the output variables name in the ssot * @param {String} activityId id of the activity selected - * @param {Object} newValue new value of the output values name + * @param {Object} newValue new value of the output variables name */ -const outputValueNameChangeHandler = (activityId, newValue) => { +const outputVarNameChangeHandler = (activityId, newValue) => { setOutputValueName(activityId, newValue); }; @@ -234,7 +234,7 @@ export { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValueNameChangeHandler, + outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, }; diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 64719e1e..233c49dd 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -12,7 +12,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputValueNameChangeHandler, + outputVarNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, } from './modelerSidebarFunctionality'; @@ -68,7 +68,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(newValue).toEqual(constants.MOCK_NEW_VALUE); }); - outputValueNameChangeHandler( + outputVarNameChangeHandler( constants.MOCK_ACTIVITY_ID, constants.MOCK_NEW_VALUE ); @@ -128,11 +128,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: MOCK_CURRENT_ELEMENT, }); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, }; @@ -152,11 +152,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: constants.MOCK_CURRENT_ELEMENT, }); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, setDisableTaskSelection: (disabled) => { expect(disabled).toBeTruthy(); @@ -195,11 +195,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -248,11 +248,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -299,17 +299,17 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { describe('Sidebar Functionality: Task Change', () => { it('handles task change WITH parameter update', async () => { let setOutputVariableNameCallCounter = 0; - let setParameterListCallCounter = 0; + let setvariableListCallCounter = 0; const MOCK_SETTER_OBJECT = { - setOutputValueName: (newName) => { - expect(newName === undefined || newName === 'OutputValueName').toBe( + setOutputVariableName: (newName) => { + expect(newName === undefined || newName === 'OutputVariableName').toBe( true ); setOutputVariableNameCallCounter += 1; }, - setParameterList: (parametersInOrder) => { + setvariableList: (parametersInOrder) => { expect(parametersInOrder).toEqual(constants.MOCK_INPUTS_RIGHT_ORDER); - setParameterListCallCounter += 1; + setvariableListCallCounter += 1; }, }; @@ -341,7 +341,7 @@ describe('Sidebar Functionality: Task Change', () => { expect(setRpaTask).toHaveBeenCalledTimes(1); expect(getParameterObject).toHaveBeenCalledTimes(1); expect(setOutputVariableNameCallCounter).toEqual(2); - expect(setParameterListCallCounter).toEqual(1); + expect(setvariableListCallCounter).toEqual(1); }); it('handles task change WITHOUT parameter update', async () => { @@ -379,11 +379,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -436,11 +436,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputValueName: (newName) => { + setOutputVariableName: (newName) => { expect(newName).toBeUndefined(); }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); + setvariableList: (newVariableList) => { + expect(newVariableList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['lookupRecipe']); diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index 3259ddd3..0cdf6502 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -24,7 +24,7 @@ const MOCK_PARAMETER_OBJECT = { value: 'true', }, ], - outputValue: 'OutputValueName', + outputVariable: 'OutputVariableName', }; const MOCK_INPUTS_RIGHT_ORDER = [ { diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js index 0d01a0ff..efef808f 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js +++ b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.js @@ -110,7 +110,7 @@ const enrichInstructionElements = (elementsArray, bpmnActivities) => { ); if (instructionElement) { instructionElement.type = 'INSTRUCTION'; - instructionElement.outputValue = ''; + instructionElement.outputVariable = ''; } if (activity.$['arkRPA:application']) { diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index ae3f1ad7..0259a0d2 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -101,9 +101,9 @@ const getApplicationArray = (robotCodeSettingsSection) => { }; /** - * @description retrieves the outputValue name from the current code line + * @description retrieves the outputVariable name from the current code line * @param {String} currentLine current line of RPAf code - * @returns outputValue as string + * @returns outputVariable as string */ const getOutputName = (currentLine) => { const indexOfEqualsSign = currentLine.indexOf('='); @@ -147,9 +147,9 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { * @description deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format * @param {String} currentLine current line of RPAf code * @param {String} splitPlaceholder placeholder to split the string - * @returns the current line without the outputValueName prefix as string + * @returns the current line without the outputVariableName prefix as string */ -const currentLineWithoutOutputValueName = ( +const currentLineWithoutOutputVariableName = ( completeLine, splitPlaceholder ) => { @@ -226,7 +226,7 @@ const getInstructionBlocksFromTaskSection = ( ) => { let errorWasThrown; const instructionBlocks = []; - const regexForOutputValue = /\${(.)+} =/; + const regexForOutputVariable = /\${(.)+} =/; const splitPlaceholder = '§&§'; robotCodeTaskSection.slice(1).forEach((line) => { @@ -235,7 +235,7 @@ const getInstructionBlocksFromTaskSection = ( const currentLineIncludesSplitPlaceholder = currentLine.includes( splitPlaceholder ); - const currentLineDefinesOutputValue = regexForOutputValue.test( + const currentLineDefinesOutputValue = regexForOutputVariable.test( currentLine ); const currentLineStartsWithFourspace = currentLine.startsWith(FOURSPACE); @@ -262,7 +262,7 @@ const getInstructionBlocksFromTaskSection = ( instructionBlocks.length - 1 ].outputName = outputValueName; - currentLine = currentLineWithoutOutputValueName( + currentLine = currentLineWithoutOutputVariableName( currentLine, splitPlaceholder ); @@ -384,7 +384,7 @@ const buildSingleParameterObject = ( )[0]; const parameterArray = combinationObject.inputVars.map( - (singleParameter, index) => { + (singleInputVariable, index) => { const currentParameterIsEmpty = singleParamArray[index].startsWith('%%') && singleParamArray[index].endsWith('%%'); @@ -394,7 +394,7 @@ const buildSingleParameterObject = ( const currentParameterTakesOutputValue = singleParamArray[index].startsWith('${') && singleParamArray[index].endsWith('}'); - const singleParameterObject = { ...singleParameter }; + const singleParameterObject = { ...singleInputVariable }; singleParameterObject.requireUserInput = currentParameterRequiresUserInput; if (currentParameterIsEmpty || currentParameterRequiresUserInput) { @@ -417,7 +417,7 @@ const buildSingleParameterObject = ( activityId, rpaParameters: parameterArray, robotId, - outputValue: singleElementFromTasksSection.outputName, + outputVariable: singleElementFromTasksSection.outputName, }; }; diff --git a/client/src/utils/robotExecution.jsx b/client/src/utils/robotExecution.jsx index 12d41079..51674f49 100644 --- a/client/src/utils/robotExecution.jsx +++ b/client/src/utils/robotExecution.jsx @@ -1,5 +1,5 @@ import { getAllAttributes } from '../api/attributeRetrieval'; -import { getAllParametersForRobot } from '../api/parameterRetrieval'; +import { getAllParametersForRobot } from '../api/variableRetrieval'; const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; @@ -12,7 +12,7 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { parameter.value === '' ) { console.error( - 'Required parameter not specified in parameter', + 'Required parameter not specified in paramter', parameter ); executability = false; diff --git a/client/src/utils/robotExecution.test.js b/client/src/utils/robotExecution.test.js index f24be306..fd61e4ab 100644 --- a/client/src/utils/robotExecution.test.js +++ b/client/src/utils/robotExecution.test.js @@ -30,7 +30,7 @@ describe('Checking robot parameters for Executability', () => { expect(response).toBe(false); }); - it('correctly recognizes a robot as executable if required parameter is empty but is specified later by user input', () => { + it('correctly recognizes a robot as executable if required paramter is empty but is specified later by user input', () => { const listOfParameters = [ paramObject1, paramObjectWithLaterSpecifiedUserInput, diff --git a/server/api/controllers/ssotParameterController.js b/server/api/controllers/ssotVariableController.js similarity index 100% rename from server/api/controllers/ssotParameterController.js rename to server/api/controllers/ssotVariableController.js diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index e6d72abf..54665386 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; -const rpaParameterSchema = new Schema({ +const rpaVariableSchema = new Schema({ name: String, type: String, required: Boolean, @@ -15,8 +15,8 @@ const rpaTaskSchema = new Schema({ Task: { type: String, required: [true, 'Task required'] }, Code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, - inputVars: [rpaParameterSchema], - Output: rpaParameterSchema, + inputVars: [rpaVariableSchema], + Output: rpaVariableSchema, }); mongoose.model('rpa-task', rpaTaskSchema); diff --git a/server/api/models/singleSourceOfTruthModel.js b/server/api/models/singleSourceOfTruthModel.js index 1c171c80..9ba3c7b1 100644 --- a/server/api/models/singleSourceOfTruthModel.js +++ b/server/api/models/singleSourceOfTruthModel.js @@ -15,7 +15,7 @@ const singleParameterSchema = new Schema({ const parameterObjectSchema = new Schema({ robotId: mongoose.Types.ObjectId, activityId: String, - outputValue: String, + outputVariable: String, rpaParameters: [singleParameterSchema], }); diff --git a/server/api/routes/robots/parameters/parameters.js b/server/api/routes/robots/parameters/parameters.js index e0e30815..0fdf96e1 100644 --- a/server/api/routes/robots/parameters/parameters.js +++ b/server/api/routes/robots/parameters/parameters.js @@ -1,10 +1,10 @@ const express = require('express'); -const parameterController = require('../../../controllers/ssotParameterController'); +const variableController = require('../../../controllers/ssotVariableController'); const router = express.Router(); -router.put('/', parameterController.updateMany); -router.delete('/:robotId', parameterController.deleteForActivities); -router.get('/:robotId', parameterController.retrieveParametersForRobot); +router.put('/', variableController.updateMany); +router.delete('/:robotId', variableController.deleteForActivities); +router.get('/:robotId', variableController.retrieveParametersForRobot); module.exports = router; diff --git a/server/api/routes/robots/parameters/parameters.test.js b/server/api/routes/robots/parameters/parameters.test.js index 27e42d50..eac520ae 100644 --- a/server/api/routes/robots/parameters/parameters.test.js +++ b/server/api/routes/robots/parameters/parameters.test.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); const dbHandler = require('../../../../utils/TestingUtils/TestDatabaseHandler'); const dbLoader = require('../../../../utils/TestingUtils/databaseLoader'); -const ssotParameterController = require('../../../controllers/ssotParameterController'); +const ssotVariableController = require('../../../controllers/ssotVariableController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); @@ -49,7 +49,7 @@ describe('PUT /robots/parameters', () => { }); const response = httpMocks.createResponse(); - await ssotParameterController.updateMany(request, response); + await ssotVariableController.updateMany(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.modifiedCount).toBe(1); @@ -78,7 +78,7 @@ describe('GET /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotParameterController.retrieveParametersForRobot(request, response); + await ssotVariableController.retrieveParametersForRobot(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.length).toBe(3); @@ -112,7 +112,7 @@ describe('DELETE /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotParameterController.deleteForActivities(request, response); + await ssotVariableController.deleteForActivities(request, response); const foundParameters = await mongoose.model('parameter').find().exec(); expect(foundParameters.length).toBe(1); diff --git a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js b/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js index 957ac356..9bf5064d 100644 --- a/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/services/SsotToRobotParsing/generateCodeForRpaTasks.js @@ -20,15 +20,15 @@ const isAnRpaInstruction = (currentElement) => currentElement.type === ACTIVITY_IDENTIFIER; /** - * @description Will create a prefix to catch the output value of an activity, if one is present + * @description Will create a prefix to catch the output variable of an activity, if one is present * @param {Object} paramObject The parameter object to check and loop through - * @returns {String} String specifying the output values name + * @returns {String} String specifying the output variables name */ const setOutputVar = (paramObject) => { let newCodeLine = FOURSPACE; - if (paramObject.outputValue) { - newCodeLine += `\${${paramObject.outputValue}} = `; + if (paramObject.outputVariable) { + newCodeLine += `\${${paramObject.outputVariable}} = `; } return newCodeLine; }; diff --git a/server/services/SsotToRobotParsing/retrieveParameters.js b/server/services/SsotToRobotParsing/retrieveParameters.js index 94916dff..2e90220a 100644 --- a/server/services/SsotToRobotParsing/retrieveParameters.js +++ b/server/services/SsotToRobotParsing/retrieveParameters.js @@ -35,7 +35,7 @@ const retrieveParameters = async (ssot) => { { activityId: 1, rpaParameters: 1, - outputValue: 1, + outputVariable: 1, } ) .exec(); @@ -83,7 +83,7 @@ const getAllParametersForJob = async (jobId) => { /** * @description For all activities in the ssot this method will retrieve the associated parameter objects * @param {Object} ssot The ssot for which the parameters should be retrieved - * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional parameters + * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters * @returns {Array} Array of parameter objects */ const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { diff --git a/server/utils/TestingUtils/databaseLoader.js b/server/utils/TestingUtils/databaseLoader.js index bc090dd0..ac4efc43 100644 --- a/server/utils/TestingUtils/databaseLoader.js +++ b/server/utils/TestingUtils/databaseLoader.js @@ -35,12 +35,12 @@ const loadAttributesInDb = async () => { const loadParametersInDb = async () => { const RpaParam = mongoose.model('parameter'); - const rpaParameter = new RpaParam(testData.testParameter1); - await rpaParameter.save(); - const rpaParameter2 = new RpaParam(testData.testParameter2); - await rpaParameter2.save(); - const rpaParameter3 = new RpaParam(testData.testParameter3); - await rpaParameter3.save(); + const rpaParamter = new RpaParam(testData.testParameter1); + await rpaParamter.save(); + const rpaParamter2 = new RpaParam(testData.testParameter2); + await rpaParamter2.save(); + const rpaParamter3 = new RpaParam(testData.testParameter3); + await rpaParamter3.save(); }; const loadTasksInDb = async () => { diff --git a/server/utils/openApiDocumentation/openApiComponents.js b/server/utils/openApiDocumentation/openApiComponents.js index 18a69265..a16ebd15 100644 --- a/server/utils/openApiDocumentation/openApiComponents.js +++ b/server/utils/openApiDocumentation/openApiComponents.js @@ -81,7 +81,7 @@ * $ref: '#/components/schemas/ActivityIds' * robotId: * $ref: '#/components/schemas/RobotIds' - * outputValue: + * outputVariable: * type: string * example: Activity_0n140xq_output * rpaParameters: diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-single-source-of-truth.md index b6df3236..49503683 100644 --- a/wiki/Documentation-single-source-of-truth.md +++ b/wiki/Documentation-single-source-of-truth.md @@ -120,7 +120,7 @@ User information about a robot (creator, released for etc.) is stored in an addi { "robotId": "604f537ed699a2eb47274184", "activityId": "Activity_47II", - "outputValue": "exampleId", + "outputVariable": "exampleId", "rpaParameters": [ { "name": "Filename", From 4a455a8d750262d35e6e3a862f01fea06fffe186 Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Mon, 17 May 2021 16:02:17 +0200 Subject: [PATCH 033/149] Revert "Refactored tests" --- .../pages/RobotOverview/RobotOverview.test.js | 2 +- .../modelerSidebarFunctionality.test.js | 26 +++++++++---------- .../BpmnToSsotParsing.test.js | 2 +- .../robotCodeToSsotParsing.test.js | 22 ++++++++-------- .../robotMetadataUtils.test.js | 4 +-- server/api/models/robotJobModel.test.js | 2 +- server/api/models/rpaTaskModel.test.js | 6 ++--- .../api/models/userAccessObjectModel.test.js | 4 +-- .../rpaattributes/rpaattributes.test.js | 2 +- .../__tests__/SsotToRobotParser.test.js | 6 ++--- server/socket/socketHelper.test.js | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/client/src/components/pages/RobotOverview/RobotOverview.test.js b/client/src/components/pages/RobotOverview/RobotOverview.test.js index c38fb06b..f048a368 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/client/src/components/pages/RobotOverview/RobotOverview.test.js @@ -56,7 +56,7 @@ beforeAll(() => jest.spyOn(window, 'fetch')); beforeEach(() => window.fetch.mockImplementation(mockFetch)); describe('Testing functionality behind button to trigger function call for new but creation', () => { - it('checks if attempt to fetch occured twice', async () => { + it('check if attempt to fetch occured twice', async () => { act(() => { // eslint-disable-next-line react/jsx-filename-extension render( diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 233c49dd..583f7035 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -26,7 +26,7 @@ import { fetchTasksFromDB } from '../../api/applicationAndTaskSelection'; import constants from './modelerSidebarFunctionalityTestingUtils'; describe('Sidebar Functionality: Small Utilities', () => { - it('handles modeler element changed with no new selection', async () => { + it('handle modeler element changed with no new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -42,7 +42,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(0); }); - it('handles modeler element changed with new selection', async () => { + it('handle modeler element changed with new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -62,7 +62,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(1); }); - it('handles output variable name change', async () => { + it('handle output variable name change', async () => { setOutputValueName.mockImplementation((activityId, newValue) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(newValue).toEqual(constants.MOCK_NEW_VALUE); @@ -74,7 +74,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handles input parameter change', async () => { + it('handle input parameter change', async () => { setSingleParameter.mockImplementation((activityId, value) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(value).toEqual(constants.MOCK_VALUE); @@ -86,7 +86,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handles modeler name change', async () => { + it('handle modeler name change', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -106,7 +106,7 @@ describe('Sidebar Functionality: Small Utilities', () => { }); describe('Sidebar Functionality: Modeler Selection Change', () => { - it('handles modeler selection change; element is not a task', async () => { + it('handle modeler selection change; element is not a task', async () => { const MOCK_CURRENT_ELEMENT = { id: constants.MOCK_CURRENT_ELEMENT_ID, businessObject: { name: 'oldTestName' }, @@ -144,7 +144,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handles modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { + it('handle modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -184,7 +184,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { + it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -237,7 +237,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { + it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -297,7 +297,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { }); describe('Sidebar Functionality: Task Change', () => { - it('handles task change WITH parameter update', async () => { + it('handle task change WITH parameter update', async () => { let setOutputVariableNameCallCounter = 0; let setvariableListCallCounter = 0; const MOCK_SETTER_OBJECT = { @@ -344,7 +344,7 @@ describe('Sidebar Functionality: Task Change', () => { expect(setvariableListCallCounter).toEqual(1); }); - it('handles task change WITHOUT parameter update', async () => { + it('handle task change WITHOUT parameter update', async () => { setRpaTask.mockImplementation( (robotId, activityId, selectedApplication, value) => { expect(value).toBeUndefined(); @@ -368,7 +368,7 @@ describe('Sidebar Functionality: Task Change', () => { }); describe('Sidebar Functionality: Application Change', () => { - it('handles application change WITH cache existing', async () => { + it('handle application change WITH cache existing', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -416,7 +416,7 @@ describe('Sidebar Functionality: Application Change', () => { expect(setRpaApplication).toHaveBeenCalledTimes(1); }); - it('handles application change WITHOUT cache existing', async () => { + it('handle application change WITHOUT cache existing', async () => { const MOCK_VALUE = 'cookbookApplication'; const MOCK_ROBOT_ID = '0123456789-4711'; const MOCK_CURRENT_ELEMENT_ID = '123450815'; diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js index 5cb22671..98fd0020 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js +++ b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js @@ -7,7 +7,7 @@ const BPMN_XML = { const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; describe('Parsing Tests', () => { - it('successfully parses the bpmn to ssot', async () => { + test('Parser testing', async () => { // expect.assertions(1); sessionStorage.setItem('robotName', 'AwesomeTestRobot'); const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index a8869aa7..efeb4b45 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -35,7 +35,7 @@ const taskSectionAsArray = parser.getRobotCodeAsArray(correctTaskSection); const declaredApplications = parser.getApplicationArray(settingsSectionAsArray); describe('RobotCode to SSOT Parsing Tests', () => { - it('contains the correct robotMetadata', () => { + test('ssot contains right robotMetadata', () => { sessionStorage.setItem('idCounter', '5416'); const ssot = parser.parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); @@ -43,7 +43,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(ssot).toHaveProperty('starterId', 'Event_0ay5417'); }); - it('finds the settings selector correctly', () => { + test('settings selector was found correctly', () => { const settingsSectionAsArrayForTest = parser.getRobotCodeAsArray( `RandomOffsetLine\n${correctSettingsSection}` ); @@ -60,7 +60,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toEqual(1); }); - it("throws an error, if settings selector wasn't found", () => { + test("settings selector wasn't found, expected to throw error", () => { const robotCodeWithOutSettingsSelector = robotCodeAsArray.slice(1); expect( parser.getLineNumberForSelector( @@ -69,17 +69,17 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toBe(undefined); }); - it('finds the tasks selector correctly', () => + test('tasks selector was found correctly', () => expect( parser.getLineNumberForSelector(robotCodeAsArray, '*** Tasks ***') ).toEqual(3)); - it('finds all applications', () => + test('all applications were found', () => expect(['Testing', 'Excel.Application']).toEqual( expect.arrayContaining(declaredApplications) )); - it('has a correct elementsArray', () => { + test('elementsArray is correct', () => { sessionStorage.setItem('idCounter', '5416'); const elementsArray = parser.getElementsArray( taskSectionAsArray, @@ -89,7 +89,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(elementsArray).toEqual(correctElementsArray); }); - it('generates correct instruction blocks', () => { + test('instruction blocks are generated correct', () => { const instructionBlocks = parser.getInstructionBlocksFromTaskSection( taskSectionAsArray, taskAndApplicationCombinations @@ -99,7 +99,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { }); describe('Error handling while parsing', () => { - it("throws an error, if settings selector wasn't found", async () => { + test("settings selector wasn't found (and Error was thrown)", async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect(message).toEqual( @@ -114,7 +114,7 @@ describe('Error handling while parsing', () => { ); }); - it('handles "Library" errors', async () => { + test('check "Library" error handling', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -130,7 +130,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - it('handles "RPA."-Alias errors', async () => { + test('check "RPA."-Alias error handling', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -146,7 +146,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - it('handles "RPA-Application is not defined" errors', async () => { + test('check "RPA-Application is not defined" error handling', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( diff --git a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js index d21da0e8..3b16bb4f 100644 --- a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js +++ b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js @@ -15,7 +15,7 @@ import { parseBpmnToSsot } from '../parser/BpmnToSsotParsing/BpmnToSsotParsing'; import constants from '../modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils'; describe('Robot Metadata Utilities Tests', () => { - it('downloads the robot file', async () => { + it('download robot file', async () => { sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); getParsedRobotFile.mockImplementation((robotId) => { @@ -34,7 +34,7 @@ describe('Robot Metadata Utilities Tests', () => { await downloadRobotFile(constants.MOCK_ROBOT_ID); }); - it('saves to cloud', async () => { + it('save to cloud', async () => { upsert.mockImplementation(() => { expect(sessionStorage.getItem('ssotLocal')).toEqual( JSON.stringify(constants.MOCK_PARSER_RESULT) diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index 7760839b..70aefb71 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -51,7 +51,7 @@ describe('jobs have validation for missing parameters', () => { }); }); - it('should be invalid if status is empty', async () => { + it('should be invalid if Status is empty', async () => { job.save((err) => { expect(err.errors.status).to.exist; expect(err.errors.status.message).equal('Status required'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 2dad6daa..5b8ce35b 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -32,7 +32,7 @@ describe('tasks can be created', () => { describe('tasks have validation for missing parameters', () => { const task = new RpaTask({}); - it('should be invalid if application is empty', async () => { + it('should be invalid if Application is empty', async () => { task.save( (err) => expect(err.errors.Application).to.exist && @@ -40,7 +40,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if task is empty', async () => { + it('should be invalid if Task is empty', async () => { task.save( (err) => expect(err.errors.Task).to.exist && @@ -48,7 +48,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if code is empty', async () => { + it('should be invalid if Code is empty', async () => { task.save( (err) => expect(err.errors.Code).to.exist && diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index fab72811..5cfc80f2 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -33,7 +33,7 @@ describe('user access objects can be created', () => { describe('user access objects have validation for missing parameters', () => { const job = new UserAccesObject({}); - it('should be invalid if robotId is empty', async () => { + it('should be invalid if RobotId is empty', async () => { job.save( (err) => expect(err.errors.robotId).to.exist && @@ -41,7 +41,7 @@ describe('user access objects have validation for missing parameters', () => { ); }); - it('should be invalid if userId is empty', async () => { + it('should be invalid if UserId is empty', async () => { job.save( (err) => expect(err.errors.userId).to.exist && diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js index da76606e..62eda922 100644 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ b/server/api/routes/robots/rpaattributes/rpaattributes.test.js @@ -72,7 +72,7 @@ describe('PUT /robots/rpaattributes', () => { }); describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all attributes for a robot', async () => { + it('successfully retreives all Attributes for a robot', async () => { await dbLoader.loadAttributesInDb(); const request = httpMocks.createRequest({ diff --git a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js index e108141d..b7bd4b40 100644 --- a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -41,8 +41,8 @@ afterEach(async () => dbHandler.clearDatabase()); */ afterAll(async () => dbHandler.closeDatabase()); -describe('ssot to robot Parsing', () => { - it('parses all the elements of the ssot to robot correctly', async () => { +describe('Ssot Parsing', () => { + it('parses all the elements of the ssot correctly', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); @@ -64,7 +64,7 @@ describe('ssot to robot Parsing', () => { expect(parserResultString).toMatch(BROWSER_ACTIVITY_PARAM); }); - it('parses all the elements of the ssot to robot in the correct order', async () => { + it('parses all the elements of the ssot in the correct order', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index e5c0f736..36f19eab 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -30,7 +30,7 @@ afterEach(async () => dbHandler.clearDatabase()); afterAll(async () => dbHandler.closeDatabase()); describe('robot code retrieval', () => { - it('sucessfully retreives the robot code', async () => { + it('sucessfully retreives the roboto code', async () => { await dbLoader.loadSsotInDb(); await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); From bfbced76ccd4476a88cee6f0a818edd5f4c45e46 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 17 May 2021 16:32:14 +0200 Subject: [PATCH 034/149] refactored tests --- .../pages/RobotOverview/RobotOverview.test.js | 2 +- .../modelerSidebarFunctionality.test.js | 26 +++++++++---------- .../BpmnToSsotParsing.test.js | 2 +- .../robotCodeToSsotParsing.test.js | 22 ++++++++-------- .../robotMetadataUtils.test.js | 4 +-- server/api/models/robotJobModel.test.js | 2 +- server/api/models/rpaTaskModel.test.js | 6 ++--- .../api/models/userAccessObjectModel.test.js | 4 +-- .../rpaattributes/rpaattributes.test.js | 2 +- .../__tests__/SsotToRobotParser.test.js | 6 ++--- server/socket/socketHelper.test.js | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/client/src/components/pages/RobotOverview/RobotOverview.test.js b/client/src/components/pages/RobotOverview/RobotOverview.test.js index f048a368..c38fb06b 100644 --- a/client/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/client/src/components/pages/RobotOverview/RobotOverview.test.js @@ -56,7 +56,7 @@ beforeAll(() => jest.spyOn(window, 'fetch')); beforeEach(() => window.fetch.mockImplementation(mockFetch)); describe('Testing functionality behind button to trigger function call for new but creation', () => { - it('check if attempt to fetch occured twice', async () => { + it('checks if attempt to fetch occured twice', async () => { act(() => { // eslint-disable-next-line react/jsx-filename-extension render( diff --git a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 583f7035..233c49dd 100644 --- a/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/client/src/utils/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -26,7 +26,7 @@ import { fetchTasksFromDB } from '../../api/applicationAndTaskSelection'; import constants from './modelerSidebarFunctionalityTestingUtils'; describe('Sidebar Functionality: Small Utilities', () => { - it('handle modeler element changed with no new selection', async () => { + it('handles modeler element changed with no new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -42,7 +42,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(0); }); - it('handle modeler element changed with new selection', async () => { + it('handles modeler element changed with new selection', async () => { let setElementStateCallCounter = 0; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { @@ -62,7 +62,7 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(1); }); - it('handle output variable name change', async () => { + it('handles output variable name change', async () => { setOutputValueName.mockImplementation((activityId, newValue) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(newValue).toEqual(constants.MOCK_NEW_VALUE); @@ -74,7 +74,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handle input parameter change', async () => { + it('handles input parameter change', async () => { setSingleParameter.mockImplementation((activityId, value) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(value).toEqual(constants.MOCK_VALUE); @@ -86,7 +86,7 @@ describe('Sidebar Functionality: Small Utilities', () => { ); }); - it('handle modeler name change', async () => { + it('handles modeler name change', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -106,7 +106,7 @@ describe('Sidebar Functionality: Small Utilities', () => { }); describe('Sidebar Functionality: Modeler Selection Change', () => { - it('handle modeler selection change; element is not a task', async () => { + it('handles modeler selection change; element is not a task', async () => { const MOCK_CURRENT_ELEMENT = { id: constants.MOCK_CURRENT_ELEMENT_ID, businessObject: { name: 'oldTestName' }, @@ -144,7 +144,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; no attribute obj match found', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -184,7 +184,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -237,7 +237,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handle modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -297,7 +297,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { }); describe('Sidebar Functionality: Task Change', () => { - it('handle task change WITH parameter update', async () => { + it('handles task change WITH parameter update', async () => { let setOutputVariableNameCallCounter = 0; let setvariableListCallCounter = 0; const MOCK_SETTER_OBJECT = { @@ -344,7 +344,7 @@ describe('Sidebar Functionality: Task Change', () => { expect(setvariableListCallCounter).toEqual(1); }); - it('handle task change WITHOUT parameter update', async () => { + it('handles task change WITHOUT parameter update', async () => { setRpaTask.mockImplementation( (robotId, activityId, selectedApplication, value) => { expect(value).toBeUndefined(); @@ -368,7 +368,7 @@ describe('Sidebar Functionality: Task Change', () => { }); describe('Sidebar Functionality: Application Change', () => { - it('handle application change WITH cache existing', async () => { + it('handles application change WITH cache existing', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -416,7 +416,7 @@ describe('Sidebar Functionality: Application Change', () => { expect(setRpaApplication).toHaveBeenCalledTimes(1); }); - it('handle application change WITHOUT cache existing', async () => { + it('handles application change WITHOUT cache existing', async () => { const MOCK_VALUE = 'cookbookApplication'; const MOCK_ROBOT_ID = '0123456789-4711'; const MOCK_CURRENT_ELEMENT_ID = '123450815'; diff --git a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js index 98fd0020..5cb22671 100644 --- a/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js +++ b/client/src/utils/parser/BpmnToSsotParsing/BpmnToSsotParsing.test.js @@ -7,7 +7,7 @@ const BPMN_XML = { const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; describe('Parsing Tests', () => { - test('Parser testing', async () => { + it('successfully parses the bpmn to ssot', async () => { // expect.assertions(1); sessionStorage.setItem('robotName', 'AwesomeTestRobot'); const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); diff --git a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index efeb4b45..a8869aa7 100644 --- a/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/client/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -35,7 +35,7 @@ const taskSectionAsArray = parser.getRobotCodeAsArray(correctTaskSection); const declaredApplications = parser.getApplicationArray(settingsSectionAsArray); describe('RobotCode to SSOT Parsing Tests', () => { - test('ssot contains right robotMetadata', () => { + it('contains the correct robotMetadata', () => { sessionStorage.setItem('idCounter', '5416'); const ssot = parser.parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); @@ -43,7 +43,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(ssot).toHaveProperty('starterId', 'Event_0ay5417'); }); - test('settings selector was found correctly', () => { + it('finds the settings selector correctly', () => { const settingsSectionAsArrayForTest = parser.getRobotCodeAsArray( `RandomOffsetLine\n${correctSettingsSection}` ); @@ -60,7 +60,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toEqual(1); }); - test("settings selector wasn't found, expected to throw error", () => { + it("throws an error, if settings selector wasn't found", () => { const robotCodeWithOutSettingsSelector = robotCodeAsArray.slice(1); expect( parser.getLineNumberForSelector( @@ -69,17 +69,17 @@ describe('RobotCode to SSOT Parsing Tests', () => { ) ).toBe(undefined); }); - test('tasks selector was found correctly', () => + it('finds the tasks selector correctly', () => expect( parser.getLineNumberForSelector(robotCodeAsArray, '*** Tasks ***') ).toEqual(3)); - test('all applications were found', () => + it('finds all applications', () => expect(['Testing', 'Excel.Application']).toEqual( expect.arrayContaining(declaredApplications) )); - test('elementsArray is correct', () => { + it('has a correct elementsArray', () => { sessionStorage.setItem('idCounter', '5416'); const elementsArray = parser.getElementsArray( taskSectionAsArray, @@ -89,7 +89,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { expect(elementsArray).toEqual(correctElementsArray); }); - test('instruction blocks are generated correct', () => { + it('generates correct instruction blocks', () => { const instructionBlocks = parser.getInstructionBlocksFromTaskSection( taskSectionAsArray, taskAndApplicationCombinations @@ -99,7 +99,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { }); describe('Error handling while parsing', () => { - test("settings selector wasn't found (and Error was thrown)", async () => { + it("throws an error, if settings selector wasn't found", async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect(message).toEqual( @@ -114,7 +114,7 @@ describe('Error handling while parsing', () => { ); }); - test('check "Library" error handling', async () => { + it('handles "Library" errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -130,7 +130,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - test('check "RPA."-Alias error handling', async () => { + it('handles "RPA."-Alias errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( @@ -146,7 +146,7 @@ describe('Error handling while parsing', () => { parser.getApplicationArray(settingsSectionWithError); }); - test('check "RPA-Application is not defined" error handling', async () => { + it('handles "RPA-Application is not defined" errors', async () => { customNotification.mockImplementation((type, message) => { expect(type).toEqual('Error'); expect( diff --git a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js index 3b16bb4f..d21da0e8 100644 --- a/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js +++ b/client/src/utils/robotMetadataUtils/robotMetadataUtils.test.js @@ -15,7 +15,7 @@ import { parseBpmnToSsot } from '../parser/BpmnToSsotParsing/BpmnToSsotParsing'; import constants from '../modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils'; describe('Robot Metadata Utilities Tests', () => { - it('download robot file', async () => { + it('downloads the robot file', async () => { sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); getParsedRobotFile.mockImplementation((robotId) => { @@ -34,7 +34,7 @@ describe('Robot Metadata Utilities Tests', () => { await downloadRobotFile(constants.MOCK_ROBOT_ID); }); - it('save to cloud', async () => { + it('saves to cloud', async () => { upsert.mockImplementation(() => { expect(sessionStorage.getItem('ssotLocal')).toEqual( JSON.stringify(constants.MOCK_PARSER_RESULT) diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index 70aefb71..7760839b 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -51,7 +51,7 @@ describe('jobs have validation for missing parameters', () => { }); }); - it('should be invalid if Status is empty', async () => { + it('should be invalid if status is empty', async () => { job.save((err) => { expect(err.errors.status).to.exist; expect(err.errors.status.message).equal('Status required'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 5b8ce35b..2dad6daa 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -32,7 +32,7 @@ describe('tasks can be created', () => { describe('tasks have validation for missing parameters', () => { const task = new RpaTask({}); - it('should be invalid if Application is empty', async () => { + it('should be invalid if application is empty', async () => { task.save( (err) => expect(err.errors.Application).to.exist && @@ -40,7 +40,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if Task is empty', async () => { + it('should be invalid if task is empty', async () => { task.save( (err) => expect(err.errors.Task).to.exist && @@ -48,7 +48,7 @@ describe('tasks have validation for missing parameters', () => { ); }); - it('should be invalid if Code is empty', async () => { + it('should be invalid if code is empty', async () => { task.save( (err) => expect(err.errors.Code).to.exist && diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 5cfc80f2..fab72811 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -33,7 +33,7 @@ describe('user access objects can be created', () => { describe('user access objects have validation for missing parameters', () => { const job = new UserAccesObject({}); - it('should be invalid if RobotId is empty', async () => { + it('should be invalid if robotId is empty', async () => { job.save( (err) => expect(err.errors.robotId).to.exist && @@ -41,7 +41,7 @@ describe('user access objects have validation for missing parameters', () => { ); }); - it('should be invalid if UserId is empty', async () => { + it('should be invalid if userId is empty', async () => { job.save( (err) => expect(err.errors.userId).to.exist && diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js index 62eda922..da76606e 100644 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ b/server/api/routes/robots/rpaattributes/rpaattributes.test.js @@ -72,7 +72,7 @@ describe('PUT /robots/rpaattributes', () => { }); describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all Attributes for a robot', async () => { + it('successfully retreives all attributes for a robot', async () => { await dbLoader.loadAttributesInDb(); const request = httpMocks.createRequest({ diff --git a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js index b7bd4b40..e108141d 100644 --- a/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/services/SsotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -41,8 +41,8 @@ afterEach(async () => dbHandler.clearDatabase()); */ afterAll(async () => dbHandler.closeDatabase()); -describe('Ssot Parsing', () => { - it('parses all the elements of the ssot correctly', async () => { +describe('ssot to robot Parsing', () => { + it('parses all the elements of the ssot to robot correctly', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); @@ -64,7 +64,7 @@ describe('Ssot Parsing', () => { expect(parserResultString).toMatch(BROWSER_ACTIVITY_PARAM); }); - it('parses all the elements of the ssot in the correct order', async () => { + it('parses all the elements of the ssot to robot in the correct order', async () => { await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index 36f19eab..e5c0f736 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -30,7 +30,7 @@ afterEach(async () => dbHandler.clearDatabase()); afterAll(async () => dbHandler.closeDatabase()); describe('robot code retrieval', () => { - it('sucessfully retreives the roboto code', async () => { + it('sucessfully retreives the robot code', async () => { await dbLoader.loadSsotInDb(); await dbLoader.loadAttributesInDb(); await dbLoader.loadParametersInDb(); From 46634b552e7cec444602a3c669af4b01cee31922 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 17 May 2021 18:39:21 +0200 Subject: [PATCH 035/149] implement review comments --- .github/workflows/publishDocumentation.yml | 2 +- README.md | 6 +-- .../robots/{robotsRetrieval.js => robots.js} | 0 ...AttributeRetrieval.js => rpaAttributes.js} | 0 ...aParameterRetrieval.js => rpaParameter.js} | 0 .../pages/RobotCodeEditor/RobotCodeEditor.jsx | 2 +- .../robotInteractionCockpitFunctionality.js | 4 +- .../modelerSidebarFunctionality.js | 2 +- .../modelerSidebarFunctionality.test.js | 4 +- .../pages/RobotModeler/RobotModeler.jsx | 6 +-- .../RobotContainer/RobotContainer.jsx | 2 +- .../localSsotController/attributes.js | 2 +- .../localSsotController/parameters.js | 2 +- .../localSsotController/ssot.js | 9 ++-- server/api/models/robotJobModel.test.js | 4 +- server/api/models/rpaTaskModel.test.js | 4 +- .../models/singleSourceOfTruthModel.test 2.js | 42 ++++++++++++++++ .../models/singleSourceOfTruthModel.test.js | 4 +- .../models/userAccessObjectModel.test 2.js | 49 +++++++++++++++++++ .../api/models/userAccessObjectModel.test.js | 4 +- .../functionalities/functionalities.test.js | 6 +-- server/api/routes/robots/robots.test.js | 9 ++-- .../rpaAttributes/rpaAttributes.test.js | 11 ++--- .../rpaParameters/rpaParameters.test.js | 11 ++--- .../rpaattributes/rpaattributes.test.js | 11 ++--- server/api/routes/users/users.test.js | 6 +-- server/socket/socketHelper.test.js | 8 +-- .../__tests__/SsotToRobotParser.test.js | 6 +-- .../TestDatabaseHandler.js} | 0 .../databaseLoader.js | 0 .../{testingUtils => testing}/testData.js | 0 server/utils/testing/testDatabaseHandler 2.js | 48 ++++++++++++++++++ .../testRobotFile.txt | 0 wiki/Documentation-Folder-structure.md | 23 ++++----- 34 files changed, 203 insertions(+), 84 deletions(-) rename frontend/src/api/routes/robots/{robotsRetrieval.js => robots.js} (100%) rename frontend/src/api/routes/robots/{rpaAttributeRetrieval.js => rpaAttributes.js} (100%) rename frontend/src/api/routes/robots/{rpaParameterRetrieval.js => rpaParameter.js} (100%) create mode 100644 server/api/models/singleSourceOfTruthModel.test 2.js create mode 100644 server/api/models/userAccessObjectModel.test 2.js rename server/utils/{testingUtils/testDatabaseHandler.js => testing/TestDatabaseHandler.js} (100%) rename server/utils/{testingUtils => testing}/databaseLoader.js (100%) rename server/utils/{testingUtils => testing}/testData.js (100%) create mode 100644 server/utils/testing/testDatabaseHandler 2.js rename server/utils/{testingUtils => testing}/testRobotFile.txt (100%) diff --git a/.github/workflows/publishDocumentation.yml b/.github/workflows/publishDocumentation.yml index 4257c8b8..d7752659 100644 --- a/.github/workflows/publishDocumentation.yml +++ b/.github/workflows/publishDocumentation.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - - name: navigate to client and build + - name: navigate to frontend and build run: cd ./frontend/ && npm install --save-dev better-docs jsdoc && npm run docs - name: Deploy diff --git a/README.md b/README.md index 9f65dc10..470130d9 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Please try running the latest version of: - Node.js and npm - nodemon (`npm install nodemon -g`) -And then install all dependencies with `npm install` in the server and client directory. +And then install all dependencies with `npm install` in the server and frontend directory. ### Set up Heroku @@ -32,8 +32,8 @@ We use ESLint with the AirBnB Codestyle. Simply install the Plug-in ([VSCode](ht ## Run application -Before running, please always make sure to have the most recent module versions installed using `npm install` in the server, as well as the client directory. -To run a development preview of the app, navigate to the server directory and run `npm run local` to start the API server, navigate into the client folder and run `npm start` again to also start the frontend. +Before running, please always make sure to have the most recent module versions installed using `npm install` in the server, as well as the frontend directory. +To run a development preview of the app, navigate to the server directory and run `npm run local` to start the API server, navigate into the frontend folder and run `npm start` again to also start the frontend. Now check http://localhost:3000/ to have a look at the app. To run the local client, follow the steps in the [Readme of the local client](https://github.com/bptlab/ark_automate_local#readme). diff --git a/frontend/src/api/routes/robots/robotsRetrieval.js b/frontend/src/api/routes/robots/robots.js similarity index 100% rename from frontend/src/api/routes/robots/robotsRetrieval.js rename to frontend/src/api/routes/robots/robots.js diff --git a/frontend/src/api/routes/robots/rpaAttributeRetrieval.js b/frontend/src/api/routes/robots/rpaAttributes.js similarity index 100% rename from frontend/src/api/routes/robots/rpaAttributeRetrieval.js rename to frontend/src/api/routes/robots/rpaAttributes.js diff --git a/frontend/src/api/routes/robots/rpaParameterRetrieval.js b/frontend/src/api/routes/robots/rpaParameter.js similarity index 100% rename from frontend/src/api/routes/robots/rpaParameterRetrieval.js rename to frontend/src/api/routes/robots/rpaParameter.js diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index 0067df94..f75d264f 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -3,7 +3,7 @@ import { Layout, Button, Space, Row, Col } from 'antd'; import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; -import { getParsedRobotFile } from '../../../api/routes/robots/robotsRetrieval'; +import { getParsedRobotFile } from '../../../api/routes/robots/robots'; import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; import { upsert } from '../../../utils/sessionStorage/localSsotController/ssot'; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index 4fceb167..de0a6bd0 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -1,5 +1,5 @@ -import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameterRetrieval'; -import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributeRetrieval'; +import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameter'; +import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributes'; const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index d40fc50c..0a5e8384 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -15,7 +15,7 @@ import { setOutputValueName, getParameterObject, } from '../../../../../utils/sessionStorage/localSsotController/parameters'; -import { getParsedRobotFile } from '../../../../../api/routes/robots/robotsRetrieval'; +import { getParsedRobotFile } from '../../../../../api/routes/robots/robots'; import downloadString from './downloadStringAsFile'; import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 81286388..03887cbf 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -2,7 +2,7 @@ /* eslint-disable import/first */ /* eslint-disable no-undef */ -jest.mock('../../../../../api/routes/robots/robotsRetrieval'); +jest.mock('../../../../../api/routes/robots/robots'); jest.mock('./downloadStringAsFile'); jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); jest.mock('../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'); @@ -34,7 +34,7 @@ import { } from '../../../../../utils/sessionStorage/localSsotController/parameters'; import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/functionalities'; import constants from './modelerSidebarFunctionalityTestingUtils'; -import { getParsedRobotFile } from '../../../../../api/routes/robots/robotsRetrieval'; +import { getParsedRobotFile } from '../../../../../api/routes/robots/robots'; import downloadString from './downloadStringAsFile'; import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 563fcd99..d0cd2b94 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -3,9 +3,9 @@ import { Layout } from 'antd'; import BpmnModeler from './BpmnModeler/BpmnModeler'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; -import { getSsot } from '../../../api/routes/robots/robotsRetrieval'; -import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameterRetrieval'; -import { getAllAttributes } from '../../../api/routes/robots/rpaAttributeRetrieval'; +import { getSsot } from '../../../api/routes/robots/robots'; +import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameter'; +import { getAllAttributes } from '../../../api/routes/robots/rpaAttribute'; import { getAllRpaFunctionalities } from '../../../api/routes/functionalities/functionalities'; import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; import { diff --git a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index cd2ea1e4..50866901 100644 --- a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -13,7 +13,7 @@ import { initSsotSessionStorage } from '../../../../utils/sessionStorage/localSs import { changeSsotName, deleteRobotFromDB, -} from '../../../../api/routes/robots/robotsRetrieval'; +} from '../../../../api/routes/robots/robots'; import customNotification from '../../../../utils/componentsFunctionality/notificationUtils'; const { Title } = Typography; diff --git a/frontend/src/utils/sessionStorage/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js index bd2345fe..b0e0d113 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/attributes.js +++ b/frontend/src/utils/sessionStorage/localSsotController/attributes.js @@ -2,7 +2,7 @@ * @category Frontend * @module */ -import { deleteAttributesForActivities } from '../../../api/routes/robots/rpaAttributeRetrieval'; +import { deleteAttributesForActivities } from '../../../api/routes/robots/rpaAttributes'; const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index 486bb908..920d53f6 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -2,7 +2,7 @@ * @category Frontend * @module */ -import { deleteParametersForActivities } from '../../../api/routes/robots/rpaParameterRetrieval'; +import { deleteParametersForActivities } from '../../../api/routes/robots/rpaParameter'; import getRpaFunctionalitiesObject from '../localFunctionalitiesController/functionalities'; import { getAttributeObjectForActivity } from './attributes'; diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index fcf00042..c96712d9 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -3,14 +3,11 @@ * @module */ import customNotification from '../../componentsFunctionality/notificationUtils'; -import { - getSsot, - updateRobot, -} from '../../../api/routes/robots/robotsRetrieval'; +import { getSsot, updateRobot } from '../../../api/routes/robots/robots'; import { getAllAttributes, updateManyAttributes, -} from '../../../api/routes/robots/rpaAttributeRetrieval'; +} from '../../../api/routes/robots/rpaAttributes'; import { initSessionStorage } from '../sessionStorageUtils'; import { getAvailableApplications, @@ -19,7 +16,7 @@ import { import { getAllParametersForRobot, updateManyParameters, -} from '../../../api/routes/robots/rpaParameterRetrieval'; +} from '../../../api/routes/robots/rpaParameter'; import { getParameterStorage, deleteUnusedParameterFromDB } from './parameters'; import { getAttributeStorage, diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index e827c771..25527427 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -2,8 +2,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); -const { testJob } = require('../../utils/testingUtils/testData.js'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); +const { testJob } = require('../../utils/testing/testData.js'); // eslint-disable-next-line no-unused-vars const jobsModel = require('./robotJobModel.js'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 38f6eae8..9512e20c 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -1,8 +1,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); -const { testRpaTask1 } = require('../../utils/testingUtils/testData.js'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); +const { testRpaTask1 } = require('../../utils/testing/testData.js'); // eslint-disable-next-line no-unused-vars const taskModel = require('./rpaTaskModel.js'); diff --git a/server/api/models/singleSourceOfTruthModel.test 2.js b/server/api/models/singleSourceOfTruthModel.test 2.js new file mode 100644 index 00000000..ae6f99ae --- /dev/null +++ b/server/api/models/singleSourceOfTruthModel.test 2.js @@ -0,0 +1,42 @@ +/* eslint-disable no-undef */ +const mongoose = require('mongoose'); +const { expect } = require('chai'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); +const { testSsot } = require('../../utils/testing/testData.js'); +// eslint-disable-next-line no-unused-vars +const ssotModel = require('./singleSourceOfTruthModel.js'); + +const Ssot = mongoose.model('SSoT'); + +/** + * Connect to a new in-memory database before running any tests. + */ +beforeAll(async () => dbHandler.connect()); + +/** + * Clear all test data after every test. + */ +afterEach(async () => dbHandler.clearDatabase()); + +/** + * Remove and close the db and server. + */ +afterAll(async () => dbHandler.closeDatabase()); + +describe('Robots can be created', () => { + const ssot = new Ssot(testSsot); + it('should throw no errors for correct job', async () => { + ssot.save((err) => expect(err).to.not.exist); + }); +}); + +describe('Robots have validation for missing parameters', () => { + const job = new Ssot({}); + it('should be invalid if robotName is empty', async () => { + job.save( + (err) => + expect(err.errors.robotName).to.exist && + expect(err.errors.robotName.message).equal('robotName required') + ); + }); +}); diff --git a/server/api/models/singleSourceOfTruthModel.test.js b/server/api/models/singleSourceOfTruthModel.test.js index 796871c7..34a1cd82 100644 --- a/server/api/models/singleSourceOfTruthModel.test.js +++ b/server/api/models/singleSourceOfTruthModel.test.js @@ -1,8 +1,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); -const { testSsot } = require('../../utils/testingUtils/testData.js'); +const dbHandler = require('../../utils/testing/TestDatabaseHandler.js'); +const { testSsot } = require('../../utils/testing/testData.js'); // eslint-disable-next-line no-unused-vars const ssotModel = require('./singleSourceOfTruthModel.js'); diff --git a/server/api/models/userAccessObjectModel.test 2.js b/server/api/models/userAccessObjectModel.test 2.js new file mode 100644 index 00000000..2c9466bf --- /dev/null +++ b/server/api/models/userAccessObjectModel.test 2.js @@ -0,0 +1,49 @@ +/* eslint-disable no-undef */ +const mongoose = require('mongoose'); +const { expect } = require('chai'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); +const { testUserAccessObject } = require('../../utils/testing/testData.js'); +// eslint-disable-next-line no-unused-vars +const userAccessObjectModel = require('./userAccessObjectModel.js'); + +const UserAccesObject = mongoose.model('userAccessObject'); +/** + * Connect to a new in-memory database before running any tests. + */ +beforeAll(async () => dbHandler.connect()); + +/** + * Clear all test data after every test. + */ +afterEach(async () => dbHandler.clearDatabase()); + +/** + * Remove and close the db and server. + */ +afterAll(async () => dbHandler.closeDatabase()); + +describe('user access objects can be created', () => { + const userAccessObject = new UserAccesObject(testUserAccessObject); + it('should throw no errors for correct job', async () => { + userAccessObject.save((err) => expect(err).to.not.exist); + }); +}); + +describe('user access objects have validation for missing parameters', () => { + const job = new UserAccesObject({}); + it('should be invalid if RobotId is empty', async () => { + job.save( + (err) => + expect(err.errors.robotId).to.exist && + expect(err.errors.robotId.message).equal('RobotId required') + ); + }); + + it('should be invalid if UserId is empty', async () => { + job.save( + (err) => + expect(err.errors.userId).to.exist && + expect(err.errors.userId.message).equal('UserId required') + ); + }); +}); diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 7672cdd6..5cfc80f2 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -1,10 +1,10 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/testingUtils/testDatabaseHandler.js'); +const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); const { testUserAccessObject, -} = require('../../utils/testingUtils/testData.js'); +} = require('../../utils/TestingUtils/testData.js'); // eslint-disable-next-line no-unused-vars const userAccessObjectModel = require('./userAccessObjectModel.js'); diff --git a/server/api/routes/functionalities/functionalities.test.js b/server/api/routes/functionalities/functionalities.test.js index 26f3df10..cff57397 100644 --- a/server/api/routes/functionalities/functionalities.test.js +++ b/server/api/routes/functionalities/functionalities.test.js @@ -1,10 +1,10 @@ /* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../utils/testing/databaseLoader'); const rpaController = require('../../controllers/rpaFrameworkCommandsController'); -const testData = require('../../../utils/testingUtils/testData'); +const testData = require('../../../utils/testing/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/robots/robots.test.js b/server/api/routes/robots/robots.test.js index 2702d625..74f03950 100644 --- a/server/api/routes/robots/robots.test.js +++ b/server/api/routes/robots/robots.test.js @@ -2,18 +2,15 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../utils/testing/databaseLoader'); const ssotRetrievalController = require('../../controllers/ssotRetrievalController'); const ssotParsingController = require('../../controllers/ssotParsingController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../models/rpaTaskModel'); -const { - testSsot, - testRobotId, -} = require('../../../utils/testingUtils/testData'); +const { testSsot, testRobotId } = require('../../../utils/testing/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js index 30715cf1..9b641924 100644 --- a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js @@ -2,18 +2,15 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testing/databaseLoader'); const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); -const testData = require('../../../../utils/testingUtils/testData'); -const { - testSsot, - testRobotId, -} = require('../../../../utils/testingUtils/testData'); +const testData = require('../../../../utils/testing/testData'); +const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/robots/rpaParameters/rpaParameters.test.js b/server/api/routes/robots/rpaParameters/rpaParameters.test.js index 693e1aff..14261d6c 100644 --- a/server/api/routes/robots/rpaParameters/rpaParameters.test.js +++ b/server/api/routes/robots/rpaParameters/rpaParameters.test.js @@ -2,18 +2,15 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testing/databaseLoader'); const ssotVariableController = require('../../../controllers/ssotVariableController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); -const testData = require('../../../../utils/testingUtils/testData'); -const { - testSsot, - testRobotId, -} = require('../../../../utils/testingUtils/testData'); +const testData = require('../../../../utils/testing/testData'); +const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); beforeAll(async () => dbHandler.connect()); diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js index 30715cf1..9b641924 100644 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ b/server/api/routes/robots/rpaattributes/rpaattributes.test.js @@ -2,18 +2,15 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../../utils/testing/databaseLoader'); const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); -const testData = require('../../../../utils/testingUtils/testData'); -const { - testSsot, - testRobotId, -} = require('../../../../utils/testingUtils/testData'); +const testData = require('../../../../utils/testing/testData'); +const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index 7b1d1e07..23fb3284 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -2,8 +2,8 @@ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../utils/testingUtils/testDatabaseHandler'); -const dbLoader = require('../../../utils/testingUtils/databaseLoader'); +const dbHandler = require('../../../utils/testing/testDatabaseHandler'); +const dbLoader = require('../../../utils/testing/databaseLoader'); const ssotRetrievalController = require('../../controllers/ssotRetrievalController'); // eslint-disable-next-line no-unused-vars @@ -13,7 +13,7 @@ const { testSsot, testRobotId, testUserId, -} = require('../../../utils/testingUtils/testData'); +} = require('../../../utils/testing/testData'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index cf1ebe49..63b33f30 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -1,18 +1,18 @@ /* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); -const dbHandler = require('../utils/testingUtils/testDatabaseHandler'); +const dbHandler = require('../utils/testing/testDatabaseHandler'); const socketHelperFunctions = require('./socketHelperFunctions'); -const testData = require('../utils/testingUtils/testData'); +const testData = require('../utils/testing/testData'); const { testRobotId, testUserId, testJobId, testRobotCode, -} = require('../utils/testingUtils/testData'); +} = require('../utils/testing/testData'); -const dbLoader = require('../utils/testingUtils/databaseLoader'); +const dbLoader = require('../utils/testing/databaseLoader'); /** * Connect to a new in-memory database before running any tests. diff --git a/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js index d879c689..85c2c8cc 100644 --- a/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -1,13 +1,13 @@ /* eslint-disable no-undef */ const parser = require('../ssotToRobotParser'); const testSsot = require('./SsotForTesting.json'); -const dbHandler = require('../../testingUtils/testDatabaseHandler'); -const dbLoader = require('../../testingUtils/databaseLoader'); +const dbHandler = require('../../testing/testDatabaseHandler'); +const dbLoader = require('../../testing/databaseLoader'); const { testRobotId, testJobId, testRobotCode, -} = require('../../testingUtils/testData'); +} = require('../../testing/testData'); const EXCEL1_ACTIVITY_NAME = 'FirstActivity'; const OPEN_WORKBOOK_CMD = 'Open Workbook'; diff --git a/server/utils/testingUtils/testDatabaseHandler.js b/server/utils/testing/TestDatabaseHandler.js similarity index 100% rename from server/utils/testingUtils/testDatabaseHandler.js rename to server/utils/testing/TestDatabaseHandler.js diff --git a/server/utils/testingUtils/databaseLoader.js b/server/utils/testing/databaseLoader.js similarity index 100% rename from server/utils/testingUtils/databaseLoader.js rename to server/utils/testing/databaseLoader.js diff --git a/server/utils/testingUtils/testData.js b/server/utils/testing/testData.js similarity index 100% rename from server/utils/testingUtils/testData.js rename to server/utils/testing/testData.js diff --git a/server/utils/testing/testDatabaseHandler 2.js b/server/utils/testing/testDatabaseHandler 2.js new file mode 100644 index 00000000..d92de9e7 --- /dev/null +++ b/server/utils/testing/testDatabaseHandler 2.js @@ -0,0 +1,48 @@ +const mongoose = require('mongoose'); +const { MongoMemoryServer } = require('mongodb-memory-server'); + +const mongooseOpts = { + useNewUrlParser: true, + useUnifiedTopology: true, +}; + +const mongod = new MongoMemoryServer({ + instance: { + dbName: 'ark-automate', + port: 59051, + }, +}); + +/** + * Connect to the in-memory database. + */ +exports.connect = async () => { + const uri = await mongod.getUri(); + await mongoose.createConnection(uri, mongooseOpts); + await mongoose.connect(uri, mongooseOpts); +}; + +/** + * Drop database, close the connection and stop mongod. + */ +exports.closeDatabase = async () => { + await mongoose.connection.dropDatabase(); + await mongoose.connection.close(); + await mongoose.disconnect(); + await mongod.stop(); +}; + +/** + * Remove all the data for all db collections. + */ +exports.clearDatabase = async () => { + const { collections } = mongoose.connection; + + // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html + const result = []; + for (const key in collections) { + const collection = collections[key]; + result.push(collection.deleteMany()); + } + return Promise.all(result); +}; diff --git a/server/utils/testingUtils/testRobotFile.txt b/server/utils/testing/testRobotFile.txt similarity index 100% rename from server/utils/testingUtils/testRobotFile.txt rename to server/utils/testing/testRobotFile.txt diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index 4fbe9d55..a7f95e46 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -9,36 +9,31 @@ There is a clear separation of the server side of the application and the client The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). -## server +## Server The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). The central file here is the **server.js**. Here all the different routers are being used. -- **routes/**: All the different routers are implemented here. For different routes there are different routers. - Each router forwards the corresponding HTTP request to an appropriate controller by calling a suitable function of the controller. -- **controllers/**: In the controllers the HTTP request actually gets handled. While handling the request the functions in controllers use supporting functions from the folder services and data models from the folder models. Test files for a controller should be put right next to the controller file and both should be wrapped in a folder that is named like the controller file. -- **models/**: Schemas and models are being stored here which interact with a database (in our case MongoDB). -- **services/**: Functionality that is being used in the controllers. Test files for a service file should be put right next to the service file and both should be wrapped in a folder that is named like the service file. -- **utils/**: Helper functions. +- **api/**: Contains the routes, models and controllers of our API. +- **socket/**: Contains the socket manager who provides the socket rooms for communication +- **utils/**: Helper functions or files like the SsotToRobotParser, the openApiDocumentation or some testing files -## frontend +## Frontend On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. The **public/** folder contains the known meta information of a web page, as well as the favicon. Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: - **api/**: API call related functions. -- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. If multiple test files are needed to test one component then put all the test files in one tests folder next to the component. - Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `HeaderNavbar/` folder contains the navigation bar that gets imported from each page. - In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. +- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. + Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. + In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - **layout/**: Contains our corporate design and customized theme. - **resources/**: Contains images, fonts and other static files. - **utils/**: Contains the following subfolders: - - **componentsFunctionality/**: Here all functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - - **rpaFunctionality/**: #todo - **sessionStorage/**: Contains all the helper files we need to interact with the session storage - - **socket/**: #todo + - **socket/**: Contains the socket connection file # Naming conventions From e9e8a3b24671aff4c2f84ee92d09e9a601a1e49d Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 17 May 2021 18:40:16 +0200 Subject: [PATCH 036/149] part 2 --- documentationConfig.json | 6 +- wiki/Documentation-single-source-of-truth.md | 2 +- wiki/How-to-style-using-CSS.md | 130 ++++++++++--------- wiki/How-to-write-code-documentation.md | 8 +- wiki/How-to-write-tests.md | 130 ++++++++++--------- 5 files changed, 143 insertions(+), 133 deletions(-) diff --git a/documentationConfig.json b/documentationConfig.json index 4ef5dc4f..277a563e 100644 --- a/documentationConfig.json +++ b/documentationConfig.json @@ -1,6 +1,6 @@ { "opts": { - "template": "../client/node_modules/better-docs", + "template": "../frontend/node_modules/better-docs", "destination": "./../documentationWebsite" }, "tags": { @@ -9,12 +9,12 @@ "plugins": ["node_modules/better-docs/category"], "source": { "include": [ - "./../client/src", + "./../frontend/src", "./../server/controllers", "./../server/services", "./../server/utils" ], - "exclude": ["./../client/node_modules", "./../server/node_modules"], + "exclude": ["./../frontend/node_modules", "./../server/node_modules"], "includePattern": ".+\\.js(doc|x)?$", "excludePattern": "(^|\\/|\\\\)_" } diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-single-source-of-truth.md index 49503683..6bdf1bd6 100644 --- a/wiki/Documentation-single-source-of-truth.md +++ b/wiki/Documentation-single-source-of-truth.md @@ -27,7 +27,7 @@ Observation: All frontends that represent "executable program code" can be repre The SSoT itself will be stored on the server-side of the product. It will support multiple use cases shown in the following image: ![SSoT in product](https://i.imgur.com/jViSHTQ.png) -With a change of one of the interfaces on the client-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. +With a change of one of the interfaces on the frontend-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. ### We have agreed on the following diff --git a/wiki/How-to-style-using-CSS.md b/wiki/How-to-style-using-CSS.md index 298cf5f0..274ef95c 100644 --- a/wiki/How-to-style-using-CSS.md +++ b/wiki/How-to-style-using-CSS.md @@ -1,18 +1,21 @@ # How to style components using CSS + ## CSS general info + - CSS = Cascading Style Sheets - Only purpose is to style and animate markup language (HTML) - Because we are rendering our React app in `HTML`, we can therefore also style all components of the app - ## Getting started with CSS +
How to use CSS

**1. Use Inline CSS** Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. + ```html - + ``` **2. Use Internal CSS** @@ -20,13 +23,14 @@ In the tag open a \ tag. There you can specifiy t ```html - + ``` + **3. Use External CSS** Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. `` @@ -34,6 +38,7 @@ Create a `styles.css` file and copy everything from your internal style tag to t Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp ### How to debug CSS + Use the dev tools of your browser and check out the Style tab regarding your selected object. ![](https://i.imgur.com/OkpU7fx.png) @@ -42,17 +47,10 @@ Use the dev tools of your browser and check out the Style tab regarding your sel

Anatomy of CSS Syntax

- ```html -selector { - property: value; -} - -// Example -h1 { - color: red; -} +selector { property: value; } // Example h1 { color: red; } ``` + **Selector:** Who do you want to change? **Property:** What do you want to change? **Value:** How do you want it to be changed? @@ -62,47 +60,52 @@ h1 { **Which properties can I change?** Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index +#### Selector: CSS Classes -#### Selector: CSS Classes You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. **Html** + ```html -

Helloo +

Helloo

``` **CSS** + ``` .title { color: red; } ``` - #### Selector: HTML IDs. + You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. **Html** + ```html -

Helloo +

Helloo

``` **CSS** + ``` #MyTitle { color: red; } ``` +#### Selector: Pseudo classes -#### Selector: Pseudo classes Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) + ```HTML h1:hover{ color= blue; } ``` +#### CSS Rule priority -#### CSS Rule priority Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values

@@ -111,40 +114,44 @@ Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefine

- Write CSS Rules like this, starting the properties in a new line + ```html -h1 { - color: red; - font-size : 200px; -} +h1 { color: red; font-size : 200px; } ``` + - Alphabetically sort the selectors - Use rem as font size unit

## Using CSS in React +
Styling Options

-### Inline Styling +### Inline Styling To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. + ```jsx class MyHeader extends React.Component { render() { return (

-

Hello Style!

-

Add a little style!

+

Hello Style!

+

Add a little style!

); } } ``` + > Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. -### Using external stylesheets +### Using external stylesheets + Write your CSS styling in a separate .css file and import it. **./App.jsx** + ```jsx import React from 'react'; import ReactDOM from 'react-dom'; @@ -159,16 +166,19 @@ class MyHeader extends React.Component { ReactDOM.render(, document.getElementById('root')); ``` + **./App.css** + ```jsx button { color: red; margin: 10px; } ``` -### Dynamically changing Styles -You can change your inline styles like any other variable (assuming that you have it as a JS object in your file). When the component is rendered, the values will be read and the styling then applied. Every time you rerender, the values will be read again and with it any changes you applied. +### Dynamically changing Styles + +You can change your inline styles like any other variable (assuming that you have it as a JS object in your file). When the component is rendered, the values will be read and the styling then applied. Every time you rerender, the values will be read again and with it any changes you applied. ```jsx import React from 'react'; @@ -196,6 +206,7 @@ class MyPersons extends React.Component { ReactDOM.render(, document.getElementById('root')); ``` + Same can be done with classNames `

This is really working!

` @@ -203,13 +214,13 @@ Same can be done with classNames

## How to use AntD? +
Basics about AntD

+To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. -To **use AntD**, it must be installed in the client directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. - -Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` +Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. @@ -231,7 +242,8 @@ export default TestButton;

AntD-Components

-**Frequently used Components** +**Frequently used Components** + - for button see: [Button](https://ant.design/components/button/) - for normal text & headings see: [Typography](https://ant.design/components/typography/) - for input fields see: [Input](https://ant.design/components/input/) @@ -240,7 +252,8 @@ export default TestButton; **AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). -**AntD Grid** +**AntD Grid** + - As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. - Your content elements should be placed directly in the col, and the only col should be placed directly in a row. - The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. @@ -262,13 +275,14 @@ ReactDOM.render( col3 , - mountNode, + mountNode ); ``` + > This will return two rows. The first row contains two columns, the second row contains three columns. > -**AntD Space** -If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. +> **AntD Space** +> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. ```jsx import { Button, Space } from 'antd'; @@ -276,17 +290,18 @@ import { Button, Space } from 'antd'; function SpaceDemo() { return ( - - + + ); } ReactDOM.render(, mountNode); ``` + > This will return two Buttons, horizontally aligned with space between the buttons. > -By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. +> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. @@ -295,18 +310,17 @@ import { Button, Space } from 'antd'; function SpaceDemo() { return ( - - - + + + ); } ReactDOM.render(, mountNode); ``` -> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. -> +> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. **Link to the Documentation**. For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. @@ -332,12 +346,8 @@ In principle, before each use of CSS should be considered whether the use in the - **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose - if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component -

- - - ### CSS vs. CSS modules
When to use what? @@ -376,9 +386,8 @@ In the file we would include the style in the following way:

- - ### Conventions +
We agreed on

@@ -388,20 +397,19 @@ In the file we would include the style in the following way: - sizing: Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) -

--- +## Homework (take approx. 1h) - -## Homework (take approx. 1h) 1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) -3. Click through [this tutorial](https://de.learnlayout.com) -4. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) -5. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) +2. Click through [this tutorial](https://de.learnlayout.com) +3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) +4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) ## Further Reading. + For more games to learn CSS checkout https://codepip.com/games/ Take a look at this website https://css-tricks.com/ -For the style guide issue https://24ways.org/2011/front-end-style-guides +For the style guide issue https://24ways.org/2011/front-end-style-guides diff --git a/wiki/How-to-write-code-documentation.md b/wiki/How-to-write-code-documentation.md index 8ee5cd27..ed2e3899 100644 --- a/wiki/How-to-write-code-documentation.md +++ b/wiki/How-to-write-code-documentation.md @@ -2,7 +2,7 @@ We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. -Documentation will be generated as a website under which the individual parts of the software (server/client) are visible and listed with their respective classes and modules. +Documentation will be generated as a website under which the individual parts of the software (server/frontend) are visible and listed with their respective classes and modules. It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. ## How to write documentation @@ -27,7 +27,7 @@ For components please try to use the following style (taken from the [plugins re The attributes are: - description: Describe the component, its use case and/or where it could be used -- category: Either _Client_ or _Server_, based on where it is used (for React components this should most likely always be _Client_) +- category: Either _Frontend_ or _Server_, based on where it is used (for React components this should most likely always be _Frontend_) - component: Tag to specify this as a component - example: Code which describes a possible use scenario for this component @@ -47,7 +47,7 @@ To document classes, please follow the following scheme in front of the construc The attributes are: - description: Describe the constructor function -- category: Either _Client_ or _Server_, based on where it is used +- category: Either _Frontend_ or _Server_, based on where it is used - class: Tag to specify this as a class constructor - classdesc: Describe the functionality and behavior of the class @@ -83,5 +83,5 @@ When grouping related functions loosely in a file because of the same context, p The attributes are: -- category: Either _Client_ or _Server_, based on where it is used +- category: Either _Frontend_ or _Server_, based on where it is used - module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. diff --git a/wiki/How-to-write-tests.md b/wiki/How-to-write-tests.md index fd20d5ab..1676e30b 100644 --- a/wiki/How-to-write-tests.md +++ b/wiki/How-to-write-tests.md @@ -11,27 +11,24 @@ - Your next Steps - Places to continue research - - - - --- ### Why automatically test? + **The purpose of testing is to give you confidence that the app is working correctly.** + - Helps to catch bugs earlier - - You might unknowingly break an app whenever you change a line of code. + - You might unknowingly break an app whenever you change a line of code. - Test your changes faster - - Manually testing your app after each change is cumbersome. - - Refactoring is easier + - Manually testing your app after each change is cumbersome. + - Refactoring is easier - Tests help document - - for example edge cases + - for example edge cases - Improves the architecture - - Enforces code splitting and single responsibilities - - + - Enforces code splitting and single responsibilities ### Tools + ![The tools used often](https://i.imgur.com/sxEsfOJ.png) There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. @@ -40,84 +37,89 @@ There are 2 main competitors for testing utilities: Enzyme and React Testing Lib > With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). #### Jest -* Unit testing -* Snapshot testing - * Is useful for making sure that the UI does not change unexpectedly -* Integration testing -* Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) - * Mock = An object on which you set expectations - * Stub = Provides predefined answers to method calls - * Spy = Doesn't change functionality - * **In general you can simply refer to it as mocking** + +- Unit testing +- Snapshot testing + - Is useful for making sure that the UI does not change unexpectedly +- Integration testing +- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) + - Mock = An object on which you set expectations + - Stub = Provides predefined answers to method calls + - Spy = Doesn't change functionality + - **In general you can simply refer to it as mocking** Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) You can also use [this short Jest cheatsheet](https://devhints.io/jest) #### React Testing Library -* Component testing - * Testing based on the correct rendering of components -* Simulate user behavior -* Can't access components state + +- Component testing + - Testing based on the correct rendering of components +- Simulate user behavior +- Can't access components state [Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) [RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) #### Which testing tool to use -* For everything related to rendering components and therefore requires evaluations against the DOM -* If you are only testing functions and methods, please use plain Jest + +- For everything related to rendering components and therefore requires evaluations against the DOM +- If you are only testing functions and methods, please use plain Jest ### What to test? + #### Do -* Utility methods -* Complex implementations (eg: algorithms) -* Anything that has edge cases -* Core business logic -* High-risk Services -* Common user interactions -* Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) -* Interactions between units that were stubbed in the unit tests + +- Utility methods +- Complex implementations (eg: algorithms) +- Anything that has edge cases +- Core business logic +- High-risk Services +- Common user interactions +- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) +- Interactions between units that were stubbed in the unit tests #### Don't -* JavaScript and NodeJS core functions -* Third-party libraries -* External applications -* API calls. Stub them unless you’re doing E2E testing -* Database operations, unless you’re doing E2E testing -* Trivial methods not involving logic (simple getters and setters) -* Code that is throw-away or placeholder code + +- JavaScript and NodeJS core functions +- Third-party libraries +- External applications +- API calls. Stub them unless you’re doing E2E testing +- Database operations, unless you’re doing E2E testing +- Trivial methods not involving logic (simple getters and setters) +- Code that is throw-away or placeholder code ### How to write a test? + - In the same folder of component, create file filename.test.js - - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files + - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files - Use describe, it, beforeEach, etc. ### How to execute a test? -`npm test` to run tests in client or server folder (doesn't work yet, needs to be added to scripts) +`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) ### Best practices -* Tests should be pure (have the same outcome on multiple runs), so mock - * API calls - * Third-party libraries - * Timers - * Dates - * Random values - * File access -* Use constants to assign and evaluate to prevent typos that may cause the test to fail -* Create Tests That Are Resistant to UI Changes -* All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); - * Think about using the built-in afterEach functionality if your Use-Case requires it -* Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. -* Find yourself mocking the same function over and over in multiple tests? - * Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! -* Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. -* Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain -* Don’t create fake/poor tests just for increasing coverage -* Avoid including implementation details in tests - - +- Tests should be pure (have the same outcome on multiple runs), so mock + - API calls + - Third-party libraries + - Timers + - Dates + - Random values + - File access +- Use constants to assign and evaluate to prevent typos that may cause the test to fail +- Create Tests That Are Resistant to UI Changes +- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); + - Think about using the built-in afterEach functionality if your Use-Case requires it +- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. +- Find yourself mocking the same function over and over in multiple tests? + - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! +- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. +- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain +- Don’t create fake/poor tests just for increasing coverage +- Avoid including implementation details in tests ## Next Steps @@ -125,8 +127,8 @@ You can also use [this short Jest cheatsheet](https://devhints.io/jest) - [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 - [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) - ## Places to continue research + - https://www.freecodecamp.org/news/testing-react-hooks/ - https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be - https://www.robinwieruch.de/react-testing-library/ From a74d59177b2ac0913fb2779fc73347d3151922f5 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 17 May 2021 18:41:29 +0200 Subject: [PATCH 037/149] fix minor typo --- frontend/src/components/pages/RobotModeler/RobotModeler.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index d0cd2b94..5c0bac64 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -5,7 +5,7 @@ import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/routes/robots/robots'; import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameter'; -import { getAllAttributes } from '../../../api/routes/robots/rpaAttribute'; +import { getAllAttributes } from '../../../api/routes/robots/rpaAttributes'; import { getAllRpaFunctionalities } from '../../../api/routes/functionalities/functionalities'; import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; import { From 3c57c657537890ee18e2de34170cbf4aa1d6d49e Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 18 May 2021 08:00:45 +0200 Subject: [PATCH 038/149] try to fix backend tests --- server/api/models/userAccessObjectModel.test.js | 6 ++---- .../{testDatabaseHandler 2.js => testDatabaseHandler.js} | 0 2 files changed, 2 insertions(+), 4 deletions(-) rename server/utils/testing/{testDatabaseHandler 2.js => testDatabaseHandler.js} (100%) diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 5cfc80f2..2c9466bf 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -1,10 +1,8 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/TestingUtils/TestDatabaseHandler.js'); -const { - testUserAccessObject, -} = require('../../utils/TestingUtils/testData.js'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); +const { testUserAccessObject } = require('../../utils/testing/testData.js'); // eslint-disable-next-line no-unused-vars const userAccessObjectModel = require('./userAccessObjectModel.js'); diff --git a/server/utils/testing/testDatabaseHandler 2.js b/server/utils/testing/testDatabaseHandler.js similarity index 100% rename from server/utils/testing/testDatabaseHandler 2.js rename to server/utils/testing/testDatabaseHandler.js From 50b75d3599529725fb5233933161ff9c7bcdbdda Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 08:09:15 +0200 Subject: [PATCH 039/149] Delete TestDatabaseHandler.js --- server/utils/testing/TestDatabaseHandler.js | 48 --------------------- 1 file changed, 48 deletions(-) delete mode 100644 server/utils/testing/TestDatabaseHandler.js diff --git a/server/utils/testing/TestDatabaseHandler.js b/server/utils/testing/TestDatabaseHandler.js deleted file mode 100644 index d92de9e7..00000000 --- a/server/utils/testing/TestDatabaseHandler.js +++ /dev/null @@ -1,48 +0,0 @@ -const mongoose = require('mongoose'); -const { MongoMemoryServer } = require('mongodb-memory-server'); - -const mongooseOpts = { - useNewUrlParser: true, - useUnifiedTopology: true, -}; - -const mongod = new MongoMemoryServer({ - instance: { - dbName: 'ark-automate', - port: 59051, - }, -}); - -/** - * Connect to the in-memory database. - */ -exports.connect = async () => { - const uri = await mongod.getUri(); - await mongoose.createConnection(uri, mongooseOpts); - await mongoose.connect(uri, mongooseOpts); -}; - -/** - * Drop database, close the connection and stop mongod. - */ -exports.closeDatabase = async () => { - await mongoose.connection.dropDatabase(); - await mongoose.connection.close(); - await mongoose.disconnect(); - await mongod.stop(); -}; - -/** - * Remove all the data for all db collections. - */ -exports.clearDatabase = async () => { - const { collections } = mongoose.connection; - - // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html - const result = []; - for (const key in collections) { - const collection = collections[key]; - result.push(collection.deleteMany()); - } - return Promise.all(result); -}; From 6988bee8bd18f5c897d284500bdc3621657f0d97 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 08:12:11 +0200 Subject: [PATCH 040/149] Update singleSourceOfTruthModel.test.js --- server/api/models/singleSourceOfTruthModel.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/models/singleSourceOfTruthModel.test.js b/server/api/models/singleSourceOfTruthModel.test.js index 34a1cd82..ae6f99ae 100644 --- a/server/api/models/singleSourceOfTruthModel.test.js +++ b/server/api/models/singleSourceOfTruthModel.test.js @@ -1,7 +1,7 @@ /* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); -const dbHandler = require('../../utils/testing/TestDatabaseHandler.js'); +const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); const { testSsot } = require('../../utils/testing/testData.js'); // eslint-disable-next-line no-unused-vars const ssotModel = require('./singleSourceOfTruthModel.js'); From fc8a131d08d3a82317ecdbf866d91285337fc75e Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 09:36:56 +0200 Subject: [PATCH 041/149] Delete singleSourceOfTruthModel.test 2.js --- .../models/singleSourceOfTruthModel.test 2.js | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 server/api/models/singleSourceOfTruthModel.test 2.js diff --git a/server/api/models/singleSourceOfTruthModel.test 2.js b/server/api/models/singleSourceOfTruthModel.test 2.js deleted file mode 100644 index ae6f99ae..00000000 --- a/server/api/models/singleSourceOfTruthModel.test 2.js +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable no-undef */ -const mongoose = require('mongoose'); -const { expect } = require('chai'); -const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); -const { testSsot } = require('../../utils/testing/testData.js'); -// eslint-disable-next-line no-unused-vars -const ssotModel = require('./singleSourceOfTruthModel.js'); - -const Ssot = mongoose.model('SSoT'); - -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('Robots can be created', () => { - const ssot = new Ssot(testSsot); - it('should throw no errors for correct job', async () => { - ssot.save((err) => expect(err).to.not.exist); - }); -}); - -describe('Robots have validation for missing parameters', () => { - const job = new Ssot({}); - it('should be invalid if robotName is empty', async () => { - job.save( - (err) => - expect(err.errors.robotName).to.exist && - expect(err.errors.robotName.message).equal('robotName required') - ); - }); -}); From 7f64c8a9da5b5ca273a4cf055cc2e2bf6b7a0ac8 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 09:37:03 +0200 Subject: [PATCH 042/149] Delete userAccessObjectModel.test 2.js --- .../models/userAccessObjectModel.test 2.js | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 server/api/models/userAccessObjectModel.test 2.js diff --git a/server/api/models/userAccessObjectModel.test 2.js b/server/api/models/userAccessObjectModel.test 2.js deleted file mode 100644 index 2c9466bf..00000000 --- a/server/api/models/userAccessObjectModel.test 2.js +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable no-undef */ -const mongoose = require('mongoose'); -const { expect } = require('chai'); -const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); -const { testUserAccessObject } = require('../../utils/testing/testData.js'); -// eslint-disable-next-line no-unused-vars -const userAccessObjectModel = require('./userAccessObjectModel.js'); - -const UserAccesObject = mongoose.model('userAccessObject'); -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('user access objects can be created', () => { - const userAccessObject = new UserAccesObject(testUserAccessObject); - it('should throw no errors for correct job', async () => { - userAccessObject.save((err) => expect(err).to.not.exist); - }); -}); - -describe('user access objects have validation for missing parameters', () => { - const job = new UserAccesObject({}); - it('should be invalid if RobotId is empty', async () => { - job.save( - (err) => - expect(err.errors.robotId).to.exist && - expect(err.errors.robotId.message).equal('RobotId required') - ); - }); - - it('should be invalid if UserId is empty', async () => { - job.save( - (err) => - expect(err.errors.userId).to.exist && - expect(err.errors.userId.message).equal('UserId required') - ); - }); -}); From b84376cc3b04f21453475d83632c8b69d8bd4ba3 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 18 May 2021 11:12:17 +0200 Subject: [PATCH 043/149] fix merge errors and check sandros changes --- .../modelerSidebarFunctionality.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 4fd0f656..b0c0251a 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -40,7 +40,7 @@ import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; describe('Robot Metadata Utilities Tests', () => { - it('download robot file', async () => { + it('downloads the robot file', async () => { sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); getParsedRobotFile.mockImplementation((robotId) => { @@ -59,7 +59,7 @@ describe('Robot Metadata Utilities Tests', () => { await downloadRobotFile(constants.MOCK_ROBOT_ID); }); - it('save to cloud', async () => { + it('saves to cloud', async () => { upsert.mockImplementation(() => { expect(sessionStorage.getItem('ssotLocal')).toEqual( JSON.stringify(constants.MOCK_PARSER_RESULT) From ecf7d8a92b17c7683b8986a8ef3d91e58a0311d9 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 11:14:30 +0200 Subject: [PATCH 044/149] fix typo --- server/api/routes/robots/rpaAttributes/rpaAttributes.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js index 9b641924..29520b0d 100644 --- a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js @@ -69,7 +69,7 @@ describe('PUT /robots/rpaattributes', () => { }); describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all Attributes for a robot', async () => { + it('successfully retreives all attributes for a robot', async () => { await dbLoader.loadAttributesInDb(); const request = httpMocks.createRequest({ From 882266dcf595a330793dc13de24a60fc96691a0f Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 11:19:51 +0200 Subject: [PATCH 045/149] Delete server/api/routes/robots/rpaattributes directory --- .../robots/rpaattributes/rpaattributes.js | 10 -- .../rpaattributes/rpaattributes.test.js | 127 ------------------ 2 files changed, 137 deletions(-) delete mode 100644 server/api/routes/robots/rpaattributes/rpaattributes.js delete mode 100644 server/api/routes/robots/rpaattributes/rpaattributes.test.js diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.js b/server/api/routes/robots/rpaattributes/rpaattributes.js deleted file mode 100644 index f3a77a5d..00000000 --- a/server/api/routes/robots/rpaattributes/rpaattributes.js +++ /dev/null @@ -1,10 +0,0 @@ -const express = require('express'); -const rpaAttributesController = require('../../../controllers/ssotRpaAttributes'); - -const router = express.Router(); - -router.put('/', rpaAttributesController.updateMany); -router.delete('/:robotId', rpaAttributesController.deleteForActivities); -router.get('/:robotId', rpaAttributesController.retrieveAttributesForRobot); - -module.exports = router; diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js deleted file mode 100644 index 29520b0d..00000000 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable no-underscore-dangle */ -const mongoose = require('mongoose'); -const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testing/databaseLoader'); -const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); - -// eslint-disable-next-line no-unused-vars -const rpaTaskModel = require('../../../models/rpaTaskModel'); - -const testData = require('../../../../utils/testing/testData'); -const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); - -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('PUT /robots/rpaattributes', () => { - it('successfully updates all attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const newAppValue = 'NewTestApp'; - const newTaskValue = 'NewTestTask'; - - const request = httpMocks.createRequest({ - method: 'POST', - body: { - attributeObjectList: [ - { - activityId: 'Activity_175v5b5', - robotId: '606199015d691786a44a608f', - rpaApplication: newAppValue, - rpaTask: newTaskValue, - }, - ], - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.updateMany(request, response); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - expect(data.modifiedCount).toBe(1); - - // verify if really in DB - const newAttributesObject = await mongoose - .model('rpaAttributes') - .findOne({ - robotId: testRobotId, - activityId: testSsot.elements[2].id, - }) - .exec(); - - expect(newAttributesObject.rpaApplication).toEqual(newAppValue); - expect(newAttributesObject.rpaTask).toEqual(newTaskValue); - }); -}); - -describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const request = httpMocks.createRequest({ - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.retrieveAttributesForRobot( - request, - response - ); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - - expect(data.length).toBe(3); - expect(JSON.stringify(data)).toEqual( - JSON.stringify([ - testData.testAttributes1, - testData.testAttributes2, - testData.testAttributes3, - ]) - ); - }); -}); - -describe('DELETE /robots/rpaattributes/{robotId}', () => { - it('deletes removed activity related attributes', async () => { - await dbLoader.loadSsotInDb(); - await dbLoader.loadAttributesInDb(); - - const deletedActivityList = [ - testSsot.elements[2].id, - testSsot.elements[3].id, - ]; - const payload = { activityIdList: deletedActivityList }; - - const request = httpMocks.createRequest({ - method: 'DELETE', - body: payload, - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.deleteForActivities(request, response); - - const foundAttributes = await mongoose.model('rpaAttributes').find().exec(); - expect(foundAttributes.length).toBe(1); - - expect(response.statusCode).toBe(200); - }); -}); From ff56bf28c5c52f1c180bb873f89abd0e5fb6720f Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 18 May 2021 12:10:27 +0200 Subject: [PATCH 046/149] deleteRpaAttributes --- .../rpaAttributes/rpaAttributes.test.js | 127 ------------------ .../rpaattributes/rpaattributes.test.js | 127 ------------------ 2 files changed, 254 deletions(-) delete mode 100644 server/api/routes/robots/rpaAttributes/rpaAttributes.test.js delete mode 100644 server/api/routes/robots/rpaattributes/rpaattributes.test.js diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js deleted file mode 100644 index 9b641924..00000000 --- a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable no-underscore-dangle */ -const mongoose = require('mongoose'); -const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testing/databaseLoader'); -const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); - -// eslint-disable-next-line no-unused-vars -const rpaTaskModel = require('../../../models/rpaTaskModel'); - -const testData = require('../../../../utils/testing/testData'); -const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); - -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('PUT /robots/rpaattributes', () => { - it('successfully updates all attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const newAppValue = 'NewTestApp'; - const newTaskValue = 'NewTestTask'; - - const request = httpMocks.createRequest({ - method: 'POST', - body: { - attributeObjectList: [ - { - activityId: 'Activity_175v5b5', - robotId: '606199015d691786a44a608f', - rpaApplication: newAppValue, - rpaTask: newTaskValue, - }, - ], - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.updateMany(request, response); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - expect(data.modifiedCount).toBe(1); - - // verify if really in DB - const newAttributesObject = await mongoose - .model('rpaAttributes') - .findOne({ - robotId: testRobotId, - activityId: testSsot.elements[2].id, - }) - .exec(); - - expect(newAttributesObject.rpaApplication).toEqual(newAppValue); - expect(newAttributesObject.rpaTask).toEqual(newTaskValue); - }); -}); - -describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all Attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const request = httpMocks.createRequest({ - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.retrieveAttributesForRobot( - request, - response - ); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - - expect(data.length).toBe(3); - expect(JSON.stringify(data)).toEqual( - JSON.stringify([ - testData.testAttributes1, - testData.testAttributes2, - testData.testAttributes3, - ]) - ); - }); -}); - -describe('DELETE /robots/rpaattributes/{robotId}', () => { - it('deletes removed activity related attributes', async () => { - await dbLoader.loadSsotInDb(); - await dbLoader.loadAttributesInDb(); - - const deletedActivityList = [ - testSsot.elements[2].id, - testSsot.elements[3].id, - ]; - const payload = { activityIdList: deletedActivityList }; - - const request = httpMocks.createRequest({ - method: 'DELETE', - body: payload, - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.deleteForActivities(request, response); - - const foundAttributes = await mongoose.model('rpaAttributes').find().exec(); - expect(foundAttributes.length).toBe(1); - - expect(response.statusCode).toBe(200); - }); -}); diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.test.js b/server/api/routes/robots/rpaattributes/rpaattributes.test.js deleted file mode 100644 index 29520b0d..00000000 --- a/server/api/routes/robots/rpaattributes/rpaattributes.test.js +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable no-underscore-dangle */ -const mongoose = require('mongoose'); -const httpMocks = require('node-mocks-http'); -const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); -const dbLoader = require('../../../../utils/testing/databaseLoader'); -const ssotAttributesController = require('../../../controllers/ssotRpaAttributes'); - -// eslint-disable-next-line no-unused-vars -const rpaTaskModel = require('../../../models/rpaTaskModel'); - -const testData = require('../../../../utils/testing/testData'); -const { testSsot, testRobotId } = require('../../../../utils/testing/testData'); - -/** - * Connect to a new in-memory database before running any tests. - */ -beforeAll(async () => dbHandler.connect()); - -/** - * Clear all test data after every test. - */ -afterEach(async () => dbHandler.clearDatabase()); - -/** - * Remove and close the db and server. - */ -afterAll(async () => dbHandler.closeDatabase()); - -describe('PUT /robots/rpaattributes', () => { - it('successfully updates all attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const newAppValue = 'NewTestApp'; - const newTaskValue = 'NewTestTask'; - - const request = httpMocks.createRequest({ - method: 'POST', - body: { - attributeObjectList: [ - { - activityId: 'Activity_175v5b5', - robotId: '606199015d691786a44a608f', - rpaApplication: newAppValue, - rpaTask: newTaskValue, - }, - ], - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.updateMany(request, response); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - expect(data.modifiedCount).toBe(1); - - // verify if really in DB - const newAttributesObject = await mongoose - .model('rpaAttributes') - .findOne({ - robotId: testRobotId, - activityId: testSsot.elements[2].id, - }) - .exec(); - - expect(newAttributesObject.rpaApplication).toEqual(newAppValue); - expect(newAttributesObject.rpaTask).toEqual(newTaskValue); - }); -}); - -describe('GET /robots/rpaattributes/{robotId}', () => { - it('successfully retreives all attributes for a robot', async () => { - await dbLoader.loadAttributesInDb(); - - const request = httpMocks.createRequest({ - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.retrieveAttributesForRobot( - request, - response - ); - expect(response.statusCode).toBe(200); - const data = await response._getData(); - - expect(data.length).toBe(3); - expect(JSON.stringify(data)).toEqual( - JSON.stringify([ - testData.testAttributes1, - testData.testAttributes2, - testData.testAttributes3, - ]) - ); - }); -}); - -describe('DELETE /robots/rpaattributes/{robotId}', () => { - it('deletes removed activity related attributes', async () => { - await dbLoader.loadSsotInDb(); - await dbLoader.loadAttributesInDb(); - - const deletedActivityList = [ - testSsot.elements[2].id, - testSsot.elements[3].id, - ]; - const payload = { activityIdList: deletedActivityList }; - - const request = httpMocks.createRequest({ - method: 'DELETE', - body: payload, - params: { - robotId: testRobotId, - }, - }); - const response = httpMocks.createResponse(); - - await ssotAttributesController.deleteForActivities(request, response); - - const foundAttributes = await mongoose.model('rpaAttributes').find().exec(); - expect(foundAttributes.length).toBe(1); - - expect(response.statusCode).toBe(200); - }); -}); From cab00d63d9dc751c974bba9f205be33aa8fc9709 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 18 May 2021 13:39:14 +0200 Subject: [PATCH 047/149] fix backend tests --- .../controllers/ssotRetrievalController.js | 242 ++++++++++++++++-- 1 file changed, 218 insertions(+), 24 deletions(-) diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index a13c6b95..4d24e436 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -4,20 +4,74 @@ const mongoose = require('mongoose'); const ssotModels = require('../models/singleSourceOfTruthModel.js'); const userAccessModels = require('../models/userAccessObjectModel.js'); -// GET /ssot/:id +/** + * @swagger + * /robots/{robotId}: + * parameters: + * - name: robotId + * in: path + * description: The id of a robot + * required: true + * schema: + * $ref: '#/components/schemas/RobotIds' + * get: + * tags: + * - Robots + * summary: Get a robot with a specific id + * operationId: getSpecificRobot + * responses: + * 200: + * description: OK + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Robots' + */ exports.getSingleSourceOfTruth = async (req, res) => { try { res.set('Content-Type', 'application/json'); - const { id } = req.params; - const ssot = await mongoose.model('SSoT').findById(id).exec(); + const { robotId } = req.params; + const ssot = await mongoose.model('SSoT').findById(robotId).exec(); res.send(ssot); } catch (err) { console.error(err); } }; -// GET /getAvailableRobotsForUser/78d09f66d2ed466cf20b06f7 +/** + * @swagger + * /users/{userId}/robots: + * parameters: + * - name: userId + * in: path + * description: The id of a user + * required: true + * schema: + * $ref: '#/components/schemas/ObjectIds' + * get: + * tags: + * - Users + * summary: Get all robots for a specific user + * operationId: getRobotsForUser + * responses: + * 200: + * description: OK + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * required: + * - _id + * - robotName + * properties: + * _id: + * $ref: '#/components/schemas/RobotIds' + * robotName: + * $ref: '#/components/schemas/RobotNames' + */ exports.getRobotList = async (req, res) => { try { res.set('Content-Type', 'application/json'); @@ -66,20 +120,46 @@ exports.getRobotList = async (req, res) => { } }; -// GET /renameRobot?id=78d09f66d2ed466cf20b06f7&newName=Bot+Browser +/** + * @swagger + * /robots/{robotId}/robotName: + * parameters: + * - name: robotId + * in: path + * description: The id of a robot + * required: true + * schema: + * $ref: '#/components/schemas/RobotIds' + * patch: + * tags: + * - Robots + * summary: Updates the name of a robot + * operationId: setRobotName + * requestBody: + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/RobotNameObjects' + * description: Object with new robot name + * required: true + * responses: + * 204: + * description: No Content + * 400: + * description: Bad Request + */ exports.renameRobot = async (req, res) => { try { res.set('Content-Type', 'application/json'); - const { id } = req.query; - const usableUserId = mongoose.Types.ObjectId(id); - const { newName } = req.query; - const newNameWithEmptyspace = newName.replace(/\+/g, ' '); + const { robotId } = req.params; + const usableRobotId = mongoose.Types.ObjectId(robotId); + const { newRobotName } = req.body; const ssot = await mongoose .model('SSoT') .findByIdAndUpdate( - { _id: usableUserId }, - { robotName: newNameWithEmptyspace }, + { _id: usableRobotId }, + { robotName: newRobotName }, { new: true, useFindAndModify: false, @@ -96,29 +176,98 @@ exports.renameRobot = async (req, res) => { } }; -// GET /shareRobotWithUser?userId=78d09f66d2ed466cf20b06f7&robotId=78d09f66d2ed466cf20b06f7 +/** + * @swagger + * /users/robotAccess: + * post: + * tags: + * - Users + * summary: Share a robot with a user + * operationId: createUserAccessObject + * requestBody: + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/UserAccessObjects' + * description: Object that connects a user with a robot + * required: true + * responses: + * 201: + * description: Created + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/UserAccessObjects' + * 400: + * description: Bad Request + */ exports.shareRobotWithUser = async (req, res) => { try { res.set('Content-Type', 'application/json'); - const uao = await mongoose.model('userAccessObject').create({ - AccessLevel: 'ReadWrite', - robotId: req.query.robotId, - userId: req.query.userId, - }); - res.send(uao); + const userObject = await mongoose + .model('userAccessObject') + .create(req.body); + res.send(userObject); } catch (err) { console.error(err); } }; -// GET /createNewRobot?userId=78d09f66d2ed466cf20b06f7&robotName=NewRobot +/** + * @swagger + * /users/{userId}/robots: + * parameters: + * - name: userId + * in: path + * description: The id of a user + * required: true + * schema: + * $ref: '#/components/schemas/ObjectIds' + * post: + * tags: + * - Users + * summary: Create a new robot for a specific user + * operationId: createRobotForUser + * requestBody: + * content: + * application/json: + * schema: + * type: object + * required: + * - userId + * - robotName + * properties: + * userId: + * $ref: '#/components/schemas/ObjectIds' + * robotName: + * $ref: '#/components/schemas/RobotNames' + * description: Object that contains the new robotObject and a new userAccessObject + * required: true + * responses: + * 201: + * description: Created + * content: + * application/json: + * schema: + * type: object + * required: + * - robotId + * - robotName + * properties: + * robotId: + * $ref: '#/components/schemas/RobotIds' + * robotName: + * $ref: '#/components/schemas/RobotNames' + * 400: + * description: Bad Request + */ exports.createNewRobot = async (req, res) => { try { res.set('Content-Type', 'application/json'); - const { userId } = req.query; + const { userId } = req.body; const usableUserId = mongoose.Types.ObjectId(userId); - const { robotName } = req.query; + const { robotName } = req.body; const nameWithEmptyspace = robotName.replace(/\+/g, ' '); const initialStartEvent = { @@ -140,7 +289,7 @@ exports.createNewRobot = async (req, res) => { }) .exec(); - const uao = await mongoose.model('userAccessObject').create({ + const userObject = await mongoose.model('userAccessObject').create({ AccessLevel: 'ReadWrite', robotId: ssot.id, userId: usableUserId, @@ -157,7 +306,34 @@ exports.createNewRobot = async (req, res) => { } }; -// POST /overwriteRobot/78d09f66d2ed466cf20b06f7 +/** + * @swagger + * /robots/{robotId}: + * parameters: + * - name: robotId + * in: path + * description: The id of a robot + * required: true + * schema: + * $ref: '#/components/schemas/RobotIds' + * put: + * tags: + * - Robots + * summary: Overwrite the existing robot with an updated one + * operationId: overwriteRobot + * requestBody: + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Robots' + * description: updated Robot object + * required: true + * responses: + * 204: + * description: No Content + * 400: + * description: Bad Request + */ exports.overwriteRobot = async (req, res) => { try { res.set('Content-Type', 'application/json'); @@ -179,7 +355,25 @@ exports.overwriteRobot = async (req, res) => { } }; -// DELETE /ssot/delete/78d09f66d2ed466cf20b06f7 +/** + * @swagger + * /robots/{robotId}: + * parameters: + * - name: robotId + * in: path + * description: The id of a robot + * required: true + * schema: + * $ref: '#/components/schemas/RobotIds' + * delete: + * tags: + * - Robots + * summary: Deletes a robot with a specific id + * operationId: deleteSpecificRobot + * responses: + * 200: + * description: OK + */ exports.deleteRobot = async (req, res) => { try { res.set('Content-Type', 'application/json'); From 6788ac8688faa6704c8356754bdac5853418a55a Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 18 May 2021 13:41:42 +0200 Subject: [PATCH 048/149] Delete server/api/routes/robots/rpaattributes directory --- .../api/routes/robots/rpaattributes/rpaattributes.js | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 server/api/routes/robots/rpaattributes/rpaattributes.js diff --git a/server/api/routes/robots/rpaattributes/rpaattributes.js b/server/api/routes/robots/rpaattributes/rpaattributes.js deleted file mode 100644 index f3a77a5d..00000000 --- a/server/api/routes/robots/rpaattributes/rpaattributes.js +++ /dev/null @@ -1,10 +0,0 @@ -const express = require('express'); -const rpaAttributesController = require('../../../controllers/ssotRpaAttributes'); - -const router = express.Router(); - -router.put('/', rpaAttributesController.updateMany); -router.delete('/:robotId', rpaAttributesController.deleteForActivities); -router.get('/:robotId', rpaAttributesController.retrieveAttributesForRobot); - -module.exports = router; From 28ee531371ec9be1b9521b60fa73a639692e9559 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 15:43:26 +0200 Subject: [PATCH 049/149] Fix first es lint warnings --- .../components/pages/RobotModeler/RobotModeler.jsx | 11 +++++++++-- .../parser/bpmnToSsotParsing/bpmnToSsotParsing.js | 1 + .../parser/ssotToBpmnParsing/ssotToBpmnParsing.js | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 5c0bac64..f2fe83bd 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; import { Layout } from 'antd'; +import PropTypes from 'prop-types'; import BpmnModeler from './BpmnModeler/BpmnModeler'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; @@ -21,8 +22,10 @@ import 'bpmn-font/dist/css/bpmn-embedded.css'; * @category Frontend * @component */ -const Modeler = (match) => { - const { robotId } = match.match.params; +const Modeler = (props) => { + const { match } = props; + const { params } = match; + const { robotId } = params; const [modeler, setModeler] = useState(null); const [robotName, setRobotName] = useState(); @@ -95,4 +98,8 @@ const Modeler = (match) => { ); }; +Modeler.propTypes = { + match: PropTypes.objectOf(PropTypes.object).isRequired, +}; + export default Modeler; diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index cd0a7e2f..8820c037 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -1,3 +1,4 @@ +/* eslint-disable no-param-reassign */ import customNotification from '../../componentsFunctionality/notificationUtils'; const { parseString } = require('xmljs2'); diff --git a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index fcb4f624..a71a6b61 100644 --- a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -1,3 +1,4 @@ +/* eslint-disable no-loop-func */ /** * @category Frontend * @module From 09d0e9a29d00c1c65f692f83b1d7e8637944712a Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 15:43:58 +0200 Subject: [PATCH 050/149] Fix all warnings caused by antd menu --- .../HeaderNavbar/HeaderNavbar.jsx | 21 ++++++++++++------- .../HeaderNavbar/HeaderNavbar.module.css | 6 ++++++ 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.module.css diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 088e2377..44133837 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -3,6 +3,7 @@ import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; import logoCTA from '../../../resources/images/logo_cta.png'; +import styles from './HeaderNavbar.module.css'; const { Header } = Layout; @@ -13,6 +14,7 @@ const { Header } = Layout; */ const HeaderNavbar = (props) => { const { selectedKey } = props; + const iconKey = 0; const robotOverviewPageKey = 1; const bpmnModelerPageKey = 2; const robotCodeEditorPageKey = 3; @@ -38,19 +40,22 @@ const HeaderNavbar = (props) => { } return ( -
+
- - ark_automate Icon - + + + ark_automate Icon + + + Overview diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.module.css b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.module.css new file mode 100644 index 00000000..c6b972ed --- /dev/null +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.module.css @@ -0,0 +1,6 @@ +.modifiedMenuItem:hover { + background-color: var(--colorPrimaryInverted) !important; +} +.header { + padding: 0; +} From 1853eff59189ff4c31341bb1e1e83171b0ceb16e Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 16:52:51 +0200 Subject: [PATCH 051/149] fix "Each child in a list should have a unique "key" prop." --- frontend/src/components/pages/Home/Home.jsx | 2 +- frontend/src/components/pages/RobotOverview/RobotOverview.jsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/pages/Home/Home.jsx b/frontend/src/components/pages/Home/Home.jsx index 8e0b6379..fc759b71 100644 --- a/frontend/src/components/pages/Home/Home.jsx +++ b/frontend/src/components/pages/Home/Home.jsx @@ -19,7 +19,7 @@ const Home = () => { { <> {filteredBotList.map((val) => ( <RobotContainer + key={val._id} userId={userId} - // eslint-disable-next-line no-underscore-dangle robotId={val._id} robotName={val.robotName} refreshOverview={() => retrieveBotList(userId)} From f7d89fc5d8b740db5c12ac902056c33bb740d3d5 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 17:02:00 +0200 Subject: [PATCH 052/149] fix proptypes validation --- .../src/components/pages/RobotModeler/RobotModeler.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index f2fe83bd..7a79cb6e 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -99,7 +99,13 @@ const Modeler = (props) => { }; Modeler.propTypes = { - match: PropTypes.objectOf(PropTypes.object).isRequired, + match: PropTypes.objectOf( + PropTypes.oneOfType([ + PropTypes.string, + PropTypes.bool, + PropTypes.objectOf(PropTypes.string), + ]) + ).isRequired, }; export default Modeler; From 763b3068cf46fcba21191b28a50b80efa6df70f0 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 17:28:16 +0200 Subject: [PATCH 053/149] fix outputVariableName warning and parameterSection child of a list needs key warning --- .../PropertiesPanel/PropertiesPanel.jsx | 6 ++++- .../PPParameterSection/PPParameterSection.jsx | 24 +++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index 5e835f4a..cf78661a 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -65,6 +65,10 @@ const PropertiesPanel = ({ </div> ); +PropertiesPanel.defaultProps = { + outputVariableName: undefined, +}; + PropertiesPanel.propTypes = { element: PropTypes.objectOf(PropTypes.shape).isRequired, nameChanged: PropTypes.func.isRequired, @@ -75,7 +79,7 @@ PropertiesPanel.propTypes = { disableTaskSelection: PropTypes.bool.isRequired, variableList: PropTypes.arrayOf(PropTypes.shape).isRequired, parameterSelectionUpdated: PropTypes.func.isRequired, - outputVariableName: PropTypes.string.isRequired, + outputVariableName: PropTypes.string, outputNameUpdated: PropTypes.func.isRequired, robotId: PropTypes.string.isRequired, }; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx index 32f2495f..e3c4ea29 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx @@ -1,3 +1,4 @@ +/* eslint-disable no-underscore-dangle */ import React from 'react'; import PropTypes from 'prop-types'; import { Typography, Space } from 'antd'; @@ -21,18 +22,17 @@ const PPParameterSection = ({ <Space direction='vertical' style={{ width: '100%' }}> {variableList.map((singleInput) => ( - <> - <PPParameterInput - onValueChange={onValueChange} - variableName={singleInput.name} - isRequired={singleInput.isRequired} - dataType={singleInput.type} - value={singleInput.value} - infoText={singleInput.infoText} - robotId={robotId} - selectedActivity={selectedActivity} - /> - </> + <PPParameterInput + key={singleInput._id} + onValueChange={onValueChange} + variableName={singleInput.name} + isRequired={singleInput.isRequired} + dataType={singleInput.type} + value={singleInput.value} + infoText={singleInput.infoText} + robotId={robotId} + selectedActivity={selectedActivity} + /> ))} </Space> </> From a388773b768f5e54327b145c91dd4687028526f6 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 17:38:52 +0200 Subject: [PATCH 054/149] try to fiy logo-bug part 3 --- frontend/public/logo_cta.png | Bin 0 -> 140734 bytes .../HeaderNavbar/HeaderNavbar.jsx | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 frontend/public/logo_cta.png diff --git a/frontend/public/logo_cta.png b/frontend/public/logo_cta.png new file mode 100644 index 0000000000000000000000000000000000000000..4769760bdac0a50e0f605c8e0452253da1d02f21 GIT binary patch literal 140734 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%0AqHk?{P~J!H^QFD33h9`EpvfD<NUXprzA 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 S=2HU*_)(NqlPQ%p|L{LiHQUVq literal 0 HcmV?d00001 diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 088e2377..97ed7829 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../../resources/images/logo_cta.png'; +// import logoCTA from '../../../resources/images/logo_cta.png'; const { Header } = Layout; @@ -47,7 +47,7 @@ const HeaderNavbar = (props) => { <Link to='/'> <img style={{ margin: '0 1rem 0 -1rem', height: '3rem' }} - src={logoCTA} + src={/*logoCTA*/ 'logo_cta.png'} alt='ark_automate Icon' /> </Link> From 2b8d99a45436332ecc6f50e6f3c6de31aea620dc Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 18 May 2021 17:55:47 +0200 Subject: [PATCH 055/149] adjusted ppparametersection key for child solution and fix prop types warning --- .../PPParameterSection/PPParameterSection.jsx | 5 +++-- .../PPParameterSection/subComponents/PPParameterInput.jsx | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx index e3c4ea29..623d49b2 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx @@ -21,9 +21,10 @@ const PPParameterSection = ({ <Text className='label-on-dark-background'>Parameter:</Text> <Space direction='vertical' style={{ width: '100%' }}> - {variableList.map((singleInput) => ( + {variableList.map((singleInput, index) => ( <PPParameterInput - key={singleInput._id} + // eslint-disable-next-line react/no-array-index-key + key={index} onValueChange={onValueChange} variableName={singleInput.name} isRequired={singleInput.isRequired} diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx index e8ca5ac9..a4c61b8f 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx @@ -128,7 +128,11 @@ PPParameterInput.propTypes = { value: PropTypes.string.isRequired, robotId: PropTypes.string.isRequired, selectedActivity: PropTypes.string.isRequired, - infoText: PropTypes.string.isRequired, + infoText: PropTypes.string, +}; + +PPParameterInput.defaultProps = { + infoText: undefined, }; export default PPParameterInput; From bdbe998e4af79eff078f01c122f1a6cf73f2e299 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:04:16 +0200 Subject: [PATCH 056/149] init workflow testing --- .github/workflows/heroku_deploy.yml | 2 +- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/heroku_deploy.yml b/.github/workflows/heroku_deploy.yml index c4df65c9..ae806995 100644 --- a/.github/workflows/heroku_deploy.yml +++ b/.github/workflows/heroku_deploy.yml @@ -1,7 +1,7 @@ on: push: branches: - - main + - workflow_testing_lukas workflow_dispatch: name: Heroku Deployment jobs: diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 97ed7829..88c67cd0 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -59,7 +59,7 @@ const HeaderNavbar = (props) => { <> {!onOverview && ( <Menu.Item key={bpmnModelerPageKey}> - Modeler + Modeler :D <Link to={bpmnModelerLink} /> </Menu.Item> )} From 58d18b49db1a6553bc7f893c21dc7c4ffa83fca3 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:21:28 +0200 Subject: [PATCH 057/149] als ob das jetzt klappt --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 88c67cd0..0999858e 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -47,7 +47,7 @@ const HeaderNavbar = (props) => { <Link to='/'> <img style={{ margin: '0 1rem 0 -1rem', height: '3rem' }} - src={/*logoCTA*/ 'logo_cta.png'} + src={'./logo_cta.png'} alt='ark_automate Icon' /> </Link> @@ -59,7 +59,7 @@ const HeaderNavbar = (props) => { <> {!onOverview && ( <Menu.Item key={bpmnModelerPageKey}> - Modeler :D + Modeler! <Link to={bpmnModelerLink} /> </Menu.Item> )} From b3134f8c9ab57a0dcf93ea8e99289b61b40582c6 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:22:19 +0200 Subject: [PATCH 058/149] just another fix --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 0999858e..72f43ac7 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -47,7 +47,7 @@ const HeaderNavbar = (props) => { <Link to='/'> <img style={{ margin: '0 1rem 0 -1rem', height: '3rem' }} - src={'./logo_cta.png'} + src={'/logo_cta.png'} alt='ark_automate Icon' /> </Link> From ebbb2642c8f7b5fedf29bb327392c8d55118fe8c Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:33:50 +0200 Subject: [PATCH 059/149] refactor public folder --- .../images => public/logo}/logo_black.png | Bin frontend/public/{ => logo}/logo_cta.png | Bin .../images => public/logo}/logo_inverted.png | Bin .../images => public/logo}/logo_prim.png | Bin .../HeaderNavbar/HeaderNavbar.jsx | 2 +- frontend/src/resources/images/logo_cta.png | Bin 140734 -> 0 bytes 6 files changed, 1 insertion(+), 1 deletion(-) rename frontend/{src/resources/images => public/logo}/logo_black.png (100%) rename frontend/public/{ => logo}/logo_cta.png (100%) rename frontend/{src/resources/images => public/logo}/logo_inverted.png (100%) rename frontend/{src/resources/images => public/logo}/logo_prim.png (100%) delete mode 100644 frontend/src/resources/images/logo_cta.png diff --git a/frontend/src/resources/images/logo_black.png b/frontend/public/logo/logo_black.png similarity index 100% rename from frontend/src/resources/images/logo_black.png rename to frontend/public/logo/logo_black.png diff --git a/frontend/public/logo_cta.png b/frontend/public/logo/logo_cta.png similarity index 100% rename from frontend/public/logo_cta.png rename to frontend/public/logo/logo_cta.png diff --git a/frontend/src/resources/images/logo_inverted.png b/frontend/public/logo/logo_inverted.png similarity index 100% rename from frontend/src/resources/images/logo_inverted.png rename to frontend/public/logo/logo_inverted.png diff --git a/frontend/src/resources/images/logo_prim.png b/frontend/public/logo/logo_prim.png similarity index 100% rename from frontend/src/resources/images/logo_prim.png rename to frontend/public/logo/logo_prim.png diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 72f43ac7..65ade427 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -47,7 +47,7 @@ const HeaderNavbar = (props) => { <Link to='/'> <img style={{ margin: '0 1rem 0 -1rem', height: '3rem' }} - src={'/logo_cta.png'} + src={'/logo/logo_cta.png'} alt='ark_automate Icon' /> </Link> diff --git a/frontend/src/resources/images/logo_cta.png b/frontend/src/resources/images/logo_cta.png deleted file mode 100644 index 4769760bdac0a50e0f605c8e0452253da1d02f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140734 zcmeFZbyS?owlCU1kl^m_65JbiclQuz+}+)R1_A_kcY?bmSa5fDf<p*?J6UV5z4kl% zp8L)i@Ba06kHHvxRkMC`*7U0W;Jvb<6cRi>JOBVdl93iy1pr<Jf`0_zV8A2NWz5C^ z0BOCKy0(j|u{)`Qlf9Xx4T#jm(*Z;Z@~|`m06dl|)6J9ho7_TQOfZQdr$lg(w{)`t z!_VyVTj^A%raxv?V(W~;-$K%S2jr~WWxsTucKxh&J2Plpl4bsSWpvsy(8E0H|9pIQ zwsH0F@H8*@GS%hpxmI{}Bf3-i#pJ$Sd0?LvF{>$?>Do1p#ou?Wp<3(RL+ivm!a9z8 ztMksMrz=uVLBA}NyJOKOA3wT|+3axO_P(QU#|6^vu~OODln_&%e_M9;U=pqEwgFxL zN72i(vqwCUsq7E^-h_{u9wgP5-ilv4iaYmZh5b_3Zu4)2U=Kc#`oHY?kvu&-g{?yi z#a6o)tbhIN^EJZg`8xEiKk*~ZR<>P+Uo`FWeJ`!?i!sp1|8(_a?J9M3Ff<~$I`Z<A z4`{FJt|XeZHUKY_B-DR)^W@@}M&cKraq=nqv0_4ul3_lS&<%Gp?21@R8<BMYgCUNU z3B7P%x2$#`NzikPW<^^~iI3B%dCQUR!sU@Q`TTTw{Ylee#S?Z79|{M-XUFKdxy$P! z`?1;klPIPki_t>jM#(S;cR1sD&w!G0rMi6);rw=7>;6e8RH8IN#M{_T-r?t6%a{6d zJ=?-h`(GZS2bkYDxcVCepgP){u#m+=7}5Sz4ytCILya(@5DAVSNZh7`>Um=agXf&5 zrys+3wB}P3cDrU#D=vV<6%QvzrQtL^O{&97aHHm&9~MUS%}ldG*Llu1QQfIlRhAL5 zMMZ6N)~d9jap~Bibl0r1eo6P(_Id#W*P`QkN$<=z`T&L-U*G!txrd#7jN__a$1KzK z2QT(+-Q{NuO#|B-PPY|HD2%r6t;?t085_vbj+eD+iUKFs>`V=A)1&itEjNwJXFuZ` zsw<v1_eo3{eL#$z@`t`RQga@2v-iI5NqJazqocnP4ti+7&>oaz1U~ReffRYK1g0>t z@e1g;?O;LCn0pv`tLGH%U7%C@-BFzfJ<q5YCTGRchnK+&3RnM;<!n>isQtNb3&jXn zYS{;ZhC;T@3t`f>k47X0goUhQYJ+RCyG1LHL$*!HN=R+U!D{)eK3nX2sT3Kt$d>zJ z^SU(bwsS|SU3{?(N3V5AzP(Cq$~YR&Y9U+}e<mDPe{EEb{Zt{a)^c3Py~ToH9)4t} za2r%C?@ZE0tT1_RB?zh#Ai%l2SxTW(&(hBcXzD;HRDVdlN<rIPOkOTrdCSW}*Ouhg zl&m#YSMOqeX020W@MOywGi__oEBAI#>@r+L=aiqbQLfPq!TAIaXA^}x6z}62@ehlg z@(@oMnvXi^)--nITGNZ})%et{CH<b6Mp!Hq)spgQ1`BN%8^`m_^)rOGUncB|JR+3O zLYHVfxUlOOTPf@IHSOq)T5YPfXJF7++YZm(_>O6om}be3rnBM#O^vdhQ%f6Jxhkif zh)rU)A4vn{=_(E83I<!hT2VzCV;O26A~sv&e4FttgJ$8e3P_dI<Gs%u=belmCKk9b z<>^Sm9jO0&zt*U^F<R(rRV9w^PDS8aj$xT9a8l(h9qo9wy!s}5P5a{l4gApp`REGQ z1;1^_AQ{;jSyTKm9!tfr;yG*|H++&f%1%(*{;8sdGhUZ9@_;*}EsfT56$hm-!1|Nd z3<Oa`&BR#V^YQ3*5u4IVO>KIx3TArIWm&zq!ZHlUr~}(w9HNdh)sLnzUpcGrHe1P= zo@^J+be#^qV0sIAoE`EJoJbVd3kP-fn1t>77W&a|6^hF}7Jws1b8>McrHLIwXIEO_ zM|#P)5v%ImVcpu>G>9xs05)x!cLw$q8BsS66`w_8%-fdMp&O=a_a>g()IjQjgXYCU zL+&fD(X|ebaf2I84te}XeA|rCf?^fDCrX?j#9z^ceb<-S(QIdCX|EA$q($r_J>9xP zz4E2Z2Q^j6ammEdVW+MjwBXgEjj0j{zG*hG%5e6gYhqe4oDtr!bnNKC@bQtRE0#z) zD|Ul+JwH+)Z1l^#MSJ<EXYv+QDl?E7BRmptx-9>bC1Mp&mB!wjUj|IyFQRO2drEY~ zF_6WYg@IdD?T+)IvD>aH4Z*J;Av&0bgpkL7@mPYv=gqoK{t|)CJb!E%ru^ZqNt`Mo zDp}i%*b&O{k^xg98(IaX-Dz1(VL?N!b0nT#Bsz#8T%KnAHMEApE4~zGP1+>%!gC63 zb}Q!Ero{KkWmbKihpmu?ce!uf8FJp-n2U{KdZ7nNq#20Wib2CbE2(RD5m_ubB<I|J zkm$#JBVjSNl7VrgaFk6g08o*<uz1j#5mR(~4MM?xh1{Tk)St9kWMkFIX^|&fcay48 zcy;}CT{{O~tK6C#x}et{XI>dK`A0$dF2u&xDj|?44`NU+*V6Zs-Q`Dopn310vz}}W zyoDp`OeU$LReg7-x?%oZ@GuWd(GM?>uqw)>v-sNpIP=J&-lbF+*f`4(g<(c?PJ(mI zsv10XFTLES<Zl*8#O`%DgEAi`bh};5fYBBZ*;r*F6iA|eW0@^|^%1XnO*GyMa)kAn z$PG`hzQvY3M*KPU$|8Ur;z*T@VofwP<BI^jY#4cZa};s`D^D}OX>lOxXDB5LY06U} zZ<l)sRfLkTjz&lY3-@=)L}Mf=%fYnx`@sh+>scVwAmsU+eQdL1bZseYNT09QcooBb zP$BitIhBX}99^c6Sombv1=70eNFK<h-Dc8&=8hr`10%%461IZ~uP9SP*%`p0tnzH0 z=3Ti5pkEhgIYr(tz`70qI#q~9v+`Y+^OLqCh%m$X=UULqhJMJWK!wNq0=YRU6U>FH z%+eZ43yanlBrOmFJH15;n?o-O4B&|-@xDMKyg0yQa`_2(D<pC1%YMd?yr@u^!3F3l zUwvIIa^Fmdg=QNub2ki=LE+HJ0jJjTQf0cz%-N;_i3R1liTCPG!QktCF{d7m0W%)- zRR~kMMsmHV#I@X^a-X3^OxNC7JQu~$IrkEaTAbB)#~F6G^(n3-bUO5^_o3b5eX6u0 zD9YW5CAt0;)<kT@18k_uetlcPp2Aag{j2T#aJ3P4dlT3TOi7|~#t;@w%_r~0BH8k+ zYDIm=WoiK_@+qbi-p4vv2x!iR^^~aSQw6XsaKM-$>Uzx)iEpsir42RuQI3%H3};Y> z0Uno2c+k-tszf<UKWU;vjCflkBBHuaBl7|c)cc^@B}rsny9n-1dg)2O{-&W6D><5` zx20&nf!I}rMD;c~etAW3LNy|DpNH^m{24t5;K&uHjG6x~(yni7ReFPxEtPDTjx2uZ z=2E&u>J>UNqP7H)<iLa2C*L9LQqe=2^Cx7&yY3%plWi#$NF*#^``aR%%eCc`?T3v{ zOzsI%#YDb9k@|k(0`8PI=YCM~e9>Gnis)#3KuTz+xm7~oS7~q4v(|^BlF{16E}d`| zF-akGjG!E#6HzK@BP#w{fDdsTUyd`$MGayTNfLiM#&nwJ$5ckv5hk8aieH0QriC6{ zRX2V%`m$>xDIP%n^K(sfMh*^vN0euv(@x<x%E}9vQ$ZE1h&SEntlOy%p5=)tULn$s z%5)eaJBq+_o4#mr52nKA+HW(f-;1%0B#vhC5m^doO9K@8O(|Le`qA}aDry7!2081H zHBr`LH6dTsS`Ff~O88EkpU{%GziQmS%)+;<dQ@)`7w@ab%8*ah^^brQ3?OEYT_NSW zqa!VWP*d<k7L0)H2^ohhstS6&KJ|SlHCb9QJtb24V+dEq=dJQImbc_H<O_sDwpvg# zCzCiVJ7{zG^&)q92&;K!LfnP++xNRgYv=B$h(iIl$=~PYyPa}<YU%Nq@(dwgH*Nn6 z9tz0~K(oO`6`e`v=T=>qzMde_oE61w$r**C?v^S-ZHq?sf4|k(PW092NR@`N3hwao zE_R=Y7(G+#m|PTlhtspSCJT{1Y0%ec#4(jzVpjP>Wmq5qWJaJ38fyi2#G@p=`e)37 z=6mSa$$Ko=ahiiA_IAw81lvH=ID|TcE|DPu3&ae(RS^-B2aMj<2nOF1mx)H|W2H># zC;&3V2BpOTCHa{$dxzzn>7^+^B~YN2?Ct$#kl||{Q(=Qc!&-KxIQj+3q&LFJGPt_| z4kL-Z3D_2)gZ+~$@Q9>gw20fj!bX?nukc&n>f+DIFHyqL)X2%fZK6vfCyps0{6Hpq zOV*=bRmU8OkE7t>aAoj%&KkBa1&xr$CelIWOb}YiHS?ZUC`PW~V>Nv0TLOZ2XsdYc zJ=E%NJ$>0pcFoqKHHqQVl8=PC&KDf!1}|exaLYdW)%Y{)#6s@*lLj5xxdi@<Z9!&a z`55)4-O1N30E&hpyH81a>X}!n!C;Z+NnPUFQ~?p{t1X*#^KR3dhJcH}zCa0d7|e)# zdJBB7i2w>Z62v;65g!0=(|2FozG?KqSMUr%TlA46k>^03+N|P+4tV}jnGdh)Ng5C@ z60Urdzv<e<ALql;#uT`6WUxqxbxbWoIY%dvKHc7x<budnUi)vK*W4x);cB;{XuaWn z{n>y8a_H-TQ=vC4zU)|FG;x<W0-oWs@)nz5WjF05UyvS?W%SF8`&alvH8Y7LWbSbI z^?EhuF9X0zlPg4CDQ3Z&^^TY|4h>e5K65rT4+TG$Zx<_R=fsKF&vwnvm|SJn`2xxz znH8Zh1NDkMi&*d<gjB<0a%`~&zg;gKZE#KoOR9Vs(qH^&UX!OA+Cpo*U~E)b*xt~V z?;5IrWy+4rC3o-@5a!;RnYamcBAzq*T9zs#ppcim@8Sa*Gc-SKfX3$AW(P4UOx~N2 zA726}tR)d}VlZE~X&M_qa1kTiKvZjvoFFf7&v4+UHC2Tj>5F^VuyF}(%$s_$pf>P_ zhD<asR8Wh}(qdqUh%TceJd}SD-f8iJ`<gpj95!zuCl?#lzvxR%zD~%7M7r?RD!7i; zvQm##B!UsMoB0)dn94{#64@8*GY<x89XXWi02!)krk>8KGm<JHoFgG2NnuVS65(kN zff~&ZFdA5l!7+%$3s!k#Q8R(MGfvRs$OqzcD6wegd*S0hV00z%v;}<_POI7F<E($8 z<I#sPGj57LC>Xteg9ZT*tjl3J88%sjxd~xF7$9-{TC>H-(~cw>`#BQ(2Ll&^M0a!` z)a$|^jvX~3<&W0s-hlywdgqrFv2*BEISLSljzi`r?_rLr?1eXyA~wzQ+z7cy;c`tv z*qFqkM1H<jhF1FWAvjm#OR@9YhWK{48|gW&-B**G6MN)LHDl_>TVa)~lH%yEiG^jU zgVunnd!efzP_R+YT+s69bloY)YUB53`0rk=*9QtOdl4!J>9cq?H*oOBzw`JhnnOz} zIeYvLY3AfTQF_BM+E^li$a;<|W`X^xJy8Zg)LT5NKt$N1u-Ng?*)IBZ5#XSr<c3nK zY*P2Ru`z6bB42Y)oSO7G?p5JH9dTu5yO}>Z-7aylW?_kKqWpZ8j@tolVt4OwH~B2= zNfv5i2FP5iH(xUH^-fit07?`_E);_XKr8>Hp?8*<{9WKpy&w=W9SSixX+aS$^EIL8 z25uMZPM^KVa)A$Np=8VYRVqC_F^BU)w6YYh0#S2>b#^rnSQyKNp%YMion@S~P0&6f zxc6m{mO71a3iw*1JXsS>zNZ~t4Gp>X#`$Wscs`hYoP@lv?ue%={wPlB_U`L>g#rPN zNEDOq38XLE*du18ZvJkVpps3_kj!_$-kl~Ko*7V2L5~E=j`F%Ey&fiU1r}2nu85>I z)KXfBC$q`+d}JO+*QPSCqtVqPp#FkvOOM66tD)~wlh~4r6p-ynb=Lh6nTy<d7X_8j zX>G&@k&$Pzo+wPzfQoL!-e$pQfz*N}Cn5_%1COww{&QORl*}vMZ;}BDT$yu?x)Wv) zDkyEPi#nLht#R14OWqQ&FqOc3CmeB+YVxd&nJU&^dtP!eeMxO7#(JB!C1L<!4P*C! z<mpY&Ku=mj5u>vY>qhX5g%7SrAu&6K?9%NJa?UB1`zgB<<z#sPW{;Gz+%s~kjyX`- zUE=|RJCrqFv)<AoT_UfqAS9iyxky`ZWs)BsX`1~A9cB})pXr)b{k5rlFMM2Z<VT?J z2O37UEjK`{Hqlr8U8AFqT+%LtGa|fsfrq2=0Uz*wZW5H%Ig;C=uCK-a=$@lQc&*?H zeD%K24`<U=9tj2#0U|StaR*OVnmwc~F{dQ(qWub%2XW)n%JQw|hd$$w2&XqWSg#oG zLfvvR@EXQBRF~@J0!J)xE8!5-X}JVECaoCDlEdhu2Th=c%|{h*-|4Q3Xm+>bQ(+3e zrY1+bzp5uSG>U=9pH4{u1Y{JE|6nQ)<;Fo+A_YRL$UPb!gfbqfHH+){6&y>CDP(jX zQbxW&FKAwBO>b>1XJ21c$92!bu;s>ITHuI<q{L$`kaE01H-mD^B8I3b0m`ElB7Ve! zixN5Td~d`}$C&<#lq?u!JY~C7wkY)&`tf2?ijNYJuh0^X!gBPPWhYozPxc1(RmX0F z2U=S_2Ioh5Wr$L~kdZ8%ljeGJx)cEG#COpN?_Jt@7U4RI=>~oIPs&(r#^dS+OHt9Z z>fw|=>4Uoj5F(+se4Ks+OR!lOu?n{4q%P+Na~Q6Jm@W}HCKgQ5yKIz-=9Ku)J0buy z;Y0|CPzgy`R5nAvHayuDR8kAHQ5Tia_-;dBBmSj_TE1%b!YwXHYnNw|X(1PPlk>>O z*wpk0wJgHRwLa%m-on8?0%UbNJ_(4)J1}@xMTXfx_;o>`VJfy>H%cS@Iy+XlUgA(I z`uxMYZF*%Wk29-=MzL_otq)$YkOH>-ldC_WR*a~{U4H6Hk8bkeuZi{0^(CgWZc|K_ zn<C-R8l;Co*eftlV?Oz&`C0Fm!SLX9T+!kUOOMq1C4Qo9nQ6XYP;V@Q4`S7?`H?q> z<@iZ@t)Rs+b5}p|u#Z8>0Zx#-Ti0PF1@grwAc~fr(LsPV`z>`+m|P(;>He%MV(D%% znTYY1#S3)xS5!_=$~@z02j6y65XspIEoK|B#V(wr_sc5%cO&w?FD({#ehcg+W|tf9 z(dh6@JssbJD3lf0d$e!+;T~t9?h<903d{IDV(=qrWJO7PqjcbKP;y3!%gO0v5#BrB zaQ%9Hg=fwzN{?B^rWGYmChs804~i;W+>CL_iUox^DfNZoH1EzFY(&2JeX5Y^z)|*Z ziw{yAy=;C~OP}U+e4N|kVaidhJRHZj7s7U{4hU8RSbPiLLdB4#<E??|fG^*ex7;W? z8HyIlG3b?_;rae022CN!uQ+Fr(80)W(|x#qC}%I<nI1D!MITdU5JLm8`wR4J9!+iP z1*^ib{d<{x?E>ldfttOs#uDs^h@qu^O^va}Wb5AiXm1OLFwhZ311x$OnLTC6!z(gB ztcd4srkFqs1?Q_>>XM0#l~8wES;r_zsfM`g>9Lzi58&KSiHfMZ;ycAls!-sZcm_`) zr%hsWY9Rp?@?9Gqe(<q=(T#|I>6nrA;rosU6=x?%yIdJVNN<c}K}$m8D>fC+(_snq z$=aB$zXGn>{7ZvHL1B`@H+wa9DaKdpD30Nkg<Xl^6rZ8>8nybAbv$Me3rGB3ZP;Fr zRoMXXx1#{B?_vkDHglXP=hHOl*_ikwW$u@$sB&AQPKz1W^@=Ahb1u)8jXm4xUkgJK z1Dh<O_AWiCISAi>F#Os7yqA>q@^*T>L&B5Smw%scV)6i4wDXXtSr7jr3`ZSEW94f3 z;a<7{w{XZifDRsGR|y@oayo?#k4EL6LM1v#BA!gcU3mb!kyaAiJAOa>16#ue=oG-{ zmR{e@tGqSa$Usgpi|mp2*$_wLh;gji46z;GpM%0REbR@_$IfsDJt+k2(fayLl)?;Q zn!()LOYHgpL2ZxKGBu<tEQchK-l^Oay1IVG^89N>?{uv?`{=Gj^oTqOla-<s9ejHv z<DpaGw-gpSQD(Y4QNqg_{Xw{^=Bb)MVUlWL$?Jm;dDlM|`h0D(_nll}=w&NhU<N(v zup>Ua%+v5QvnEi7n7d>^Y%JKzG*7}>D}GfSC~8;y^7a8$Lxju83|DhGyF`xpQ-CRC zoyt)V2LaB09A_`RT?8NciL~eOGZYk>3!NnP54}5ak0wRIyW)a#m!vHb4Y6X>M1692 zj6QMiX%{kU_Cd3=rF}}@bJve9HY+8A5AT?i{S#xxY7gZhO2chv9c~6-V&5Z9rDT8r z-0z>>LaqhX5VDH80c8Wf<k3?{;OdXaAhVM)Y!(!q?1j}sKkyYLh-MlON}>B{Xa-%A zCu7AYPz@cjqf05STvhjmneWs~etw=K9zP>lRZ^mC_~!Yb3p915-J%d2Yp@E$uqC&g z+fRBW1AK185e~)>Rc%%=HqUvd<^=BSjvlNmp)4)5q<Y<quAvfSV9U7QLSD!za+VPa z2lk?$oYfBr2@V7U`b7x}#9|EBXprjnO5t$ogJQWRD@?DaJ=%qBUlwMZOJED!_I3R} zDPF;(L<adtDxX8x2GAlwX{W>%H>|OJ{=mPXPR}3YRL(@k&IUA$+_t)CuzadyOo%j{ z8kS}T`dsxBx;_?L^hsNLo5!ia?`Z-GD7-KRoa!T#dfoz}bCAURib|l~(@<PT#cH_5 z6?9lyFamlgqZP3>dbYkF2%BHqe?Mp9EP_GHiVn$?Xhl1wea@k%uc_clUgxt84y7$z znGax$6Vir*I{=)W@9&Ob1mgmbCDq<o={0-QH*3B>TuZ1Id2J|um{&9o<MC+(c!NUf zc{tnwTpD!}bMS!A8^ubve`h@eH(U*vr$#)?G@KW;t7$UobaI>BrXH{0p*$hnjw%&l zOGz$D<qCnqzG~&_b%AuZ)H^2n(EHg6gwL`urufa>U{1{XbR=cJM%&56<pXwxYmJt5 zHpywNg}<Wg=~*2PbWyMZVq?8~Z(pz=T$oOS`N_^$j}VbS^_fqwsaiQY<YpZxQ2uj3 zhzusiW1DbTxhI?7<R>?V0Fun{u<5YIEy?do3z#I+Y9+St0f$l{+aHfhzJ&Tm?!ya= zOGyTd%7vF?XrpUM!a|7-p3eeEtD$n0bLPk`B`hLf!m0U9K4@EsdD~`L1)cZR=(hG1 zp(*jYR@<w+k-NW#R82sEtk!IAZ+9c!jQ;xYjx&VRClThX?~MnKy;(8aG`{3Od4P>J z3}Z!LC$RDdoU&XChR!nWyDb3j38Ua)dvt%;Xv5RiLE&fo@w^EdZVsZc@12wAGkEyE z);Cb>xpdg5#bdb*8I@2UOCFkbd)_)qH67LC&6G$`dW8Z-Nu1kU!!%#VMGueheUsEm zEJL>226edkuufhBF&r!eiI`<Qhp%lmT#Ndp6DvZw5Q6j&xoHtil}Y8*<+es;r-#j_ z43+u6K@-^`g{e-f<RK*bC7oY3JVSlmeQr&WxdZ}VJid{Rde-B&PZVq{UL3)~7b>G+ zDUz3FqKqi_WtGu9I$o#<&d|l06H3g(>r7$td2LyYPOnMoB*{B^AfBvSS9cso$w1Z2 zzdtIOg?B)$U#C#JURo11+%7lXX5QSTQWNU^CgW)^h{Z1320NoM5ys?|rxrJR^*j#` zk+%$-D&LhkDKtiLIY-ZSB$wa$f&mND|6Yx>TTVz7(D7wexDm5f8>Iy2l!{bNk|)K5 zc>uc-lzEj6?Hj_F|8eLk_Ys+Eo7$Jt{H<yIjO3(6t$C-3`e6wJ;3IMl9qfVgF!Llw z(y(Mp$`Z0pu>3OM5|3z9u1oVGIBu>_Z#xK}6z-a}H&a^O9dRWOgn|}@RJD+Pr3TB6 zu_kIH_jc#n(?}EJWWL12RE}>PKT{H(RKjz%ur3z8hlTNDzg5H_V(F`L+A-imiEV_9 zrgG`EiOw~>nIUX|Xgn!`w5%^#Nj_u|UjPzQl$|JqWZif!ynZ~KMDgC)Gq5CBbt;$C zMYVeAjY#&9;6)}UEz_$bQ91Rw>UmaimuSUm(Jv0R&?4}o13bf(i}`zSj0sn~0fG7p zx+>JTitF9DMg%kw^Nq0ZsGrBL>Yjy3xK3t`EPTkhm~*!;ukCw=vnH}fR*;Znpx|&* zu4m>?T`<uQ-ir$eFZOCsSKgTe-ju0Z*m<0zr)W)n?Q@BXeePlFSBgs5ByL%Y`x?ld zkRB0J-~3R_+LNh|b{5b&)<;2o&*#gGRBWGZ*(FP$Ty!J(Md*eV{~n(|FIMj|Cu3}6 z7~&9t9g0%CD=j&{4Ut#8D(NC8xJ`LrV$@9()qjkVh5Y_ufR}IW{Y9VRQ4NY{0Xd}f zqU?x7O?(ME&xS?dbKW=R>ntq2{ta0?)mOUy07n;84~WCT{xgI3B04W3DC3cCxJ5{L za6SdRgf(aw2V(m!MFqOC&``_)hV_H});TBmr0dtN*%kIU9Yo3RbLNoyi2-o0Ueit_ z{(SxYDVccT)#~vA|IL)kBN-)aW{SqB>$@TVm2&M{&k1d5NuMcKU>54<Icy|v&@rQa zf-+Iqu$p(qlq?(*)YAlFxtH~ZMd!Zbwq^c$UD`CScPow#5^7##ueppiEb}1KtuVY5 zTI5!7WPEQCMM%o0QZ=QT!UL4MJw*QbPZS(c(Gj6DWypoFrZPrU&>!xPJfv|p^6!|_ zGDINP;Q~UXzwV>LgaZTkhxv2^Itn<=c}Px2KUidEzx9m`%eQau+zfU)>mHnPNBk1; z#55nQSYmL5rwAu~9Kl@FMlG7{eq8T&KO(+9DL|xCa?_fBhDQ=V%ZKY9$vzdc{dJ=u z9}2_7Yp`$WJ1O3^aG&X3fBJ?mk>6Y`za>xR<JWNZ)x5f|r&d?85glQ8^OJalk>cNk z??QwRCEn#%azelHr4enjgILXOXn8MfId<$Vf4#U$RI|h0z;Q@HE;7twe=pcSbz9{U zM#Zu={t1=k%hIb-EKZDi-7CQ**Us;@2Ax=pgh8$WG2W_K6DmQ=vJzcZQMXJ~c<T9u zt{g%~wChf~fXt;)vz-zBb-}heDJ#)*6jE|CF96*62F6!R9$?d;kY%4dr;0@gjU<h2 zdJR(}H8oJJ_0HNvGK#{;ys%&QxLWbB^`*GF`spS#5#qM%&c7+Iil`M00DuUw6cbaH z5fl5z`wQT=7BYO}1*H3g3BMYt6{_lDeka}fkn8%Hlzyv3gH|+DnW6sZt<xb6ho!Wx zJ|XmcP%uf91}u)b0g*nm$T`%P(NUR63E4*@RSUH39!H_IRqvG!s1UPIOU-efoI_6b zO!<h#l`>q9&;W=KG%;nfWL6p(I*-_D@1H-taQ1c9_MZujIqg}yY0$^n`YO=uQI+iH z5XT<AplK#(Y&mbSeq@q<9CZD<%RMF$4xNR^%6{m%1y`&6{as;{&d^LmaYTMuky_^m zSDoGVuR7&3IuBWop}FmypGREND5T$^$$cOd6(IttD~n}lW?~{(E-88Z3@7RmXA0E^ zv49WT@JOGxVPAsRS9L>&UUSnW0=$fD9w=a5xdm$WHFm|>wz)$7%noGe*skUZOjVj9 zAY$}-b!`uYGf$+j2*u<ckV_-R1(Ld)#)OC7c#7_%gGF3}?BQ%``XQ)D5`gHM)Cz%& z95_i1s`hSgt8Q!ZAFqFSfM70jiVnV9zX1SHg)G7ElV~f*15NC0nT$>C-+`DsY#qSw zn*ad(LLLsrCe|Pq(sv+pOFIGbv$igBQcF_-axG2;76k_}kcFkRmlH_MOHtj#%i4t3 zlw3#<p5Frq2CxOW7?XO~+SoY*Jp{;q;{w6I{~Bf{C;d(0Vl6<ft)NUQX72<d<zV7q zVqui<uykW17lbF}cQQ2ts)|eg2?2f*Ah&RFaR4$iySuwHxwA9bJDD@H^78UBv#>F< zu`z-v7@a-sT#P*!?VKroLHvOs4steevUG5<w6`Pug=zfG-ql5boE$t)`X@Me)<nVs zJoqPrU(dhcon1_sWxx*{;QfFJnAuoZco<pO7}<E4|GpkPtDx}LYCGpYwFuTHvxl(* zGb<Adv#ssFtZ;UbaQi2}f4jn29sF7kvnt5h-qpzjB;f|KbD{V<QwJMY=fCrGbq4(! z`YpGOsTng^sNbCbzD7z$LHVyWztm`MY3uNN#V_i=Q<|FmMd#q^Wb>QG)Pxyi1F{7R z;tWP+{TKRQuOI!j;$QajYv#WQ;$ms`zajrM^Iyop(*1kzf2jAj=)cVX6t_2V{UxJ} zxB&UD?Ey{gO)O1;zkg+AdB?@d#>vIV&I9%s4o(hE#&?{&9E?2d#;nFXoSg5tx!L~) zC1dC8Vr*vu`UM3BXR-w2uyJvlalYd;X5=>GHfH2t0r4>MaPWc{&3Md=Ia%4bS&Ts@ ze}hnRvIGZ?vCZG5`UPbQhGH@1;o#(9V`t=K<z->yVCOYu<Yi;yWn|@K;bdWDVdrAu z{6m^wW&?^S%LtIOF|qsx|2?8?W9(vP?_?`Lu3&6Js-*VM8FforkeZ9}FRih1v9fdU zu(R^8vU0MqaPj_=NE77b3=WE4psXxRtQ@~*Oih52U`S)Ib6VOOn}e7g?96{p{4yg@ z%-+V{Ne!G5Kw#j14l7%FfNZqI!A$M`Km_ypL-OCNeoyQCeVT=b>-Xwk#s-2_1U8rP zuK@iA>hJMiu5aV|Ygoh15-bnf?<HX60mYm^#xC|w>h|_F0_49`LHcV8zeAps|Ic6s z%G;a##{5kTGX0eg{>%uX#^%hwANiU8JL3O>q-J67ZukEV=bxm1p@=xSxZ68fD>*5> zvjUm8{P#Hjj`%MmRd6nLc5(8Q`9Eyx|3Sz9M|?<w*V;RI{*AvH$nlS-KN6;m<!@Dy zlKxIoKx30XEaPnK1~UC^0<a$cm@=_2wlfETtHGbC;2-0b|0ZtCSdCeD*x#8la<lQ6 zGIFqiJ^r2PJ8niE9!|4&9BiELxc>CbztElS&0O4#oj@YyVD|vq863;M?MzDhhr84L zt1#{spkKbs!p8b5L$h+JvvL4AxPWY|3@ofb78de9Ois$r{HqB3W6S)%(xid{@b60D z|CL68GQYfE&DFud#uDW8ugdy|^Zak<{<i*4NBuu7|2x?qtHtacJi(d6!bQp5?!RUK zZwUWDkhe4eN2C3JC;Hz>{!q)`Y9(0aKgPf{7+lhs|ElSKy2`I;`oH-3(*^%8asWgB zhspm)zyDF!f7JCq(!l?S_&?tDA9ekYH1Izn{*QP4f2J<@f8Gj!?7+>RJNV51(}EKk zd|v?bPEJZ3@B**~0Ne|;*}x;O9i(-f0RRMyUq29lv<zJEAgqgwf&}a?Bq|aUW=o)z z4fu~*05akt>K;qqSG|2!K$*8Mx2~h|$O==}^5gY|8M1+*j0;W{Xosp;uUJcz=OnbW z(Okwo*1gx4bG#Y83$6siw|(~Ndj{B_nPH(}+8Gq)VCE+49t4Vw7b?i47s;fV#m?V6 zY(HcUjhH4}vskKm2$00_CydB<US%GGNA=HIs>Z1xz@q*C_Y<(qAPTk;_!IDP2&e1k z*Xd%VY`<9v9D{n3(KJpO-B-USHw?^rLteimw}=ToaGLZ-Ggv0|nOH#no^xP3_b+2G zP<^42nUfxq<Dx&C!YA<*W~^6!d86=~0-y-PR61Zw3FjACb&pob<?sdz@t_(|L>+ zE8$2T4Mvz67l~4aD^HGEF@q;b^N55D^*0UfrJ~T&wQ)j0^v)Dp<RAk*GfrabqUY*q zS6<S+6x<);g|**Z?VD4|;Ne+gQsNsrF*UDAy6{!b2>r!KAzM%&{(%Y?0y7#efs&%S zByat0%>7-x`Z`?TZ$8~0<|igT49@`)KIzjFqEX5yO3I|h5OBxl7T!z#gAKn)v=(R* zE(hL|;G;W}HdAMQz6mnpEcc&m98^>8zF78q4w-4eId4YfNIN`5F?aqn)-AOU5&q3( zqd-|t@1cM)6ivDM?9k<2_3u+Gb}P-))|8;$!?%XiFZUk&eu9-Vf5Qg49syI|>UdaF zg?{TZmx2`N{Mnsfulm;xWQ>Os=|&?%;^SUNikNG`)k&u5O?x_<m{90Qky!i+K>z?O zBCCm{Inz*$F|KJai!`-1rw!P$Xu4$_e{JI6^i**#RCw{MC0-;UQL&i8vUKVnT9V0a zY2lqd7FGLsoGTU{HmO>O2KhUJ0zUS>*jQell(GyDQsbAd$Qpk}J4`jt!V{58`iK4$ z;p1U<#&rdmaPCcYFrH5fP1$&plj#{{|M0-IV>b6!`7+<13~yJQ<8-?GIu_g9t9iGh z*+<4Q`D|@%D_3ib#R}Tm_!8u)DKs=R;??P~6be-*EjaMyil=K^ZVnHQepu`xAf0#{ zuIsTr9=*0z+rj#%78?D|sVoumql&z$x*?hj8eXb?j`0p<Ayr}TnG7D)Zqf%eQOVab zj(A@|iOSUNBlL&pva+(7cUP&0+}QTRwA#X}QpAICa*BSOoSZ!<5^=+KZwuty-ETd{ z4yF+Q@NwM8CyldUVY9gkoubOhQEK$pZT>IM($?12GrTy*r>9lX1KS#F4@ahKIuBb> z%yWGEk}GbSMVE6|D7JWqZT1y$tw7J14;+`djQLI3+|-ML?&ACAJL(iPL!l7SXNP2b zw^cUd+!eD|k%xtNLRp<wGbJkNn$?EB2c|xxIEEgZeC2B|!#rTeq)Yvde!+woY9{3U z!^nQ6`GUj){-$4=^q2j+1KMvT6HZ(9iR)|@*($Ybd*^0nQ<Iai(}zsS$65yWM$=8^ zmb9rqmL7cnUNL6MHalecxvH(r+k^TeUWeUkYi+9hULx3TRPoXo_;CZ{vXtog2}1>Y zbH&@$t|;YBV?(^f^3?ett>|UX6U&Qzv(vNI7QwwBR#xM;+wBEq=M1LRXLpNW%^zlc z6BH=rY_4d#HW>+f&DGZ396wG1WZis;<xb$RFNiX7h+OBZTsz^hmv=fo(7n|yJ&Czq zz1@2;Bynz`lWS3Vb0>ttA>ViHzbK|BS)Ew$n$zyvBkPIWF@>jP@+@AJo;iK)xUKGI zjVaB;cdkZ19-#fZJTA7p2?z+bX}-1ay!#T-R58iZk_Djke$4pP+S*!l9xd>w2KP%- zEFqxN4?~K238wSaM)p(^=<mhr%gf8j@nbZ_^CyqQ$yK&9%0H^xN8>fvE;mjl^vmGy zXQXd*kT6&#I@{G3s4Q2nZ(jAjH+0pidfILN30?fN<BFz8D}$4(#ZI^Wcr8e|ZwH!S zlQ#WPg_Db(*$8uo5W@QMv~Q<3Cacmk$o96uz&h%gOK68RL9VmyVUUZOnV`}4r*>tM zqQ6-YwNjSPaU>Q4u^=At0224g`N>Phc^~u6SW7$VC~qmdl|Rc?`l(vG>h+(|7d+x^ z|2a?r?2tR%fl!mul<3x$mZd<44dGF6Bp<1k&J4P0Rg*AO%Q&SmRbLESWH{q9Tjmu2 z^%%1ewAn;%aJBlam>XxNL_C*;k{^a+rv_gPBt;@jWUrNdtIzsDFr9HLZn8GZRQG34 zIQ)L=53I|>5LU-OA-vWO&x>t-sy`+HBZ=D&x803gQj_%EaUVmB^&P$ahSoeEn!27& zV8idPEDxs&v;9qX@===Qd8`-+ICO_VlmxTRd+EAg7?kYgVWGg52~d5yYu_*f`+xk? z!|gz$&7x}RkZBnTA&;{A`9=@g!|fT#{NyC7=kh?4l9r^oOd4hwkIAmL)wgD5+^6x! znEBB4Vysom_Lm&0<@e(#0`QVeDeYBV%xHMc&ro53R-4y+3DiP6JcvwuUV}u>>pMl3 zyWxaijin6R7}RDAYtQEvAKoBOM&BcKz`)1Hb~}=MFjiRb6STpZZWDO<>ifWFf=@tV zXJaFeyt{7(0_`H}+-+^AcZ?Kr#%k64nM>Qtcfz^r%tk*mcRf120ecl8kHg!AWJbLs z%9x{r1Kjn+MNca!sex2JyA@uk*P~8~u6H*QF2$3dzmI$Ooh_c5iBD$sKb(4yD40JD z5<B$V=A+;|8n3vYZG1&MGGW+5wtu;A&qgQH=&?0Oy=|J$+&wXWUsK%$sA>M`*yV0Q zCDAKP`H)h!)8{%6^v&n+MDTh-Y+qWJJu!Rx%>U)#wwZICy`^_z)4i}aUNI>|*q7|p zuZqt?i5bof&c>6KdQF=B+ZSc(^ctUrOeHG}+T8TnQZrUoR|T#%dV=d-EF^Egc<-HN zR@xNLN#8r?gBCTivp(4krqjP0M=n+ib+ybmZj)x2_*NSx>Pe>io`uFZX32E6Dq_jh zMOpPz2C~dia-s`eAtlvkz0YVeDiXv?Y+kqi{&ZaBcVPngnA0h4=1S#FcI}r%-n((+ zb($SfD&buy1Y9=P%0h_X@9Kmdz4wUqSkkO9X{;^(D8aFvN(5E7vokZM<|8S_M&2h4 z(&pyop#{U>oc0|owd?BYDmbC-{FJ9=znj%E5}?Rb%qEE&VCHu@P?pfr`jkA%`?I%_ zT^Hv-DQ0D<)_y!Y#n92!d|4Hwu6^4t`{U_ySenURd|)$-XHJ@F)*F~~8HL0bOLsr% zuaNU4nnYpUB6^YZkkMqsZGVMHhOs}T(FM4Am=UF=q0w@G@5OD>k9Zqgt6-QA$Dd<T z@g1|m%j|SqfFZF(Z13uDIS(u!g^};gtel_!;nK@VyX1m}HX)E|+lPr`D3!-?D;C_e zARqRzIPDAu_aG=&d3YN04_q}XVTQqgjkjjfyU{Pr23Ao7B8edX<^6HB79s&x#pUiN zBjRLf%A={n>%m}Hlq{!%iCj7Z1A}6!k3-Jj!Ie)&el2sn#V)`~-iG%-xpCYX)6LpW zN2^{njLxkHFycQGhw%*PHuG>dQ0aFJg-O^sOZY!9Q0rHC0F@o%2A%yjaJ?p=GKDnh zJUdP@+@zNnEk6|qY|ir~{E)G#n?2%rdY=mZThewqEYBSN`2KLA$IWk9X&2M`SV%>o zAgIa5R$(TJC(E6xGJD@+z4y63xPBK=Ml=2!7v;!1O7q`3$4sSoQy+%-V)rnA?bHDh zR4ff{VZYTkG%Sjf8)Li|=g3slqC|f`?7=Ts(bm>B$ICtCEoAoa;{<~}b>!Lw=<7wF z)XI`1s~}&fDqB45G<KL2YW+FXG5AnbVp`S4a5O=6b2NU2if$3M3b}P?d5Y7>PQYT^ z*VX9jwe5-9QJVY6f`)Bl*`1oVPZj&>RT6{y_t;uKn^AxOxhUziNzRpD4!$Urmee=w zYpx^f_Yb~v2i%cIpifgknRLa6#ri$Zt36jPPEHWAc^3gbK7DfbRK2R9a~*?)j4>dQ zv4$`{dxqm8bG6M~3HNBgcy~By_UdIkNNjPoN59DYrsextJnSH!Y_7_$EXg*!LS}My z+j`MYa55NAaq{Io21PhBQ6v$MLyqcHjh3M&$OD*JrBpn<4X%9D;7G<}u>Y=&7h42& zqq`8}HE-XOtr-L@`KT94?lNkEh#jS1{E+TmZ01>8crTPSq?&s*kpV6~)d85Urs9gD zsWHN_r`wwa8<6%ijnVVj9fLwDge3fpJk?<b(FQHp_*GTdhn`HI5Oo+Xskxx@59Ob^ zqOwWmEIR0~yNaI<W{SbZiM!gUt8>20P-&gR>2V9q)|xVAJT}icmE}BU$XtuRPUSBB zc9rAlVg2R#N3I|4T(yxA>+$;d`!-W06$|U&ALC)d3Eyj#>b%D@d%;@h_Lkd2POXl$ z=1BP7XuF(Os$P~?S6A1XpP$b}92d9N=6?3Y1t=hpB%68FA+c(2<SV<ppES3yLUW8o zk87#6LN^kMd)HtWt6J^FrHa~)*)`4FaIaE|D&EnTASeX|63cq4n`|01DWIliaC_4> zUYqBA1uaDIiLR9--CYRygQ~SoP2wIg^?)pw1S<AbBoZpnRF;4L5^~;f-`@|{dS^GN zaMjsl+oyUyKBiGLF6;K2^E?gu`y+1bF3)i1))9Qmd!=H_W6tHEE+nbvK^V0+REO>R zW1bFA_cu-1hyy*|B$GxdiBaDchDis9Lxm?vD;jUTt)t0a(f7&`{tEeq-cofmnMttM zXf-x8%-XHBd%DmkrOnLFy7s^DG<E!#v#jK%uVl~EDooTO>ANMtzQ!WOTwnVU9rD_0 zX$On?basfZ!q9@G>GsK8HL5R0&|d5MXOumk^237m=8>M%N?3T^Q`WJ<MJMvi@=%zQ zZ>&dN&YRd=SYM85EQGPI(rZ`6;?fx;@32F<7x#tb1@+E(+fHmJ)7pwttGw%sm3kV< zduY>Am6VJ+T#x5&GsUY<H2p27s@l#_56ZXkDPm$``19kw|Bmahk#s+bp%v$G0Tmf6 zMn=YlHn$V}2J`W(p|kd@u|+-mg&%%YoLY*-GK-EBPwh~|IeQ9SL>+#jNCZeim1ouu zZaJ{Pb3dqV6&iqwXQ8(w-IxKd)VzVaK}BsXt1sJ=5YNqw+Ui`~ciI&4Pvr>eRQ}sz zVGEmc@?O=Mzv^GN<EKnFPUGGXX=i6=ker;Ht(MmO!LM*Cb3Sc9Jw27fc>g6-Nq_aC zyrqxNUX%Wyej&0wjiu_=;$vUtnDfkZ;3Yf_j*pg5uIlrV=4&Di1;Qda2p-MF-l0V= z1NLnGQGMr8&ii8j`{IwbM~SJdCSl&kM~p3KDr38$!bz7}6*}s*@4iNINOdSDQiCND zZZR!3LIS7rM)$KdV{p>W|8cf1R9abi^1Z66N)BAj9t>03E?q)ZhCk0qmU2FBM-*%( zFr8rqym9r6!opFq{17zB$;G!z@4Q3ef-V0IKZjt4jp|vmXI(GfP_0B?`GrOcfzqFM zZ^~U6C_k+50thg{!dA}Kn8aKE43e9@?Y!+!lDU5#x;`t)%Ok&C(zEjVzSiN*2;0j2 z90Sfpw;3ZuY+82On2U|Jdg`jP{)UTIlJl*D9Luh;?UKXghK7B+9I{i=o-r<l4GBkm zDesyK;AN6FZ!IQVwNzDy@u{d>2TQ~>Pd+a(=L>wcim$gnx};l{iY08h8etz_5dv2` zF%-d{Z*|375|rHFHPzJAT*k8mG>C|ZT+_Mj1*wu`NBKR@H&&ovk@ctM=G@i-p<s_R z^_$L4EgO%)uCC!b0^K9kDsH?3VbzZreLdtqkXGp#Z^T~og>4@ShDt(2p&FD13m5OT zs&sbN*{nH=Hv6TP-XJR6{S*+Zu_oRBIKMX(r!>**xZUYIK;*vS`f$=ztQZ!~W<EyP z<<)Z*JTFgx9Xtlk0mIqPb*Z!IT(+_f6W%Wf;5!TtEeji)`pU}6+Id6o$|~@+!aMSK zo^5bHV*Yd<{BS!~dHiTn2-a0uoU6`>AzA2*ci|_}92Q@!*A0u1IjokKDAcJ-OG`5~ z#(jS3Dk>M_Mt8$nhI;KD7r8ySY1u;1<=~8$2R^?P6&8YA^z@c@#>U2+!9|dHwbS>3 zaDU|*d}vdrFYHSH<gsZ|+{joG*P65KfLqSK*o$QguT?ROqJ!)#JBvn?9SGla@AsqO zr#5l_I?08f1Wa@Ib0iUg3I<$vZ82ceTBiC#r>@^cxt8zqzR=5Eu$Zsc!dD!l?^<KN zbRM=bVc))(i;*%Y++FM#+jl*=al^LXZo&cpJali2I{82QKKv-#&-V9oF*o1G1DECp zVQ=q;-8g2!^SPC!F{S<L)){;AcD8B)+kzkUvvG}a`gh#STKd0EXIJ-4-pT8X4XqQK zYf4-P@1@K6j))%ym8_F>ts9Q-SD)r$9aG=dk9=h|bU6T@!TmP!qL{p##xi*A$Fc<4 z#8h<?tgWmPC}W8D=Dx4C&D*Va3N(Tb@nx~Gu}k1HUX0_I0<X)##3Hx_`{d^0q7TlX zoO?arkOiG?LK+KC=*sUc)}%8jeA4anjpfl!?Y)<dzWUz8bvE<09`wvpsJZ#tD6K<8 z!59h*Xnw<~m`LoXK4<#`w|0PI(=>yA;CsN?O1+E+>`fDemMhqgp<YU^y1SHK_qF#O z0ZGxzq-F`9XCaxm|7cqD9$V*Yd0UVe^pwxS5nzHn`hZID(ol5}9QDfu3qKj&cNP^D z&5GUR>bot1p6{;wGQIWh$Uaa$4OC5XW_#w{pu%?Cb}@lNlg#AqayMRz#Mece5<PVS zd~UK|@APeItgqLveb^qI10hqm#0OD1Js?0N4E!J-)ZDS{ngQQ!{S=rUK<~n8IaC(N z7qn5TNkHK3B|GgP5jN!c(1ao-AWDVa9%whNZF^MaX=CTRKiYDF?U#D~{9r`HpgO}< z2yWS3fw3;bGXcv&(ec8Ih4G+S_R2RHuiin02`7oj@lW$#PLA{IxyngMgubgy$(t;x zXecWyO92047<JhT4}Gu|mTpQ{4NK26a7$!EPXr8*0mFH+hL$&X5ZwhNF<Msxw>!P} zmP(2`-n&U!oiCf=B(W$B;g^9ZKBUjz>ijhhea?Gi9N}j08Ym=vrW>3m5Pn@|1#DN< z)=p-59hG8%FYmUR!Tq#h4d`34kl(|0n_z|f!XYPBSV?-8Vw>Esc6pW(2fJr(1ml|( zJ*NUG4jj=GRT0si8>-%{K*`V7OK0CB;%x>$;)pJ)LNiiqqHmub1Z5h^eb}Eb8=BWr z$P&~nrf+%LvQ6)eSM7krQfqyJUm}~T`{FhEO#BpSc$e4XS>Kv}TI;Q;>Hip{_PF-z zJXPT`+2T@vR#KPm7AXi4TDj_%>`N2%4KbO4fpnN57g?=ad1?C|j?}sD9~&cG_CYJp zT%upX8r$!_Wk1W?lvW^-p}PI^UDw$C?$1t9QoX{-J(7m(;I)^oH(-bO?D=ESJbzr^ zR{sQid&y&RwKuBObrY{(<RX(PO7r7YohMPCyzx29ghhESswigk+>qPbptIk;DrOzN zdbi4LqDD_okNI9aamW-iZeZ4Dnm8N53jmO^I*wsP+6UjE5fQ@kU4=6HY!=$zKQMnr zyGer~gb~>$N3mcIuS9(TKmfW~FV@n-N&K3fX3I28nrxTdHnRl0pFM7RwFLE9L}|L7 z111AF^&AM-A<X>82wc^zZmMz%b_P?nW;-tZQHYJI=Ag+a0fdDmkDzkqr!V$?SLsC< z9SrVkp8F`z;3GQ5Q;0AI1xiV3u%-_j_y!YZql5cb0jY0kX#sbJO8$=*1J#PuAN}vU zAEA_v$491wh6f+x<5xIjrYYy=gDRwSJ#d2iLcSKuVTxy6{}exI^=lgP#>o6A)Nm?J zpH;O7A58zzze<LxXidcg77!aLH^lG0W}mFIEC`xSpps+qJnw;3T5!6YTgrs;DG^^2 z$p<UH(=<3sno{-ldRi&l3w#6%JvljX2X}3mZYLFLTS9kl<uu&NCgyP%_?&jIKaF(a zAy^~qRF@@nrK#}H4^Bb|UD$8csdYvdq_lG;sP<eey7rxB)i8NK<kjqkgnMw=3*FPf z8`LamH5RG=sD%W?KJGTDu2Gpb8q_&w#R#M<JjKW9pU<c%RSJ+jyt8%wAs|U2@ifFI zn*%;mc%bNX`gl?j$7xj>c6hmfFF<v`4Vc`I?~7M0;JiJ{?|fAvWk)dIsE(Jar*wEz ztkDuru}M(1h3tOnw9bA~v@x1C)M<%9!K!$j{uAD_ux~pN4ib$3DU$V;e$e&`UgRO~ zj3$!Vk$8_0E4$oTz5UTK?HsH-8Esl!I=oK_p6`y-y1LFEuev_Foh*R{ytSfPE1}!w z_~0TPyS*sD*Ap8C<j&zEC^(Ew>}De+`kg*^CE$*18r%<c)f5)))`2TZ`qJE7ktg$t z*Dc4i>ltGY9O^c;Y+A~)xSjfVn)qtIvy{tPh5UIKvmOC84(iXmSocYK$xM~w<9w#3 z?`|Rnc#t_5cD*S5>F+UU${HIr!I0C#D4nOrF(30TH6;dSccEz(vBne~QdHSYM^4>I z_UGf@kf8t$wi`I8Oc-{HUtH1}4ZB9$LPi)qRXi<EFBLPUa@(&xf;0BW#nPw9$jB#I z%+6CBXps<MDpW`$k)~BQz3*CG_p?TwwI0*!+U05BEU)W5tD)8LJE=_r0q1MG9o*$w z)v?d_^IcUs4OX)Y;O`II!1qTa;CrQwX>e=7+2~bn@9`|Tttsuy5F}A%&{5zeQyfkp zb13*}{xwqyHAXz~62I5(db_^k(DFPtv+JrvrWpY?;+SIb5CVK;vBzv-rsH9rqL<%= zA-q_&a=ujDT%JVK^?N0stvKe^gS;0d)#q2Nb>P+%4P4oOxPm*Jdn52w1MY1<fxX3v zMzz;GQ7k@w5Lx7v!1TP$T1igORU7~vFnk`w@U&T9m3e~4*TVD|-gzgsyeG4~G&{l4 zP+EG}{N~$f#xd>&H5OsT+D}5$2%Tn!%}1lms})(g|3%YP0A;ncT@;W|IweIKq)WOR zDd|R9y1PS=lJ1a3x};mWyGy!}ZvOppzn__VXPi0b?0#ac_3W3xn6i)Dh>V;}S)6F~ z@HJEuzU%Q2fJNVfW(&TWo8#Y{4lu~Aw0b|?Z*6U*uxr=eXysys^}?&#^p^%G{A!6{ z^Zf9$#0KA$)U5-Lj|O)$+vcw2JUH|(YG&q<)bjXxAc}l5BI-I!i}zJ~MXSf5ku@7D z>j(96JwbaAqLc&gkX~grk;l+<F|CONhfFYfwA5I$J3q8+lpkgkc^s0iV&pzt*g~Y+ zXCIG>4i(Y2=K}Uv5m&<2V}@#<?%jFaAGycOT;_w?y}jDf<f~BK`@hcq%?#cTGu{s^ zWyJS)%5zt|^)v1%?jyFg8!ws%6=?rxmXjF%{S%Tg4~Vd1P5h?a-&m*g)G=xH^;|j} zyPhlii=U)lwDpnmuL26?I2gdBa@wt44|l-&r3I~c=yj4`yfv{S)EpB81TH1RcCI8p z-cty#`{f7X!MmIJnHKi_*5<R7nflnUl4xh!x8~%^{f$;h!v)O_e>j$26GREgz~R4- z|DbNy{&^zfv4t%<>r`rMS|y5^c~}}p$w`M{*GuCyR8SBI`!Bt$)4gtYXXk6oza4^= z7zBpg*ulwZ*c*6dE1p&gzK5uyOXWR=Fl<+|sMlNL($TyO9|lv9nTb;fOV+P_0Gg9p zjo@Evmb8U`dA~A8JDgPE^>FJBw_p0DLe07C^_dt9h%(G#xHu`Ak<n!9L_@JfGm;<A zY3C?E9esEBh)6|XXK64mXa1sX^=vsMFOOnjY6{ET%Bpm(#(ZYy^78WY!omW>!OqUL z1P@W`dF`1FqLoMf7&<8(LY|Oocr5Gt4|N1h@wA%wJ@ZXwDk16RJ(n^HOb;LI!JUna zIrT~-GV!W7rBAo9ze7Gd9WOrww%3(OkVPLHXIH6SDZkkc1}Ho$jKxaJgL^X8G*o|S zR#y7W?VQ`2gp!u?x4RsyxKIR~6SK3X*z{VaD;{S<->0Xilhe4JBcyT_KXY?)j~wpo z)MeGwIIcnR7Gxrx0uw8ui(XRmFGvH}4o};}Q;y3YNY{g;``u|3<Y_6bH;gZ{2rEE_ zE!uE|q&maQtS`8^`n$V(qiUdV0EgZzt>g+|={A+Nl5g>&isM$mM&jnmcA5;fZjg(+ z^I}et`E}i__W1rqWb50v17kbks5>y`rl!FkGA12D#}yl^eo1p1SjzFf!%3(RYp~gb z<yWiP;;^j7^||6YZjLe}0<l$ajv7F89GR1f7iz6n5<wVE4T82RKsDTPSS`A=*jq_) zrKun*7+?Os7Jw!$TGRGvSTrp>28R<CHZDAjhAbSpH4kTTh%U732N|7XUz1+<R`|4o z=s<c=In~;v(u^m)a`}+o$gkpkgnM^{--BxJAT(!1+$lZDI`cShS-9t2I;T734EYk} z$j9}tQVuY`kpr%}APy;fT&C0Z7R%f33nz&A5+Fc1+u*owY?>NYtaO}e8;u!bJ)$<% z*VnyKws1M7Y(CBNk6Pn(Ti=H_);W4NW_R=EWuot+BtAq*C{+VTkgr%c5AtmVFvj)I zg_DK*GiCg=X|f|ndwa=%Wn(M6$>Y^AlXQMd%CMw@6_L|NRgkttHWj2B%~~--FGH<% z+Vq~Ag7R2e(Y^oIkdn9S*I)afa3?LHIKl41O{&DfsH1^zZl6?iAA6HQ-7?3bH{*$e zo*V0fFce53WrfzL-l^X}G6VIb)rVpH(3Sh*_=3*+(8ne%=Q!DXmfRJGS1Z437Tk~} z03S^`8&t%RzKt%p{hp(yP3pqT#4vXvJyrkl1cf2-=?{k7s2Ws1{RfNG2R58<7PIB; zAS0MHWPV#QEw=v8r8qY?_wVRW;kXcyEUq}Isiw!<{mwLd2y#9v{0%ugvS<BsLt~=} zMNA)cq0(0mO-)TBiWmj1wCNaPuIqxw#l=)43;L_^A^!9Nz}sGvsvZ^<bI3};iJmB9 zdCUdY|DaUE=GDOrbHJIN><gdl)4@Y%<-Yhpeux-)g!7FvT8T2B%W)|or8G{rfYVyi z$=rXfyM9$nbOA53&ECrFvdQer^fuiKxi^rh0Y(WhY_!xwEw!JIJZCe85}C5?2jb}l z`fYW=09GQ0@}?SL#B(@=GBF;=Bny^;x<pD0m8i>P<ncQ+`ZS7CtXnvzXJ>m6-ZV)I zCuTu)Z+VK6b#=__Nl9Ww|LQEmGgl@xb5Z;5l9Qvrj7PbP>G~;pNLxqybhzp%_L#Yu zK7-sWo~}WAS<76qvh$4o%2URCuVRwi%@4^uCvE01K8MCgwTC&dJy;qhgCLM@t%QMa ze&dq*O=85>$Jwkg0p>LtZPAHlso%QZ3qz&XM&BR1&x_IHn^jYs&r3u;LALyOpDf%! z3rZ#X!9q}xUaR9pd@JwM&7AvmiRM*VkDD%#ZS)n?AMaC6)(I0tEyMfDma};C*&k|p zms9W5iEL^+tBDkGUEhRvr8o?;&HMo@=?LJkJkqeCgCZE)`hwW7ek*or33XyAC31F& zv3-)o*ko&WP0P~r8z+;@wo7|7Sc9uOP!kT|d*rKKDUBRJx%%X{Yw%PR81wqLhhV^y z(8>L>I)iiZ;ppn>Kq9Zx^B#sD3To9be$X8Sr=_<4AsrdJTh0BZ0d6>KL<{0oSBM6* z0ap|2wT-#F0;pXR35|9^Y7uw`zh)2#wOj^&n$Fek8o7$_IN!6il-5@4Hg;2-3@7%` zW+8SpT>r$eRDJva$SgMJCC8b8ZrldMws)t?DRWgOJs_0~ItF%WuaXn4XN9Zz!p_Jc zeZVw5hv~PX&Ti&O8rh~;gUBXUTx_&qhnx`Ws>E9WwXH7E-P;_L6mc}W9A27t^WAL3 z+(kHj26Py7b0ftumG5_G;kLzkduz9wzf+NOQa2{cZ*O)0j$JDuXi~}h#Z!C!VzRj) zy7fF)dJvMQFTAF&TeZ)){zIw5(Vb%^y1GNBUYS!_Rb@X8{3Jj<#5uGN8ystLl1b-+ z*jy)aXf`PsG7Og=ujzHQBp{*=7r9VaT7BughMnAcQq?k@G_K?!R(5u=1V>g1ZLK^# zJdKY<-75RiTllvWNIJo&rtt9ju@(ue<c%7iu5*5rAby3}M9kZA<|^7Wc{s3OF&igy z1{ol~P4`=qMIa$KunfhflfpIFv3lvrv+`K}u+;#99xs~<^0NDoft_D1R^|qxMdIp4 zq4Ti1NqR=Di<N6@h|25~t+#qh2KL_^>ElEo1`0|-QN$~y@a7bR-DT4Kvjyx8)x#k? zHXFzB2@JYKX4i+|g)Ksvz-fi%JxR~d;5DO?jG|T;_C>GBee!P5M*LM+JMe3{agh~6 zlf3mHuEKhS#rb%{k7j>v_*WEwX}?Y=fuJ8Z&90x?T`UaupZE4i##3j1e}8!NymjN@ zZ`L)`<xo64y!Rld%5Md<h<D>*!(qlC_C^hsXc51tU)-DdiRJ|O5#AA{x(_aoQVMf^ zUF`gfG&Fgst%Q)p=Ow2o3k&PGTBE0D+3dl1^1M1)swLdb!^6ivtc>V(;3paFnt00H zHv)avjv_H^_k+!Ua2xLbq*y-rk6qLL3gWJ&F$oJL<gGV;e#%x|cGK8@X@sbfM15eI zyn4Bybhb&Gj_a=L>G|M`Mk-cZP*S3e723rvlg@K<0a%)53<{Z#E&!~~C3E$A--Pe6 z&Ak%xu+IOuZWO8A;NAxtm*$=H)MOf|#=p<slcGIyd{iqNS@Hu#{2_6X)|kvXmok5m zs(JBj2q#EH@mND3K;U@?eeXB9E4{M7ZM2^&ZvISW*1i|I-FiMQEv`g0?{0mLLouNW zfk~Vruk-HQ{~O$v0rA~zz!UFHPa~jyW+hI@qV@?-XM@QW&R}Tjc;1%<pUc?GdH#Id zh-W-fPoA?JnDltOXvVsDns&S~i;IhE1mU@65DIZi8E~48gNaNfK+;24p;qh;G&CWS zF%-F6TwKf`!L%C75|v$>h3g<Aum(&3mK+d-!Fh8Z=N@zB|Ess>p(#t8Ot1V^TWZo^ z<WwCI%fC5b(n(OCo;5<A!L58M1y?(O5|nyOc#a7p+%*sgkq{iC!IJKlG)WK47TjZ% z(c}FFIm`8$l}RRQugbo6qV<mV*xx{S-=NIrP?FcV%ic~y{saag|5q<9uIK70R~-3X z^u}Z9WYlFKe*!_FUalhHs+OrCVkfmZx#*^<^E9v1;e?}f_E>>fBvFalhrD0EXr`v8 z8vsTd0sb2X)<+l+)T1YBohT|QDn!3ZOJ$W*Rh@gjRQv`z7J7Of+5E6wAzO?vOe}k8 zdj1H!B=P|}bY^ObJe*0=K;~CN0~cYq*hGcehr{L(B^4FpUqwYMdxi7S52t&DTYvAa z$MrpC^dG(IW(b!t;si=sx22~p4;OH(Z%(G4Y-CAKM?^Q%GMa@Fvqtk`wSIhN#be<3 zG;vOJfpL${r#s;)`cwIfX7N9O%=%oRZs)RvG>C7jIMWYJk1LTSVpHsv^g?s3+tkL@ z3wNs&wxXIQ-2}A=72#aanfd+P2T51P>0<o||9+F~0E)5U#u-J<#``cuLUnwEGJ8*F zJNGFXraf+4=0FqKQWmYhUKWP%4tAYF3zg%0(2kKyRh75vMGM)=(;DjLSm9zuCCX&z z3aog_AFx3`m09uPn8dKKu-ZG>#JX|S&F%T|4KPEyZkz8+tDlq+nveMx08T64Izt&F z$+-<ss9337pks>z|L-&0NF8`+wwE2|d}cSd!zHZ<wfA-KcN>pOIG_nK2cgQ)#F}4r z-Q&3A@j{esA1#=c3?9|Pzqy~Sc>X?$dQHQfVC<i9&sQ40Q?#XdtBF_RjDsw^NLRb4 zc(zwmwtRC(JN<}~pk#Szhfi(0eo#%1FXKtAro-pW8a1?E-MDzQSP<x^Ahu_cBjSXZ zq+E{a<U}LmR4u;+lVM=&v!eav{dp0&i)2=R@u?zw)fRejLO?Te12%~KJ0=S5IKl21 z1n2+`zq;5#dSN^ylJC~^Y;DoQ2X)6B^amgBVz$BMV>?LBm_3#n9Es=ujiu>2$ezKy zG3yxncm$snyokw6ov1jWd-8)i`6wDGpmI&#ZYR~iGa|PCsFlCc39qs&#g+7TDsAU) z<ZY~gzOSG)sD3@irlWQ+`lk(>`0$n6+~n5u<h_OwmA-GE`%i^4?*?nnjWntOBlWSK z=iz*UFxpG6rG(h!IQ(&Za$r}H_TgtLA4R@|;LiGYF;9`xmw1v8d_ILc>&*B<X^aWB zy&Z}~_OWudp7EXadA~d!g5p;$P1}<Ac7nH`;|~ef9<X5Ca*xb?ewb#;51z(CJc_&+ z$TgRpZdq8IBsC*y(ovS;(BXaim*B3JwY+XNO^yNQ8IrTn!*^NnbPuxHX&&4wEbP~O z?{*7Mq>+%2q5vkaCZ}Czr{dY|si?rFmjBsKU%r76u`aXHzHoooJwDNfJohn=Hz_Nl z*)UWn^HD{KE8T61O>x=l>#ARyu&1HCVDCDd+V{mP+xuJIpD1OXNtX~!^y(~ky&$pS zSv1|%;_UdzA;5MXzRjR9xS9pLI&9^RG;mn3tVOyTE{EgRs@yiLV!FY1<_P0Fh;jbG z%E~Gt%X=~T>tcT<as?zLH*!zy!=+|PrQUH<tT*U!<`H&Zm7I2O7n9<++PBrb4ztnQ z<@y?=dRVUi`QN=cDtmXm_VJg!k17^q-NYBXt4`_3S$4(OuMR-qBjn97@(FH0mvHda z!#n&j{v_+&5wl65Fc_NbjK}l*vbso`XwCHbSJF##Al37Y@^XEDRZ>_;O<E{DZY-IS z-%2l;Oad#t@9C(O9fb)|WzJWb$U#`7ZjjW=HW-Xg>jTYzvuvo-Lo+j%YEt^&k!VBO zPTWpvwPe0*t+Y%MtXGL0GjXX|KXO*0SpD_dc2&gRo)TQHd>#PS2C7XS-Dwt3B_r2? zWjbyX5ajllc*=>#Rh*htDhWh3^G|c*E_r01?$=-rTME@nHM_+&wH3GbV7>`FARt<? zxk>h&6bX;hOPceaH7*W4>OQU*9{q4_S)1!kW;2)N1T-M&(9n>o#eB6SfT+gf&1>Bf zqTeDG3CAVJ$G48F7NX|1dh(6`*hv&l@4UY2M6#2@?&j-W7Y>GOy3FEn<~grn6EW*1 zgK5iJHs0%1|H96jiL6H?drW|n_8V>uCUvgdj^;u4!>oN%l4rdc>xFLET)Lgj@P52` zYIu6QE4$C`9U-oFb6BAJ-a8;k?{WI~x;M~@=|*yZGC4UJZ)$3aI;M{*N`i_gavvq% z@vv#Tqd6u{MZPTs^}jjN$NFF#8>JvxesH(ZLwR3NUw;#%$dSS2_-o}hicnBnleRu5 z3^@MQr<5BL&vY@mKN6YDg~i1L391PBvrW$X>yP6JE$2&RUKd5Gd>_p>mmmU$dKp}= zx%AClre2wm{oJ$YPkjepXAiNWRBC5<*&C*t+3DsTt?OPc8j|~;m{5gHLhO(a0d1K> z`Ij1`c-NUD{AB*imHo$soigu-{gN&Y=ea_{Jdu@{7Fo#v0i$RMGKwqvi=^Y<J&hiK z+WP!?;+OYy>)=>YwDc|?^&2b#x!U!v8=L;(p%&wy&((^|Qj+#X+zB)V6O;Z}&7d); zH=;>RErvp36?#e|a^ANSE7Hk|9%l|*g!g)6s!ddAY`#*Jtb%hgd)8k+ZACcCG1@&n zTtz;0bF_>-096%EZy(irYuXLV54e7mIMaXiF-L9JDrqy`Zi?xtr{G6ng~<(gNs|4A zG!<mL(k=PDcR|W^JFW<&+G(vQ1_EnNgj#zqs3)a8oZIf)#0tPGQ6$M23we`_QeLq) z(azrn;agpI5aPFvHrX9XGij2PorDy|hDpN~`7;gez%;8hEJ~-TlHK=DKOmGj&oRg; zm_Qm6me<JR#c;}K2FU$@#0byX;4R-%p2HK1kin%Gyb>R&_A+bAUsOXthg8Jew6lQ# ze|spU*7k;)|K7<;w8UbJ9-n8oGF#5VMFowS;2Wh)&bF34AAxUNlmgdvKZ>W_w(*$l z^LmktwN?nO<Sug?WS@Qy63rsFyg9j?U3pkqX=Zr3oY-4Jmi#K0aIiSK{!`(V9FPL< z9^ZmsR4J`E^04f2uS`~VdOGp`uu0iOa@_j>@4+v;udyyH3qXM11LZ~~7$1V6cK-Ae z@5a0)@7(>e=FBiKuLl`o5Vm<IN-fs8ZY94aDKE&JiliQfLhts74;_C}9#hS=unM~3 z8qnM}@}<enq=iMA1BBE2;_8Ta`G=cWnunX>KDpGu>@U4Oz6AKz==NB~`tj_ajPT#Z zZ$$h|93QDNEZ%K&Xndk4t*;J~W)a5*O}3%#Eq~lidLSi^^5c{Ky%AUf|BC4T(vx9V z_vu2Hp>NqsD170)Bua4zTWsR4fOkHOP^KMQP7NRbc`w%fA=9a$8xIIMFO#c!nyUeY z>|N&avAOpm04X|0L_VkJ`gPCE;(+y)h2^`IyE>a<$SB`jv<yv=E?D(lsCEGH<X#Vu zTQ?rJm{is3^1QD*ga93badeUcYP9v3uHt>{c?kWTxG{Ujw-RK`kA|)vu9lp2mty4j zTu*vbtF`__LA(jn8!XMT6>QJl+ywd<M05DKI%-$AaAucO`){|6%kKP}hAspdx0Ct9 zoYsec*7f+e_cekB@}6EVW3+THD;pbcTD`CslTl9QMqqe9%YwdMfWRgfPB`bswhN4) zTZ6i-WOKfYhp{J<rRQ8#(PUEb<8#FTBddsC7A=^pC*`xjZ{BX|?%htCei_TVuUy3u zSfy?pE}e6)yd=H}9J{aFwftMBmh)OM3guF*w8MPvfN6z_M%B)h*WrB4r;Bb;tk-v? z%{VRkTJnXL*$Dl4%}*FpvP9pxLHD+Re8>GZH`MEDTT$NeVUjXmN(F$7>8z0N_>hc) zogAg5xD|+_gS)MWhkah_AJ_H0ag8<6G`9V3>OR3LMNH5<9|!QBPJg~yY1{7>sczGU zNi5(yxsXeIdM;8BE?g<mBi{(FHXce|6)Ia~WqK2aS|9^3JaO+C_v3F$@ROsX^8bLH z;LgiyXrYwk{=x>}^Qpzd1|zN7F#G52{_=TeK`~;gWxqQQ={s)la-N-w$3zl?##%|m z-UrnTu|0!HEGS&9qM#P0qdu5^@V%u-!&NF_t6HU#>A^mzicp6rJR6IZwb>cc;*T2S z6x)mYG%0I!I{vrZ)N6xS=9n^Q128z;WqLWN|Ku`ElOg8&z}d09s+(d4Deyt7T(7-u zrpzn5OJj=35E(K{C-kC#Mtt*2*i&ac*KDlRUG5xtIElq%zHGbLLPbOQ*AHjvy+_EC zP$xQqz;c1?fnM^|wR8N`i0t?Q;k9<2OcJyEh2M&GoFP^m&Wq<7oYke!CV#QFJfz|g zGUu+js*G~~V3Gh=a0f`kGd9V}xKpWtI+<&h=kL16WimP>xg39n#Ys#L7;^1vILPhc zaN#@=bvN@gUMi~+{S_C58C46)Ys8?R7v)5!9k{05g9DibulI3`0i30W4~-+!L%*aO zb-9U)<&DG1C`oDi&Wm**vQDVB#y8J<Uo3(kiN3Bab@noy$MrNC1g0~Z7%&3g`)N}j zH>1}a%HeyEAkX_;Aqr(O->ky%?--INL|Ftj4Fr%{c3`)dbk3&9fjG-H$!q&~T)bBI z?sCMABr+y8RzXON4;KwH0uf>^0j1a}wwY!yDx7gB43;(s3BSogzd7T6S05thudb~{ zaf4?y>W__V2=lTaMK{WL9+dz#iG0!r&EJFDwZ^udnMIV<bcE~{Y8H%F?N3Rib529U z#K5u4y?cO!6aZQ1-2Prwj;e?NyyTa#e}`{Vcz4}o>zkD8xwyHDULEp0eWtTTcp&3= zNi~Fk0(k|>4fSQ*7(@U=O|9lzq$ainWc{75*1aHOqSaF5uNq75fJ9zNsL%5T^%8vg z9HNzZ4_17j%%qi@8ra$RJHCeuv&VQ8>!-MIiSMw1h2)X|I&U|92Wg|t9bTB^Ruo=o zxV!rINX)S7E|4UV_PcslnT+s_kXJK1XM{AN38Y>_9)@~{LL%>a7=tMOqP~OCSgHPK z2gvl&DlShQ%`F3)!X<_!nWMvDNqw}0x>Yb>pQmZre+MZ+1YSvO-`aFJ%6t~_<{qkm z<?BP$2p@L~!4(UDpFVqe&zW1#6*MU_+pT>ylvUK|PCmK%IMM#x<}ryrf9h1FG%1K* zajvHLWAAdQyb2>ZU61pL_C2+LzT2_P(`E@f0s`QGYz`d;!RUMrYYP0R)wtw8m-}ji zxkt;|C2aRE{c^wSa)Ra(n|Me)pPy}80~*Tgy}doU-(_kPq~z!!>f()u-Q8k$8!>XF z&N>FgQS;445v2cp*aA#1P+nDV&t&Q2#=Z_@W(H#0WZUY6$0O&~yQ11MYd&5r#N`=$ z%I+7>L-*+f^D0(TQ*&n++Pxhh7=ES*F6Y@Cv$(oH8+ocdoM~wu)hJw2JC0_iC!g4F zd2Yt%&tg(ENO7ppLkN1qhp8Xw&15a#d*v)Nopijmetg(8w?;X7NATi#S3%hXKpw>o zb-dsZHJ|f4dg6&b)CN<+0*K={acv4UI~_5*!c`*RsGh$L^(_#!AdK%cD)Nu^dw8?> z5~91`WFRJ-mAJiT5NF_Bv;^Fz5)a=ErL{W7G?r8!6?x1ZFJ1N<W#8xbfB3ajp7DCx z#F~;OXL<nq|MOf%{!}AjJ#9w;U;;KCrdxr&&61W5@>6FZr39@tjk8;fopqDB2Yv*y zo@EpQ33{!%lk^K>7tgHlXr1R1XoE>rp!t$SzFw|U0(EhaaLm>IXx!#tBs62Esj;xI zaD}~fzqGNtH1T0^#m?dR(*m4mEU{yiMgvV*YYZ*Uv~n!kS3pK_v9Lv|d)LkYI2C1i zxaT?_sLVHDl6rC1iRW3}a&!EAO%4molUSGmz7W;&=ykMMk2GL>$g3JnG|zbp+hfT1 z{QZbm6YWy(U}&mZUF-j%OTv=+vO7-kP{7g#)>K#jk$TV;78c%ceyzfg;P-v2R@Pcu z!2EeAK6YSFRY~Mr31l=cjcJihE-h(m?;RfzJr4G0iQPtOXY2kTONiB1=YDQRo*wL~ z-)HOAJ>-44hLyB|+Ppt43(4lb-VCL1%wRqZac-x6W~%*VUtbdcbe=OUZKs-3i16Ry z_xqz3EWV!~+h?9R;{{r0nijVu;^NjBSIM^#&)x#cNZ?Z@dhpx+gZYebP2JHpG2RQ` zab}Rx#hjH{1Fo;G?olQ>7D4=Rc5zIf>%Rg*s@K4pYT}g5=~czlHIZd&)vYrt0zIMn zO|33p%kC@5N(I*&MpkD1>zMz4Mcg+EqGO0t*VbOrY}Q~qp5(S!ZQF!ZH99X3hY{~E zvc?hPkN6CU*Px(c5rExPR#9mwkyvA;-_Es&+OgJc^47dO)wHV5?Z$&G3Jes@)V@xb z4$Ag>exohwi<&6JZmNLqD>8=A;=_shXOt4nT;3cgt2*2t2s5{{GHv^f_TYh{PBd2v z|NoBP^GX1*#pS)qP{cu>c6{x@T|Q+EU;M)mo+Oj2`UQ-5Y~Zu$Ts0ldruRiH7^H7L zANL3OW^xmhL^QMDXce8JeeD%r11Ku9{jI1_-(;ps{kHx@=@SbwWN)=8oS%T8xQ`ak ztG77Q`frmTN_y4IrgnPcGUjs2WCEFy3H^rd){fme%s^UbVWwQfI0G70Hb?+PcB>S+ zUCojkj<oCTHVXhuaZD>Y3PCP2!_rn|MqfBdzD;=eF(<)}UMz7C?K&g6X_?zp5?woW zYL4z0NdwSVkIT#7@9RogzIvKWx|#bQ)>q543$d^L{`eACN)9eLvzF?UybjO`7v3uf zG>gIH8tJ%h#=&~C8#u?EVR}QxEzbv-5FJG^vAHN-b^<g*a{Sk2&e62D^0$8d!?}QU ztzW!woO^Wm0Pj|*|D%bFA=}~PC&vT6o+&WKRq9p7M(5_6dER}m_y>9yg2M(R%35ys zYKeJj9J8b+bRcWjPxZ!S!@tXftnb!F<VTz;*-l2Cl3bgC!D&7p-&7bblMpbEr^^G+ zWha1EENpJpZnRoFv?mQdeUxRAeCx_-%&FI_PbLpp|LM`u)$^<-X6AZBo`GIX(klJV zAjxEmyzMuMkP{(as$>1Jp=VwXQSGB5B|dV}fkXxb)qMIg5hy*v|8#%Exjk~Teaw;i z?;O-htfcaJy7lZ$6;0T04_`o(suoX=4~{@>p8Rh~yOD2ndipX~oXFL1vHG0*Uxr6! zZhx*JrqzhprgLI4gPgSUQjY>u5Ix8zT6etKO~s4120mjoU2ksn1@+aPje|nV&0)%C zAWz<lJuCBLH7(vhjHpsI_j+0G!|KT<*E4pnhbnuDkqmzCTBf`*9Z3zv+8k`j*0}Q; zz`sO1E**Pa6^`8Rsa^q<VkjGanFlWwa$0;6_F+T9bdUUA`UFfflc6>0{b5!Gcl^*i zcbAx7hebWk-=@!_H}B|FgA5=`kQv6ygK^GVStD7M?FDH$4Wb-=G#$^89C>TN++)YF z><-D*10gdMneKTxhqhlf`|j(@HIad`9`kS_wyS+?jod3~n0`nh@#EosihGc*lps1W z{oRokkY0@2LwGYNf~xWpdncIDNlFT{zG(8>K@&dv_4}JMZ__a9{T=vY&kf?oHDajn z6p%LjcQ1gICQxrd7i~R7RN#F43Ge%=+o4>r{IolwF>c%wmci$yld-DC58mhb>mk8S zukX-)3+WV=W1ERA=NcC87QSXZuEp6Se)@N$%(3jUuH2n?**=?QBQn<7ayf6#-@0qA zd$)AebDx1m-zXvb;d(R$rQNm(vt;-anfkAAQ@>Mp)5G!<)8_=te>&>53JE)XBcj^x zS7t)p8oQM%45Mkz%QtEG)=jpLdawdF!@O6ELlC0z4};;+tP4OT{kQ}r-->RQAYC%G z@}b!f03+BYktuj`62Et8RAmZ5a-fWkr<1jo(ro?+UtU?v+TF|#oZpPBIIWE5N<V4x zi)IX10TyXVv(~Da5ih*uOZE!SK$p=5AQ>!a;ESPB)xu!#U^;`4G?iK3Jjc5c>Q)!} z41EEiLji%ASW!TMJ$HMa&;M}T!wuD+4EFSWOve4j;t0{T%!1=cL}+7d7$~f-pl6PF znh2!W36B!+&&<o)a)j+<f!N8+CYid~Ff#SNT>sExb?(bU22gh8&UZIA^4J#w?^B8W zL2b18>(nn-@0s}qb+`AksuS*AhEP4kq`t2NKYbcPR*$xN9_CS7pmf_ds51@_&7$3$ znPx~luOIO|>bEO{a$*Iip>|W4_;xfS^|H#W9hUm-t;EOSk1JBmL8CC6s_N=<LIV*0 zNyV{EK4*iNxVyVWujN@^|8Tib#?tM89Ov15_<NzneSogEx>$0OcMtbP0LF>KPXss8 zU$`)UQwndmg7o551?6^?{*Q18`>nybIzTPv2aVI?888z+?1+~=EYh+h*tOZb1k2>H zD=??+Fea)^pRQU%40*MG%$H?NabE#e`j1JDXc_$^K+kgJQhT`sJd?Pcj|Q9<ZF~46 z>kG}>GW&F?Bm4Anb%jm+1kv&lAaBQNv!+6A#ibxRwZq~Zq%s+FH;~Lxa&(WRa-Izr z%E_RA?yyNkgN_q`XN4CF$BT=WAcD;P8zD-1t&mw)v#p5<$D7TB6*f%q7e;B|6w1+Q zR0l(UTMwVDnB0f^B<}^PUPl<Q-hh_`=G<$j-->Q%b0uEe-R|a_13s-4um6t6>;Ael z@HI|L*I4I2uZB^WX0(?`(|!Nd2kSA4xOt^=+HYM}4RaOQ7aX60MEhEfz5ASiKsD7G zqC@lpB4}5kcc29*e|<;yC4*=~gHw}q*DYwuPQH;urge^(WQuX=m$HmPnSy#@|Cn<k zAkX$&8-JP^igq|0=^-~BPQ6)((a!*d8*@BH{g}u^5tMoUkWs7k)<Fgw+X!uvdn++o ztG%GC3@NfXr0gqomPusvg$`a1K`odxhyTQAnvc%}$xMAtomf)O2f0a!<8lr;4o+B1 zhIw3~58SqZdUhM?i;Zhv@}jfxHo)ju)!uW7JO}DjwUG2#QqjGe2Jk_$@kcj(RYfid zde1Jze`EfM<LIgyvekU-AoY!LIhtNf6k}s!w&Ul!=pit0C_NaYz990$BeQOZDpRKj zfb^Qm1a6p$qXkS#^)KMDZpr2@)Kpb*;7~t~m65Qvuj2A~T)+DDd{F{bqs-{Ub)#zt z4q)`UQ{OZ$j*Tf)c|UnY5dQyENC5J>B3uQ07fRkq|KEaUeht0L*$~GF_gkm>qN4p+ zLT)FU0~;Q+myn5*`1<whB_lc{-Vm5e%B0*@WQOQ2H~Pv40C)O&M(2ixO~Z!Aw&nTZ zFBP~3gwGSLi~7=4@~f5AV=u_H@Co-C@1Lrix7QSuw~5<Yw+G`<Uj}^otv8F7QyEe$ zG%Kn?S73yu^;NU$kkYZp4-2grOB1c;eXxLNCSow60{puoczqOUwazRHl2;PU1Dvh= zN6j&kxB{9c%rPGPBQcbHsH<B*&o=CO?7ke6miFKtH?pvSsZtDs=qH(pY6fc3B2Jl* zMIe8z!BDF{L9g-9<>#+`Scz1pn?3Pa4@Oa8`PZK~F<py$NACC!Ms08-ac<`%(x<)( z+zhV6*_3Iq4{V>+1aBDd+5Qztx?1sWg_W~HWKnqu+fF7Q{HLd9n;G%H@4EzLtp&=v zqRRU?2n?vP_-6Z5-(Sy_3)3<LoC;9EN|-&S4y2yXW#%s3mq!b2jR?OY^Ws76x8$Ke z9IfFiBDz_tFt#y9FL3TEUc=|G@*t0nbUj{f_KYCp?zT_q2#*sGoPFyz8XOtv%<{h` zf55ELUf(kQO_w~`kPW+{c>zVI#o4(EZ6(wE;!_Gc?|8M@g!+uG_d_?xWRBDV5wYyR zWghGHjZ4E|SCbKN+T|<*ilyOjvHmPQEG%qR7#hWVGstJ=ew#cDkpybAEo3D<?A|P! zu{MMwMVJ=W<Kbe47f63pD}XW^Z6;dCoDSTqaxHcr*?2Yz!^G20otjT9Y{N<6EA;2k z$({)p4g8IHcOuZSWiF!Dc;ZmL@Np2D(N+?7*qbz459e6EJ~uC0DlgP+^-2In-=@af zjMT^5yo6Y--p(kuj5oa{hEgs)H7ZI$Uw7m|9`T2hUiVL_eKGPh%d#e8Kk|<J8Y$>; zxEFA&i>QSqDtoFb#fgaT{w9k+3O<)WriPwCnZX=wl^TzMMa#a0I8~!=9x~R^6H4&h zGlqBi9}qsHszeU?7Al{i$9OkpgJL)5i{q82(I+lhIZ4UgkIqMnyV42tCC(P3lIyK; zP+FtCp(mWt>JQLR<3?n@v9GN7XYnEB_RT=gb)yF}6k>rvDa-S35M@L~fhhP-Ae)WH zC_?%=COyOV+JDTQHaFz)LJmU)@WGHjFA^gQ&r%P8W`>v(y=BjI{q<$M>&pe}mD5%V zA1DF%pKcd>HMgLk+WHy@1CjQf>riqqG^hnO#d<#3dDkck_?z}b(Yb=<)cRQykvK*4 z8i)S=0l4`hnn>GN_LT5#4qI8BK{W)-eip0hv8IUsS|!STVFo>KQTG<aze_wG*C(ZM zG|IQsN>92P8XAG%-kbcv6prJqW?q)}UYv>JVi*?Jh{<0x;{<DPrv3yVVB|&OGW~r) zB2ppiqgtXdwF*{pwzhow{d%JI)?)7fCsp9k*<VW;JzPWsxp(g&f8VLn#<~7h^gJ?p zfeHkJKva_El6fHXKGWED(%9#etTI_~toAnEfRkuzHAH5-C8y^2Gxnlq%;o<2?(0lx zGeTQqm!k`%Y%0|m<Q{>>K*`YRQ-NN!o%u8Lt~IZus1^GVDRh;W+H0qRKe^V`5S~w^ z1LwC2Bpy~M6G2^ksGW*@S{;vnU1-`34oO(k6^+yH+1MOC9;>-A+*Nw<kfE5d@pKGa z@q7v-^wb`FyTjhv>(*K=83%YG=Rl++22PJ%4`NHF8VIwQYfS07X3!jmdFJV@@lTf* z#>xZKDCsqyy2!+87%yQE$?;htpL-CPs7x#MBG~ux*vSZ*%lbGN+^V9lREHq|^)6tv zudmO0ZuX=i)tEK~H>OVu{we;zC#vcDOUqMs6E9H8G4WYZ@lnp4@b_fgG?(%D&e%f2 z2X#e;<)X0eWgV6v3pkOro*NfbEo5vV7G&jHJEfAUS{C%@hJ%LqyGG2``rp2SVqvB! zX{_CvLxvi?Y}B-QdLZqlq@?s#)9RrJ7}eMxyScgH=zHDBt=1URZlzQu(iyAREf8sG z$Axyy(eUZxzuS8I?S`)<$EZRZ-%g*veL0<ukRqn(TE^Vuy{|-}^)X49jMJGmQnG7Z z4OMzG@Imh!bmr9Cd#F$$#|+C<ncaj+PbnzumnE5x;xOeP9;hDZh9mZ{v9Kl1Kowd7 z0&-qBg53-T*vv)PDS_$AatWtdoU5>li&F|(CZ~g0J_vU;2TVQ1w=5b7b2^Abj%2+j z@@cJXTesAh+%pFQ&x!Ofn>7puHAVnahiBbSk6a!;jzQN8&gU@<2GWfvLDzRVuelZ| z(T<g0LK%nhb!P0Zv?>;)2s~+lTPIqoO~<mVhSK@#j2B9{!^uCXu*nBVE8<X+U~?@P z{Bd@!ZT^uiX>{aubMn1ZyRj4^VuQw_Rgrnpbw-)c2z|QW<_~{7`Nsc24b-ztfTNS? z0V};7i!Y?n$6~1hBPlyTUF`B3;y2*qXjSR`6`l_Ujm4SVKYI=3-nYM+AXb3UOz}xP zncdQjK02ZT)Cuk@g1?{66tu7s;tqdQZlKIc#mk+LKD(mY7kT&{XrC?cH9GE>c8B8= z&x3^_tzEPmz$5u1*SfI+Wbv)EbaW+${-6eF8bHj+hZ4&OQxo@3Uo!PCUii)J_aV?V z8>3Lk_Jw>Wj1eHg#KCb6`(L+;l|6>#<6e^xj)Fpwlv+@l^Yp#i08?lO#CppMb_dDX znp_spJgDQyNV<lq(31F2C?ZWN@=!U1cw36UU2^|m{zKm2n>4#S)@(5aHIIP4w$B9O z%j211b$bJF$p8zGBQnG@=q@9*CB(&Tp5AyEAro>rECGMVb+}M_yxi^&SL;^O7o~oz z-1{|1b0{Y!V2nc&T3&1__WaeKzF)}WtJwcAWe*TAVL;zE9Ju8E=NDmfUTbXPoB6tB z%z$D$mjMH?x|bq<E0763GM@Ru5vjpi>>rf9`hH%T(T&{I;hn0Y*lk8pPB3aCTx?#0 z*1G~<Pjpeq(XVQKUmaAwaA-PPP7;86;?@i*L|%fzPXDkMa1KR0>zpa0L_c13K2Q^J zvsyqcqN<QuB4kHKD|WAsABYUl{iPmMbH|1`D<?U>UXP^wblKz@9QC~Bi0{G?qgS?9 zBEftpqY4>{@BK{wXq)ADp=xe{c;GB764m#M{j=EZw!(r^Q&)kO(@m~?NO*X2?|<hB z7Jind31mkL?>PY^J5{8*qH!GB@Q6TxCW_SZ#a|DdDu70*;K%<?pEe&`4Dt?G{YTz$ z6lM4|%dxDk{PFJmaH`u<RwYa@b(6*FEF9Sa5UZgCY(0M_c(^n)Xx(zAbcvv91{qCs zEH{XxjsUVl@bUKzFrR(M%f!N10Ays#rg2ebul>-h`C5~<q!f~M@m1J25eD(6a*+zt znFQpcm~DGSpMgJDD%0VmnWrQpCr?{*h^E>*QO1X?9IMlTTDk+|K@q`NT2*AB;DS1{ z<k;BQo?SA9Nqq$|RGF87KT!Rwv7Vn1r6hT2!<BZU;LyuQ;TxQVtXtDw+WJN?m@_ku zp2}Srulsjmw5AL?IPnV9sXmG8tBHxYs!D`)LlQb@3LCn*Ina1AFJU9mgi*iv=BH8J z<F1H622?P~)YArj17K7`yes&6qc0}HA_FEx7(*0`9_}>=C%?FKejb#3{_Jj=uPM|= z&s$bzX6Do}n_h6c9sO&YH*%Op*WZ!c5b{PV*D&S8Azm-5gXIUY*YyjhMqUy;WKL4> zgPX1?U%272b~;oK;uzX7Y1p=>XUU+m2FdlFN7q*PIo}4@d5STcVqjo){{)hYD10lM ze+Q<t0uhVmAYf@wfEh&+@^Eh2$hE`4@VZ-11Ysvw0uZU(FnS!oi-?Rxg7BACx8>ez zHmoe}<vYY*zG|{k&+mkv3Q45=a|N%E)=Wo8@GS$*?T_`s?-E}{@ava1q~G%fkp7F{ zK2T6>U2mQJvq$9Zbq5~>yCZon4DV)eP{z>Mm_2es7zm+`4;$T%rne44YHdTPela0n zegSta@J@BavB+?}W<WSoeKD6A7Ziny-o5Ti{QQlM*`NB~f<7=G#dK$2;lU*vi16Dt z!Rz09{A^_y^ybD(lr9<{A7?ZfPHh$4(;rUZ7-0tkbB<l`z^)?;qpI93@(_mtv%#4^ zk>nX3qXfeq8vkOTYgQx~vWOcBMDUwT(Fo(nbe2A`KBsTJDJ-`tN$qn=l>{n#G@=dt zgOD`123xIJ^0=p4@y9Sw5xmJqD+DQ{;^U_w>*Ga6R5Y`HSOqRkL4<loIQl(QIyh_3 zZU7ag{uK+%Pb^>}*M8+^%u&M6-|M}6-Z+LRZHJ?eIgvOo#jt)vjoJ#(X55(YvFwtD z!2~!64yc`t@S^r3y|5M-r_|_<Y&iK~2o!W`m4<!aH1>mUk*cRJNBHh6WZkYjf4szP zEa_)TZx&Gql+4sS7JMUU8b_zeKEm_h*HW02+Zx#KRbr<@4@V027LBh5s)}exb-cS7 z{B>B4Z2wJwI`gy)qPlbo4=N3@&?a{2d)0XfY;_LoT+-77ekx0XvMKsCi6;ZKIvf3O zz;&Gm=d62dr#b6DuE68b`{OkEDIxD<gZw*9ssbD&zX5(~m~=>r_zC|vz2a`C_AAJE zrI7Z;GO9sH6NCYN0(wq$1W~<HxwOJ?FylisEOGhUJ`(D1?@lR9Sd}>ObC^HKC5vL? z(%pD5)sy(DU;h2=(lsktCtbtE0T|C0U`^!+n@K-Q+jqxqG=8MUi?$Hi=$SDuH)j+^ z)v&d-T{c&~2>bM!iVjPZ4+C<f`|x~va4|48p_M>QOg82_gP-``OCWO7=uRAH9ULit z`(PT&9REXI7n(6zNX6Zk%2dlk?GLZP!=sO_y%O~*s6PI|01$WP632?=_d|n&#dUh^ zel<nb8s=eB&MJKY@WC8tqOV)N`j>;{j{EV$W=@DP_cfjXEs}@BNBV!cdHE04e@_Gj zk~2ae8_v)+MY<t%^a5uFL;07IAgGbF166|8Q;AF$&J0D`ch|Yn2_8T*?wrQw*)aTX zy~mml+>VwHisuZhTRm@YZ)&=te8p={g{X+%z0fD8HpG;1jkds{q=~!<$LY2-BQ9@M zef72Z$*Ym#Q}TyVjTPzu_&aOBl%`)pZU=elkE1oP{q}EGdPr`@&o3Ui%9cZXM`X+o zq>GH;G=f`~RIV@kz3ItU?drog_>tPM%h^+(mysaXhhhL<A6#x`&wpdMx?iGEBL(+^ zGNA5nfT%egxX)&Q_@jNEWx|BF=g-Yr?s?1I*u1#flLCcZs#!fUVj-@dBv3A4F!2t8 zok+G0ZMKu%x4XVlh2CZ*-o(Qqqd*pnktdhYaz;4Qh+w^<Pv6XP#~}%KK5MBQ5e{O@ zC=*77N#LvC^YDZQuPEUYjZDX1lz@Q3s%cl<8QrU@;q7ndW&OowrWsew1^-H)aL{Y2 zj*sC1f&6P<=(`ZL9vKXN7L62A$Sz;_Us}T*2OKqRs_+7Mr-#d7hfy2ecDI!`;Nalk zJFRM|hcO613?4tPe|}QTP3oa7AynSCfXkFPCc)J4!s?5Ch4-N(6pqM6Zyf*^DIWrQ zkuIL<ZP&Y}t(z~V8`Kf12noC~MEP@HP&3KPw7(b2W~A`#XuF~$h2E8WDM@<TZ_<Ro zq3KBK<S^Gq28ntVVrA%|Sn9v99JAtc>mZow?bZjV^U@k3)q1sDW+m^;R**)=#ONMQ z70u}GPZq{pnG+5GctQ6OWRXcNAnW69F}==Ju{sONRyR756PWv{54{=~eElz%Q`qd@ zk@Wm<;Ytf|2aOI#i>~5Sk4503G|pC_0^EiG_Z2H%cXSa*TnO}6?`hu7m{Btc$h3a} zy#~GvntDjg?nR@&U<v{;(zQp6A2IR=HG_Y6kWT-JIKJm4P;Sr3F4)JJ=_pVjML{Cs zsapUwFAh61d=Vh`H-WA@+b?T9vKxWhjQ7?uDm@{N!O-ZatB1F|Obz?KDn!fh=g7*P zWXYZOlAzV|4#<@5%*u3{kIFvh58vpnw~lHIOioTNPvm{lEC(FdtY<Salz$rxszP7K zTSwHU!NB!F_m@)Y<{7+VyNr5Dui9Ua?d%85F4$+ZhSkY;p~`7O9Bc5G@R?#SCV}=K z;>QvC9X@v}4F6Y1Zfosu#Hpwe%j|$s`BevkBtl4Pj#QMjS<ZX3OXg@BeVQ~SU|gg4 zr>C~}sNtgZmp_O)Gl8`SdH;%M83h@cp-#!S@wil8_uq@Bn*(=N^VPeDAR0jg@$T7E zQuPbe#nixpKU(?Zw;|MO9j2JwueESxh~>>Ln%PF28Z657DBSVri@t>|!yzKkB*H+# zfbV)v>&EH)BxHIYYM6`E+zxiX_Yk=kpZUCiR{3^TUOmkOAwuE-P`YSya!D%I6`d`C zl5P4<|6J!~rrqnU4<WD3GsPo`3P2bxn=KZ;YymFd#DPFOsKmq>&}|ruZrD%+P=Aq$ z`Lx`(htmjaE#^+IAw`{@K&Uu7W#BAWMu9Ky>BW{xaO<y9zxWVZK*ks&P#a2p9X&>M zdnrnC^>=G_Uu^1SaU<d*H~!YvzsF5I<IjRmnm8EGkzo{PeK}3zQ1@uRWyD!^6ciqp zgX#JU=vN0wR}}~(r_3xYnlB_0ZZN(UX~CP3<wNPVxv)fokPQE2y_h%YE^8~?56%-9 zpQJXq;Eeim#TkAgNspgEF;$>mMe$3e<oortiv)F4N=oR#fd!a*Y>?@<MUje^=U?fR z^uOFeFQ00x*B|I>^nzME=#y0Hun{8!!K41F0~d#I*3T*U`6mjC5@OYa)`=5jNV=yW zB1eZPX8vN}+n%Q~&T;dVg<T{O?<MxkPjV2~7#kb^_AvZ%xl3JPExd`>7hdpI_m#{- z?2KvQJMB?<0X^jh$ZFQrZmC0QhX1oiX0?Ovp5ud8ekI_!-udhPMc7`61)YKpO~HLf zq$bDL5UM?<T>Jn-c%c#Fs$3imPfPaAs%cL1AsBK<UzC`wPRyu%g9i3~0w{_2VrR_2 z$d*{;%a_0PD-TD`gbSthT@t2=ou9B^Kfm8(!r-qM9XD1{uO}&n`GF~BU}g3#-ih>b zdgXIH2qb<s85_mFxn?Z-Ufh!UPltRp=m+wdt-?nI5fOz*j6+DI=%165BiwHuTSa4E zBx}a-kt7niZ&C{1AAXl{I!d^MN{$?IgnID=xHC(Tc<=k*U_tWxk{DFi5|eIz<aXF8 z_d1xZAf8fJT#$Ga>Fd=+gd&39c-xrT=R@cO-5N9^@kTuo=i%fj75Ul~1*Qp>4i5^q zIh9A0h%{@*kZrs6g_JEH;W^#_YC!tHCYM<Y0#;KAj91C`CP{VOD$F>DCAWhc@3vBe z^5K&Hn*BLn)*t{i;r%WyxK`=02i&QKhw<M08{_+|ao?Fny<_b+f;(MZU1<nTh}aE9 z`W#18u!?-$5G;%8FI5#oIN>~A*~Q+}YY>onbBrU`0J0<D7F_cq5n~N_B18LYIg#Am zub&du8U=6xX8Q!QdWx<Rit^>)lBOqC0fCJE&i?tB68NV4fc_!7qY143dfulLo!~#6 zhm(a9aG<=G1uBzg8^pl3rPG)`l9`MJ@;^I7sfQfbnR|B&d|mmKq^euCGz=jVOQpB< z*-GOdzU{;(j%K{VZ|eE7X-yj&8yxq|lp(=Va1_3N!12AYVApK#juCZwRV6zF-1uFq z3Xd`*rg)#gm~eXcE(eCo=^z*!kzDap5>OL%SCTUG+ZcqLQW(R<kSy;F0Cl-)<L>Jf z|6rh_ua;p$#*o#Uu96rYUzIxvz@^s#sLK+38xS*SHlEWb%I7Mg^tWsTw(gM)9{8_! z^z=u2fweEGKIgsp{`e*#5bRYnQKDQ#3cOF)N*JG#S(C7Kdp-n=f?O``y`{$^NRsqI zL?QW@ppcNCqE)sQuFe??)NE!h<12KIMH~MLOB0JWJ0_5qLB?SXMfbubEJ_0u#YX-3 zQO<@JaR<!veQe_hx<X-{82&CXn2D}$B=F5(;o$gT9R-tn_StBIn~R~Im&5dh0awC6 zAjmQ^A|gVfc>dT@pvAohVAnyj4|u7<pl46W|CRPh4YM=!z{m(kG`|i!%z{|@bK?do zXpCZ^;o-18_f(wc8LJ!cF(7o+Iewn{0MzbE25rMtJx}bmu239>2mY!1fwq_4|GjGI zV-hx_MXx$3!@4(9cAREgKF$T1I;nCHu2A@XrydWC=6MN00{}AVIXCj`?+r18M21Ql z_iXpxWiY*`Ay-pD0|sjC3yYipZ3QV}Mlue)mVlyS^b?87i|2X1oD?!MkZhgiqOn>s zGBliZR~^FZri=`hLimqesGI$+bSXhfZRkkf>adFr7O~6Z8yFhZINaz9gNDULE&CiC ztbS^as|@n2=+G`q{&n6k68OlW?RArvP$E&^-^KK-3xa!?-cmvKg#->`1ehdoP#C7g zO7MH(uyg>@7}|f0B`($$${OTCzb_42^9ShPdtP2b00}d@!2-kyT9px!_lo{47J6ZW zOIib{qE#S9Wy@NtGXa-j2J=#e6#TIl0ua?v5H3Iz^#9t`J3-Zb`65mYoBI+yjz{}> zTiZj?t(LuVtL>Dl8lRZp7Q1CKFX@Wpf4qiIkU~|U?vMf*kNz7$mssl06rDUs;UvPV z_~oyR9fmSC|G6N(!iJ=enDwNl#P1GAn`w=a06hPeaQ7QPuh;e`CMMReH_#M9^8GzT z1D89f-hdO8Kpkj{hka|Yr%h*`xNu1C@%PmA#lNHf*8;>stl)PZM0p)}2?MiPu+35q z=c*|AqETGIs3J?P8-25--_!8Im`t{VSegPbl@DWhR07G`1JJZy9%2T9XNE?q5X+GT zze${*WKe&&<h%nkR48GS>maiT({6UV!01OJ(N4ugQ`oK7Vu498K&O&HM@JuSH*VSO z_ZxZq`i?lD6+L*M{dvziLs^DT6+3*#{{pPpv1tjZUC}kbcOn<7%`l+!b|Vq0Zr-3P zgmiD}sd}Rrz;|S8)!XskWYc~32vQ(1ym*c^vfzzbtT$Xqa@5zF9d^g-YM0&2<#P!4 zz{N8CAGGRhzRs6uvO%4fCbNafy+eyb|BozV{CDG#;79KL{r(NKC}f^@2bbDkayaq2 z+@a;<<vnt<u&}U4BRc{{>Pf57i7pmL2vMM3-CkBCcS~c4OdetrB*CRMXG-*c6vP)N zXjWV>f>1j4o=DS1lai9UeLCPI@D0SkmlgV7A(=(64#oP9gKSYy(;zeJ!7<DCR6syT z`s^x3c74CPnzcvw@iZZ_dK&HDLa|PB!w}@3cPwz}RMjQCXbO_Q&ttvkXcPP)U}_@R zF5S>jl9!<vWgj!;Wt6~HRX|wvm*-pWj#q>YA)<ydvnbOs9l_3h?M45Uy=QdmI8*-s zJI@E&6M20BXmAc8*1fV0#TxV<0qAnH&my}QOzy-Vd>^QQxh|lo&{>!2S!(zDf=;Dn zK$0<Hj{N=JKTRk<hu!_<KUT1dvd|ejVyC}RU6*(Bs8mv(nE1Ts$JupgbD>{#{%CV2 z7)H$Rb$h-$!HqNX6JVTFfU)LGS&2ydY7OvtiW0O|=HE4x5Sw9yc2AewLBh^HE%9`X zh-mwIX;-oPNKZ<9Y!!0!cceOx-VZb((!oI^##1H{KOScrIeb03+>?Xh%*-8f@erL* zzCNfLQOV26ad>^DZ&qT!2MUQwz@SR9?S`;n*iAQCB4aoRLJ9(klvEDO=|jTA%4-=A zL+P~}sM@GPksl+Fu4{uiT2*<Bz?r4OQ|I+9CaGh*C6wZ>cEFr#;$UP#BbP)pyX3B< zv518esvjb^AtF7z7-^tQPiHpj=Kzt`|Izf70a0$>*F$#-(kYE}NJw{gN(o3vgLHRy zcZX6Ujg%lE9ZCz*-QDk*`+t9*{Bkez%rocgSZnRImtU>!;WPm3nh6j!D_CGlLdWEf z#dtz2fx^c(RQzZ3Me3Ad+sg0(w(;h)s@QH}l(r2i{a#K)jxw(uC)QP9>u{mBp(rzm z;rHHG%DPt&F3%#g;~M;%dK_bXyVzCR30x^Zo%8F;!&biCdj050pP|C$Z{NNl9<6je z$01@6Kj0<xPU^n~Gw;V>=%Lla>2UniKiGuE$9Cd`aKKUv9{+Fvr1Gg0cLoNw1X|Pj zfM|4C9B_n_F^Grea9*E`>STR4^LR_%|KEe;saq5cz;xV}-|#Pv^X)G=`D)*vsS_!z z=K{!>vOs(xpD-#6J{0ngXW)}`{brAnY-20gcf=;Qg+LO^u>&{IVjlns<!Kcp>@3!h zn?H!Y`!m&*{6IRP0`1l?_utu_T<ZtH5ibWwzDo#Ol9Z&KpGQl&jiV$?ag4<enYcTp z4n{J(*%$vFe2M`Dx{5S&X&coVKWhE{tRX`~M~4|*iIaZ*Wzm<HnVDIbo_?Uw>+++M z?V!^$C#`j`Yd!iD0RqpYvQ?@joo33dAfZq!yb0Y8(?XjuX#ac*=SEi!Cp&<_R^#Ii zuz81EuomJuM|t}IK#t~*Z=O45^vU0Pe0>_A@PF$G;;rx1r9i;8KC#(Q@l{K?jW?@u zlCY@fsF{n{s}pbS+!tz$jsmk|dahrW;3cqyF^IV*yuA*PRKJETiKse?Q_MJx(?mwU zSj8X|Jt2a|&oz@bX_yGh#YsIrONxHF{&chx9My0~E$f({4(3jadF>W_;7#ZQTp;b@ z$j_n%HY_kd^8lXG4{VXXv%PCN*acnQ*<CeRGd_20(;edH0K2*BO-0-Q!J&b#91|Vx zSGb@#Tv!2KRyxT^Nu3Ceq@qS9RZ%~y4geyvp9iEiarAi}YrlYz=TEXd@3}6)%*OUO zGnuxuO0C7yhr%RBKZWcr0teSc&4=y^y#91gLLU1i-Q&Hs0TJDAh}`l-!MV_WfZ-X_ z)aMmF^c#^<-3?H)S|LM(A-tlS#3E|v(;s)1TDcH0Nn5Hx!Rue8SHDF^6>^>aprdb- zn3re7!ozdP7EQqRG|k*NGinb)!&ZJmTTDsv5F5YN>nHPcw6-xzxgu!O^sbo|q^oc! ztsf3>A=1`QyXr<Dv(JM~D{qAT9y|=Br4a!-&Hi=m*N7WWJF_>vIR@5}^=Mab71=^t zq3ox=*=E<U47nNc?^ifdx0iobqGuyNt|>hXR>1p4mpiuXmStb0VJ^m?*(T6nA3)x+ zCy55hLD>r?x^E`V$kuc(m#_oz;SJqg`+;LiGX^jObA%QQL0VrQ)UB<p@d5sG{j~D@ zbiMLaco*1sJ@a<)M?SK8fOC3+WWr?a_8AaK?fkrLl-%kzLwMzyt%twK<wjBO=kGr? zaKOJ?JLJrcA~~B!gVY&^>T6u$&Zx$nxAH`jfHoWXi?0v-26>|Ip>#wdEatv=C9HcF z!yL8NO&56g)J$<=4dc3BFi9ZBV)&R4?x!{w;JnCq+5cGW;4uGf^PBOjTQh6GgLp!M zfk)bs8}I^PCK<~NhC&gZ*i#5Bx&8J!Y81wALK-9#2oeqx8QAdu1*+a+%iK{gx7%c4 z^(-YBDUiV9#T@R2-ag1ej9kuf&bK`gryJoFN|@|&lqJ<_{~1QU`w4|n2~!z0EU;*@ z5RO7{9E(t`>X-ED|3i+Wywi|vg(*bJwPISihf#dTvD~9kUK~B_K{pp*Q~eB8eVhfT z+=AoY@6SWvS}sm_jpdZBG%ExTy>VMQJAVCgGlc-wh?0D0a38r|tSP|Ai|)PKI@3`u zG#eI<SSy<N)0w?y{KvAx^{ejH<3V~;Z~LL`)m74$0^*2sY^L|eX2OW8&LHrqDJqWG z%P#5eV8&wJRQ*8x@0WgZs&6H&(#p(vKV*6EiDzTS<TPC5EnkhzY>odTPo;lN2`EYl z8fHc-wX5$wRK8i>scU`IHVe{+?U$c=uYFWOt>iVT4Fg5J!jV+L;7BAllYdO9`Ao^* zj}(;AF)WcaqMoR1l^f3NOitS^o|u;2C8it`o1lYzl|G#6^ygl?&G99)Ca=(yHJeXW z7uENBIQZ-t9RB!peZ4dfcs-R~PeO6z+L^ni_V#u*d%x?yM%jyY9BJxOo~7ddXbcuc z$;P=MK!PKF<1PdDPvs@PCJf4MK$<oQ41(KjiSZLImKElqF>L>NgnY)O<<K^q9=aqn z6P%keZ`Lsz8R#KE%g)3e9aZZye<GIfj+36_Fi-|PPOtIdQH7}3{AB}9S{<uh&U=Tu zbs~2IA-vtj2zV1e^-$|~>$lGk=K_=6HaYI$@&ERXdc~N@w?%mw(}~$&<d276J9O|> zUc2h`R+TtRp2sm{DJi+k5rz%}8bunYafLsB8+l`AxS{ly)bX@P0X#<GOIyJm@eWZM z2*rf+p;E?M&jS~L`{ion3^0eBSXIB<-rCCR!(x-S8Q@ICqRO3^8Pl6WA;V7<pUtox zuKdg0@MJ)6EBtSz6qkV=Wd}_bm6!rx_}6^hvfRA4TZjz+HVOy9_MsS9R2Tyr^k+#> zh_aDq!Nz+w>2f7`!<Z~|J$-QJBgGfK+bK4JYIB+ZLStDNQliypK^OB7DTDFM>NeDS zi;mA`W62JQXsxRkzw<#Xh4!0+tByGsK5+kC(WXG>?h@QU6w3FCoR;LZ4NU;v`jDKQ zOfU75R5#)r*j!QkUcXI^?zC_3S-~bULViB}Q9b!tvYjum+fOY}PT1z&rgBX|PpJn+ zmf+LcgZ|nt`h1@*0FbdAJXt<#h$9PGj*XA4dO>m!*-5$&eqnXsd<T51JAlSGO;u_; z7V@#3#T5{`Ey#mOV24^JSq`Pu(^ROXf`EdCorfISyS3*jWR5~PSGBr$IoKDXGY{Ve zYea`l+uR9VuK#L<VB>H_*e^C6ZUab8KKY$CcevhZamqaRJZ5!!x{kpMDU!;fffeL- z*%zmEf|cf-zaKuad^k#?H!JWy-g9jL-?)Q|>)GMB_D{<rc={0p$Kx0xE^;rA>9Sgo z&xYfW?nuL)pYbQYB54{~eXYgD?+U2zvYr3t^9Gq0(FD0?VAXNsrfU@;30x6s^KJtx zGt~2aK*&B;0~XGbdRH|RyA3L6x?cXPz+jlrqRwQZIn41=>K=X+fyGXmQ`U3jgVENJ z;}l{HK;+e0siw}>E!|aA@_3|$@u447Ql97aQH8<nh=k{(<}#=?1Ut@#m@z0O{Vz&3 z2gVUcmbL7W`3e9(;&xLR8WDBLLld)ME-nt6Ec#=u7du47*4DPh{3o=O#LYm-A9ka` z?;a)5F9IGUwUTS^bv~<qSV^FgaNC$09bG%LSQy%?9$fQ}ax*GElR*^~DENTRZ96e! zc?FjwdOzCywvOiXS-P~WEY1T6(b&S)zlLFwwfTeS$YE?GLRU5%rz{OSgH++eb=vER zDFu1<&cbK|SP-Cle{7n(*96jUpNIf5QfN^ZWu5T4Zxe;Ga(2+c|9&x4$m=3v?!y6K zLwy=n!pYQic<-AE&SYS;X<-NS@cz`Qa81HNRc1qGZ;kfr_bLp(Uv*=U@V;JV2w84% zGMkGZH6R!803!5U#7<+U%N~K~24{&1ALQMDEoa3jLfpAV8-nrve}#pPb@R65vPLh# zJE_P(3Me|U?9TbL5JO7_hluX+Dk;88yIOxA*cw`1C~`C_=p4w1({5hw28F>9lOqGw zR<QiCr%gCe#SMW7!HU|KRBQYNcq^~O5pk6*^&W{BR@_?itpDhyJCy8`gUky@0vOBr zi0ptE{2KA&+vglm?I0dwuz5t#G75XM_t=#jxAl~{izG!G_7RDF%X@s%3Hf3ZIl}ZH zH8~UQ8Bxme?PYtVzIR`t_N-*oRsCgV19AL-SE`u<GML9H9~P!DHwJNYgP81I2KWJx z?s#lwMz-11nws2cKr%*sQ<>@fFNqzgVJO_A`hd$G(wg|hd;#oTbKUkAh+UCLb<}9; zGEou(uyj-1IRA0bU%dBTnsy}qMfSXoNlNt4OBT7tk^<H3AIUyxfe_J=?{{ate(y)z zIPhFBtvFWnkGPl{qSL)DSy&SIvL@#}c)(2}0{9iy-U@(RecAa1rOWYfM%3g1J=Yl# zvPn0)_DP@_ti?%NXNqc1Pnum4|7*ePmSzF>p|);X2gq<J&0<Sz?8f`#w9PhO+W6I< z9!&=`N4`nC*e%Z|k4{_BK`w;4L1l{#+-)NoDOAyBO<DNmTfY8FgNnomxn!TEM~uag zz}6<sgNBcdSVe9~ty=XGQ0T-?I_{_sB}3`gYo2dR=zPCQOhw+96_oZajSj;Vj+8_+ zNDS-lfaX+U^CeAGmj9ydQ^s8R5HJq!I0Ul|<5KI#IXO88zBjAk$xzlxd~_ZkQeL+y z1i3maI>8CBW7=L3t5pL)O1QrI$(juK?tMbkD1_+xa(D>cFopn(tjGw_uF~aTqoVpT zCniTgego8zW-@HgnGA;$QwSJ>sF&4y88b%?Y+A(I3jk(IaI`xomj`Huz$K8fh|uNs zr(FeP=3K&l#n+U?2~G0fR<IxZB(+2>9P_)khasF>MaITk8(P?#n#D?ul#+nTFe*(R z-XW9oLzNl9(@JQsAJY*>7t`FD&?3Fsa#=t?RKX&r*VAV(6!NU!<=5!|7E#ddxl@2^ z`R?y`wyYDS`ppjz7sd=MSZ!mPBFEL+{s~FgMNKPNvy7fHtN(sq*k)~=fbs3<EVU@? zo{B2ugSJ7ko{AQF-8yO7n4$29Yo@|8DhqRM{lCwHhrXMO`k+g0=kkAgz}0*4Dr5pk zAs>~3X)j|dqk3aPTU|05xRewMg;A;rs3n|etKgYxlA&?7BE!IqOJ2Me35Mb)5K0b9 z4Ii&wdcjbD#Yqvm)=GU$D-}M8xI10#d;IQ)FNMG%YeKl`ku^wj1Vi{MKLDq(1tB^e z3=as7q(JSmt<`L2#wI;CTkRJ^fnsbul<Z#%okfic08#KKGRgP{_~UwpN;oo%CjE8t z`7174M*{if`CrUw0_4+yUvVQ*hCYvqHAEPBm(v^Glb@vMWDvLRd4R!S^)a6cxi%~R zH@3C}_mPnp^c?W2{RwalH)@TIoLBf>X@0ca@m(q90rdmG<6=3qs`RW2bP*)Gk^)8z zQm)=)A>>#fF$n^dbOMY&D}?Xlu|)p`(@OJ>?K9|R$yuvcy>|-3uZ(63{n1Tc!wp}_ zjrlXY9U*};B+&5<`hgtB*6WCrqazH?LDbhD-x__-p(OP}hqpUhwd>Dvb&#l1J$9#P zUDAx$zkT?C{aE`Th{j*I%Gu<d-Xm*K;S*uY$m7$GX)=T)OK=fT>??AsQ-8hoGrQ#$ zSdI%0Gl<jE(LIgcm9@tXJ2SL{c2y-t+;K!UB(ryw??3gES{)_?j#vziVXku?1K7KI zp->7>`G*4?Vbk;J00r7Jc@=Dt@%kkYqyz!!HuzD30x<L!V&v02YH=q-lQ&}>$1|ze z9x6}0YiJeHmL4Z0unbKvP#Zq}+4}?79HJFRBEryU&oWTqhshN%8?F-uojCK6dJ`f* z+mI_UlYb2C1#A<*bk7m+&)SK84}jqCyHH)}4W%%zgLy;+^?OgnNgy2YkjKc!-3f+L z;Ui&}*#z&S)&X9J<@Qr7p^JoYweL%Z%`1MLAZto1`ohc-7qK(w)EMv<W0Sfgp>Y8r z3>EDHGp0K9bhgm7ZjDJjd7lfLO`$;s!gD6jW~)3AMDJyV{Hk3az@)W<s@CWiy8Y`D zaaocK^rGj;PedJl{}56J_`a9Gwe^-=c>>^nH!G3D&I~k>(?qjCs0v(}h2bgoApPGo zHqBO8Q7=hCP8o%TpJWi%QD^zWD8b9Oq>HA4=6O@Z;GVhB!4=JUBo6Qm+`z!{7wpdi z?arG+P{UUHG45D1L|Cs@>_;}d0_WH~5p`J5L<;lV-n}8NdDmPs0z~V)0hg~u-T@Gn z{<ad+E`|gwJ~3E=kzPeTz6W8ApET|TY0iIT873r@KNh0`0t?9)b$G5FNty>UO=Luo z12v6lz+&Fp(qY_p#!8#nSj@#H?%R%k>04~;+tYgQ<KsG;Jq!mOV~`MBRfKQN5nr7T zYgOxC+Sm~E*!F#<4_&>ijJ<9F3Ucxf+%@dbVrv*wuNJgWtRJ7b{!WH*eZOd!OTWcA z>~OBm><s9(hNKq?!P+l(<2q9*gwg=g@4ug%QeBgkTuP*#vja09we9WC?_L2p{$(td z$ioR%%%FcQsIkf|NUIt!A;LmQU*mB8D-R4X-4KAR(E>{FB8?Njmp1P04MYVW9GZ#w zO+vSOT^<gw=Mn(gr-yiOt7G2ZA9uOGy_z%2KicgifT%8)$M~_pN{dj!T){D6lsMIh zXDdLWpX%5L=4TG=DIgRfsC-?e)3U@&%^WZNt=&^c%v|s74yH<n2gg^)oleikMJ#jt z5kQU~8(5$^OhqEpy0=C054I{&H6$-_3N8jl$(Dq%%*Nu3F{GGC-&24xN6j1y8^O`M zTdhjB&h+AoR%Mpdkdxitw#!(Mg8NR1m^Nz~H&h4}+B7?FS9xBDVp_Enl#=PUQl*d- zsmc4sM0%bbHu>kxn*f|NSSE(hDG}yL>-M3!9f80`{buga%^t_U^x7kg@_>F_%Kx_~ z5vVPSWH;FF4qjK)%Z`I<wGKtN@vf;rz^&Q`laA#46Wi?h6m4f4{RVpsp=yV(MoX|v z=)%roN>uApmDuUFex(n@5Uu-wIRx@u0GtRH6W|I^qDbQLvZn9Dg3Fa29I6Kn9<4zD z=3pdLeI!M*8K#@|?R68V(N?Ug9q`3HqSyI=C}P&*Y~$B(`rm{i{Pd|8*cTRG8h@%S zm|R4t2b{gkVdF$>TkdHy1<M8F<4I<%hCs>N!pC?K^2`s@9A186KvDuZaPwvj#sM13 z_u9ZN<E=s4SvCRqL^UT3d*t1aFalGDadhr%p2}SHkEJth3N0_hn6;~{?#2X<ZS!?p zI<>)n6%>{oSuiF13l8-fE(zuj-DB71tmc*h#`IK35^up`O-&0JXFH<cSX&zbBJ{xA z;vRDVDtwE^l2(s%p+F@-p`oE^A&U41+VAUIhEhQjenKR6Xl70PmI_bvsa@SvCjD>A z`>hd7x9`4};BB|fR;aD34{qP;M*{_0)idZ12$U;NKQ|HIaKcE6o`g-zWY)3YYQ~(w z@`zN2fyT0eT*zyw;~_u(HMTfA295<VUDT)oibN!CJmc?pc{affVzc0F4qHJB$qYHh zj_?kr@!$P@axsX|*T3a~zyP8KrO8oQ%Cav-)@aWB5x9Kiz=_{q0U&&Cp?l9Fz@%>k z$TwG>f#X5A?~H9~+%?nt!<&+~TdXFUU+6t`g!~OB$h!9bkqNbp7l7RrM+#IS;JLWr zbkO5S`ID^PT4QV1(iJ7t!ysXioA<4x)+GKHbuf?frpHK#P@wrtm-W?rkq;zif-7DJ zc#;dY9rTOXIi$7%v5TAE<sY5r-}=vAFp3*zruHwd9?$cieV!uCR4^a6!Zd$+$J+g) z3b18)&vQ$QDo^PzH#_bPz`*`X@WB2*_VU+US9?N52-)oWgL>!}UvYSxn9v2*cx0A* z&3faIcRrRXaaPJ+JdQ>Utt{(EfHitzQ=NL&@d}d(&4<{shB{^(6HV%hhv5M|b%>+r ztD$TXW{lr=RRW0UgaJ^!L9w9g9=8H=;^WGbx4sS3e57q0n3&xG9z?^=A>Q{bk^=iB zSAQ4Kc8A~UpA%})Jk1s~E~d9~tD+X{A8jmoA9pklfc0;)oIQ!fU?5tc<GxdTR#F>I zt)iA~3NfNNW4{F#k#0m?L*uY{Oyvq7dEglRsL^Du4pK2G4Vk?8?c<<hgbWr`6<C7k zcl0LpZ@7NnCi>-@FR^Dhx+dsG3x>2VmVL^RV9>}A01;g}K*ZHf)_rTEWnxur22eYn zUXWFfRzM|^5A>oZ9;L??msJToImthhMC88j4UgMC8CIOSh^Z(&uc!>i=L>OspAC3= zymu$#F#UNQV`~mpU`daFP?w(#gefJ#3jB;dvjn>#FCCo!OsAfFAhZApr2cQKb3`)@ zIs{}k`8%3FdlGQj{2$L?PQ<z`Y(+4P6C=O0+|lR=6j0$@j>ZlgeM!1iKc8;Y>^=s< zc{#LN0-&Jmf4pAFHwFtuT|v#iq+esu>Z@FSZtCaP$;HN2>t$qQ6b&Nn71**U`2aeq zuin@8qyU08mg?hB-}Ur0jKpKdt>ZnvEQ0YsV>*X+=pwCMQY!%ZcK1B(BWUI*O5D8# z+l@Xxgz6Y+kRw~erHm_Xozn4z-rRAXdz3a_vj{9EP9n!S)V=4mU*hAxI^fH{r0W;M z1m_3dS*+Jm`K|w02#=#&1}_uQH(%UMJ5+6{;D#Sv=2az{uyRP;2kc2^c|p2*TB?6U zYUoVO%&1C32G)Oglet)2cCy;&PBLNnzc!qBOxGSYUb@soSLsO-l4HKOL+O97IfKAj zsR&-b?@F0~FPKu8J&hAQlC`9Hl|G{nnm`Q}yOYM#w~K|3_(_VeY7w<;80mim{r+_a z>c>bsDvIItBH*YX8~-D=fZn>-^Sqyj6+*>RS#bx`)Zgf-Dpir?Jbv0+&3GF3-#(x$ z4H@6={pIb4yo@x6*p1S0Vcv7Fto1D{HG&o=E~wN2$Tl;J<?BDnZ$7nil=&0o@^ENk zPvp>~fsy`aQtb3`Mc(cHaeFYXQh~aYo7#Rp!v%J`Sl$D%maWJu!rNuv>%aEUv6C&J zqV3;bLd3|wy`w{|OWW74l2=gJ?~#Qcz?00leS)VlTdhZwQG|s?ts@$q0an-MMixoX zK|xn}y#R#Bjdv_D4{w9bEbDnsD4HJ7j-HYU`{>fs(ndl_h<w0qs4FWg?=xzYEj@#t z%gxAbnC@`pFRJvWVpAH!v4+|Tq5gsijpN9M(m&@K=&WHi(*}Ad!HLQPZ2C0>m?>Ut zI&I%nd}{AR6`F+^Z*^rIeQRWW=;NL(4KPDH;A)&95o7RaLO&YxBww)BEs0a(`<?ZR zGn><W0~s!e;#dU*#&tn~<clut2uQkiTaCi5E)hRvG@UVa>0nUmamtZQe6&-bp{J+t zd%DF`fdUCq>;17VHK()AFgdUZm?mj63#VX3Qj?OL-0dPjH5~YVUo)g26}2<G|334v zSSIOHPgk-A^e?8q+t{uu8RuEUe0Oo2C*9>U_3}nfpuj<IW$P1AZiV?>4l&CBuLtIS zhNy=_2Y(VElKfb)7=zehAwo}eIH3qp<Ex=RJv|j9ieNUwtst}&S+ANdqFV>@HN4M8 zt@aN!T~Cd-e?cLAUt@FV?Aq5P_J{9(S^%dCY;wp7tkrigzTM^ydh4!j<F10(q1Y$E z)hT_<Ev~Ff`46m^VCy2Ro>C*sjrVK4cfO1NR`wP@-c^oB;?PHxE?{YpbpGA??*BID z7Ib<X#A?zuhdYzS10ykuF+J6z{9w$d4}R%k>u3-U5jf`utF;W>gis-O0T3PRFMjA& zw*(~(cB=)~Hlfvqgeb(Zdu7=21j~IxC4;?C1z?Qo&x;%5T68j|3k}x4*nm0D?7;Dj z7_3E+WOvtPdxM1KtGo1Q9Akg=ZmX{~@3}E_5HNZlg-T$vBAX4orz4?JdlYH{mxB{y z1eKich2$F@_Q<L_8TlJ2_%vPu>Ff8*$(A0%2r6U|D!v+^GH03*GbM*Fne>+2l;D1D zA~O1XH5&@dpftt7@2vB%fI@lxXe<IaW@fNtB7=QnK=93<hlZ@v=ldAx-&58Hc`xQ9 zA{dzH36-r%V`npmuyzPO(7qMI25UrX4$HFRJNzC?vKE`{Du2PNegY%L`psaz$n8B% zMGL6%xng=!o%nS*zRugCgPWwrp&`6}u2kvpvp7DE{QO@q){_w4ul%BgCcAqLFtB`o zb8{o5?lUK2O}TEml%tLB9CoHxh<m!=oUL$o03+Cysqj?QsXD67%g+J4VrH^=mH1k% zr|A$`hFA>S8rE!TJFZ5@Ha;N+M;StAWeG!>*K^BE6H-!2urByVHcdbhE6fTpvPRpZ z7I8TbOY=CW8$etEuNAGwH%8xvA1pLb*&|bF{a~9s9jOj^LgDhZP)+H2dJxKAg7GaP zop2?X<$u~Kj&Jf@i=<cPRHy9)b!tw&&)Kh5gve*cbrlFM{`%$i@S<=$0KivhrC;%} zA~7SneSd5>-vBA7M}?3=9`3NyAsB42x~W-{g}?-0iwm7}!(AWLE<e&U!s6<<l?5=g zVJKE-A!Se63=7o0t95X)75}62ksJsQ5>X10%)nUm81QVRFi0?`3*Z|lG^ImO?eKEN zdgb)N08^WkzAR;cN)-ljd;x+NuvhqNZ4C!-*1I#1$3$xRuo(II=d-i27Mj+L<MQ53 zn^wOvDQ79FXoMDe&Lkay0`_~3-=K<v=_$G#MFj;jNBIOmC-kZ03k&(G{q5sPu%rn{ zfz=UIt?Qa?{`hBTK-7T9rLnKuzM0}ZbhfBRkm17rWp^=Q2O~4HjR6g*zO(aLDClvz zj4NGPU<|x1xr!q4O=JuDvQ~0#>dh2m!NQf99QOCH%>MEjpopm-5P3R{&o`=Qr~dQt z41>hMLF4DYRu6oD;lzQ9K0sMe=vf{Qnq|I++j0M++>DG0>P-)*L&7&;*{#)`Hr5`k ztacRsW?#v^)pzIxJ?LA<tWp{>8)rDcY_GxTR<=WvAm}bi;3QUAWQ}G)ZKb^QBZmTi z+k9~@HaW0`QyUgPcq~^iU(*PA3uyi##Q6s6k{B_q<_c3`)AE!ucsg#8Q~+<E7hS<o zi4FV|@;kf6k``2npTN3%6l9MWhMy1HM(Er*{SklspXNsvGk9G{JkHnqQ<YRY^!%MM zPI<r7Z>#(&ZhQ&2WZxD5dA5#|dN=(oTpU%hZ|}z+y30bLWO{nzKlZJbjG774G6shN z4q!ldNicEnCgEwY(rPVw=jTI{fDr+U&_2?TpMxP@kFTJACVA`%c0Jgld53y_y|xo8 z{&?pkE&<0x(DU)=b!gppf{{+Pp_~V3NcpT|6H^Obe$9Ty17ju_;6BNQzWHU4v=sHG zO<CZ?aai6BgKPW;dX2%<mgTAi6nz&L$wv6cLtn=+VYkrWSp#SpoLg3)Gc*SN%Ijy@ zMEn1EnZnpAA2^tTs{}BL623Owrb*-H{y<|;`Qdq;t)(=M4pixVO?K;X&=rbe%z;ok z>I?MFoC0?^Ev4g5teu|zalBi5{gf6g6SQR;j97*xv2@OC=y)UQDvdS_yZih%Tt=mI zUL2^-k^I+yFECHG+kJSfPNxkhX?(3n@L(iKl}|ed*^sC(K;8^Y;Fx&hGkvm@BK_Rr zH(O(<1*#eMm_R1amn`~tA|HQOu$&wF?hWFd#w9{HYb7|t6zmwjY1J5bVih|c4hx0? zRO%-3zmMk#74Lu{=C*R&0Mm$k1i!*xhd6?)bQm2>7huBLtLF2Ou>rA6do&nBe^X3% zdl4`uMjoG+TH1g>sq$jZES~H`ihLfh=w>*&?s|TVg1&PRrRdyA)Awhe2_Xq}6JSgm zKBu4mhpZY+rRL|Um(r_y8SqSbFw0WXK$^+Wkits1D@y{cMdT(Omq1x^*PLSDEY@cU z{R5joP`ndoeaNa<@#Opn+UcM1ByWz`i#5*Lua~_)0DaAcR<agW*L~ch@vlrc6;XN0 z0oKNtz%Y`vxq@}oTabx26l7%wP4H^sgaV@iv8kI?_1=JB^7y4>zJ10kfAppLY^|{f zlRy@zM?GwsQrg;86SP5rwT{TxB0(5B5c~N}3z&Yp&A!}!u5$-aFuE+t1(=FYS5i_k z<g;IDu^&LhzX1A#ozn6b7WwTA`*HGb7pcD9sR|UXzUPdf)&T}raa^c6po`>iY&CdY z0?-0f+I`;{OP|aBEBOI^8lAW(+Sj1Zm+W}fBp5gnu36<FuXnTjhAY+{DM_{A`TbNR zyIjThle?FfK(QJuAX{pBfG#<0psYRPUT(CWjD66<KmZJ7Bp^-Ji_bV}vXh8?k1<^R z$6`gSjQ8WXP!F7X4irsvpwmdNRn8=MXCw*YfS>D-&dq(g{oCA#KsYw3U#r{AHnW(6 z?@Tmd<_l8^U}2@>U$HsRPV$WT+iCW)2&J=E8g3rEKQ-DEu`HQ>8-CDlSvgdEI*aie zv|sOpK#%(_P=@Fyt`(S1{{yO{N**(n_{wl%F~4p&7?lM6sPF%>dRx(?+CY<M^uHfu z)Z&~SN&``m{?mPdUuoKZvrIx8e(WNUo9+NRp8I3RQXW+7)p!%oFUAZ*V>rRM{lbC_ zsCK#$!88|a1psU=Q}!d@fxg>;3s+Qg3QT8nT>^M7-*vXt{kf@lc+4vXIo0tN{l}j= z+zP%R`)2P9DZu-pQlSiX=Qh|*MC3_n4sALU4Ui^WsC^mKK9$s&VB)pRa6M8Wan$V> z%B5jbKG37G;d|TP@2RB2-48}31U{H6>T`LXnIl$j;3U&2wSAcX_QA$@G?zis1sT%& zFpE=!`$fO;qtXAJc5-1^!sBje;~BJz#XX{*6~Ho6OzTVSBWx^2n}8_`Z>{`qXCVdF z9R1=F?PGMJs|(ivFTaqSXAG?=7bkP|-@himTZFugj5{sI$;)0SWPov?Ul$h_f?S-O zTaULtr|&-Z13Hif?tO3=VoOPi{5LSM?2_h-p$LnQMM2YWR#yjRYSgSOe!wJ?>RBzV z#|0IqgGn$X+#BvGe^1!ff>k)oOCeN9BxJ%-PY4|ZgnuPjwQNltPXfszw2B`;et86S zr0++79M_T`_{$b^7QBUtbTmWk$wW%^5JxszsR;ygsj5x3dNn)$z1-56FGyB|qbYx} z1%Y&2;uB4vX*`7p=5Jnym-u93&K?T00?+4Y(pi_CisC>~?w_7``eZ;A;+MP1s0P{r z9H5Qjyo4HHSNt`cF0|)L5}ATwv18XJ_n@q@xSi_Hz)5wpMK?qT0~<rQJfK=tMQd3t z;y!_LLQ=i&fvH&M)ZwWNS1Qw6_2eW4aF8%h4kx<w{@}&`k|8Gsej^~>TT`4LdHmu8 zn}blH&Ap)WeT72(3t{p`E`Bm>(KtimUlbG}L&2){W|m@L@B!1x<@0NtR8x?=5y5zF z`wh@{hWgN<vuOQD*#_S8WH2RCckjRdJ=$XX>me`+UcN1g16{z}Tx!i`XO5ab`P-Yj zHy~6Gki^rDl*lE2#Na=j^^<!i(;;-`g`DbOgf$Z4<XH-Do=|pX;lOc)UyRF|Ox3~* zblzg=tcEFB;|TAeg&+0d#1I^n-3h&l@WV;3Wy6dHbqDntR9@)az@v7KcyaO7&3g^G z=%+^8zqetmx<hao!=5n%g-ZzQzuJrq;)Q+hVpNos$={d_VpA0BenThWJt(W;H|}sc zPAvb9Xax6Qj8t~-Bjp7{H8}o4Dme&)yub&zr7*t<NwG+pe&~GCah-t)C#<!JO$021 zH?VE?fT8;@tkpEvnlvP5X6l)NP>J)`UeCr37^*xP`oJpOLjLY;uc7U1QpbjkD~!{P z1kD<3!BKAd^i+9|p?lr~BE_Zid`yrH{XJ~OhCzSB%MS1BBMndvu2iAcH^+T(ZDQWW z){I)2t!3opb$bDK$+c_-KAuF-t;&K7iox$N<j)f>5T78MSe~)^fc4a`sBc?<ZH0Z? zS65H+{2x<(uq3}I{G}4$h~2DGvHlB|n_OO9=mInTM^8;`LVSQFkRkWlp~8aG;RLoL z<50Lq#uB~i;gG;J-Oma5u6)LeVOh>S*p(>VQMbxHloBB@-1#V+mynP!R$)kz9*j@$ z!&wm=$AoX0z8rV~gjT6&iQp)60DBL4XXkHkaItQ|7+Q8aC{fY#+oy!jInsUQtZpc) zsykuUPyNF0SZx4OO&0yke>An$7fn=)YYJwtYrtiXbgv;jyUC5Tpk9RW)$J2X25~8b zMBI}<yg=QJzadS=2G90J^;4}K7m8-FG{zPD9g!{w`XSf{BPt;B)TqS~tbKiRL<I5J zYhyVFG+Vgj+G>qneVH3*Sm=eF;Iq|k;RqjDA;o9gH5y%yPmTJ?L(pYS*C02ua;Vbw zf`5lV;&D65?rc6w<9XO}0`etRD?SiCJ_6mP`Ym=;Jra`??D%ze6s5m-#RL|KT%mj_ zQ?A*D-_uD%Pb`rSw5^P%L_>_1TU(Qa?Bpi!JOBr`@e447`W=Ww8fQ!a;8>sDtoy^7 zT+EY7vr`Qk^Z&ZJ&x<rJ+%TcNeBE*jD%7#}A@X5R&-O3ibPdf-uRG5)Ejbckf1OTu z#q@yt(tTjz98rNcmYm8ei)h$1oO|m5C<-?AfZ2W;)sS4EYL&cTMt7t!VJS@PnUngJ zW#Bt)+j?FcFYLvY6n71R$WbRytSd9kE=|VBcR(QxL$^-?m+742^Z+&cw(2r2<esL+ zNYv(bs9!G@jJPt&a6g#|oHo2}yhZv%=~-IInVz5L1&?nkqAp`axV~pAAybJ$0#$>s zKfi>Rf=Q&KmQ_O@!q==ZQq^o{3R<QxdRZ5sdxUSRn^2@Ksn#BakF6?+Ehd^k9mXX4 zhHjqo{N8MAUMR96MahjI?|8eO&f6_;-Fqz4b33z{4>jn!;`XcEz@|Pi{RBrc-xN<{ z2++D$eRh8>jH@JyOcj!#ff+wfkTSJ;*iyaL<`<C;3fwd(0MX;Y_lLs&q3!`_md?7g z>}KYciQMm0T=v>^m>ty5E{h3R^gs3YVu`c|zvSlu1{Ckztk`G#m;Tis?z1g=1b%|y zM7WE1N1Rv=F;$q&k2zWA=)r2hsnhC4o}U^$4NO>@69=$@R&YbVu>>u@G_YPUbl7iA z4*d&#DnkAkvYAE<bTWa97_hYYOtfkYy01I090)7E|Jp43tuyrc;h>LP?g2rrrKMi0 zU`cPiXYU5#M(KBWis*FTHUb!nS@{SIa%^3EP$$6&b(w8=C#b{tJB9V3vmS?vCWyUp z;^1~dI7jGM(e|LdPx6k5c}R!gG0#U@feJo!sw*H-w63igp+is{nTjUut&w|Q%&%nn z+H660`%K-3`}6H_chE0BP9vbbB!rQLU0N66;af}7rxUA8kW*+_>{#S66c*5Z{{>aF z!slEsIKJM=c<+Q2yjeS3gaVCl0P8+e`;uJMbbdN)o~U3Hns7X2q~GvJ(AGH=F%a3O zwy_m99)P_2Ie;7`8iFk@i=Hb_F!9^FWMzcQqHrKO)aE6dk&iu4X)9F!I|A7Qx+6>X zhT?PuZNSJHMbv&8(?DOuGZi=eQz^W7A_BUi5EBNBC`|4U#SRuk&&8$)q_#KDC%u)m zj;GEav5C>u_H#$B7QK%>6c9QY30O^R2)t)(Pn8ExS#n0P(uZ9yEM;W&o)gV30<D4w ziHwGP^aHWQks~vaN)8jw-1j=O!Cubz4dqPEQf2FhX@HmvlX995&bTxyqcL@DF1Hop zG(`QFN>uVli7H|2wrTXn%4}n0f;jzTajnf2k^#cNHaeBO2Tp{7pY+^>MS#Kk3$w9( zHFp|`T42ypg9W*tPm_y*r`}NEUwA<cVf^6X_x8)b_0@XU16J(F*wxavqK!$=C;G!g z1}jI$BZDtKGV0a!0B&vPW+Z(cVM!w^&a)M$Rca=SWmaZD%Y1nJ=eA%EBlBKg4y!@& z8$9gyQr`eh)t-A#qy08SDovOWma9LWwJ%wX{8nwUYmB#YfsIvHD0UTQ^1mA&VLi~6 zbip9k?0;P)gBWGnMvA1JSo-*9Sh2HephRL`DOyX-D&29c!x3*1ZZl+2^0pY%NHo9# zs}|f>cn}fzphW5s=6ALIH>d0Q$H3vN3^YtTZ>wE3e-c(V<^X{^Er3Ah_}BiytrO(c z&+)yNql++{4-FKOPBD$X(fHZhr0x&VK--BL%_VqVd44qB18ndekHhj?(O0y*!ucwB zt}}Yi9wzZ@4b|IYvk=+cur$W9;dE3{(RY164)sNus8Mmmp8|@@eZ&|)6op(Iiv&Y_ zm^H4aJq8eMVEf`8u}xrPq32(EF7b_eRyrz7_IF!^uZ_xo14*=-KK}XG3r0r5!DQyz zIe1z;Qs7Dk-gcUCJ+M9$JZ?YVg_3S-?uWBhc;a|+NKUNChiz1DZy1wWuC;|jK4oT! z0GxSl8E^{cTSAYuzJSjtcESbPA=25Ata`+Cf|Y5kPYqM*Nd;6e@KrW!WN5S4CbKu+ zP=nzRd^%D1EvksP@KC7?G%9ai&_HTuzsK|o@bW?WBEWR|=)#<*hQt5AJC1s#G(3tQ zGYngF^jtk(o8x{;jwgwZW^J>Y+)OuqG6mPDt46zeVH|P>390H5gFS)Bf@Z<^5cvEw z0~)5E47f>t{(CVvW%r8Yu$t)UUXlZAL^xix&Oe=8U%Z$*LFjm-2Ye4+auL4=3w@eX zFx%)fS|z-1gx_7P{^S?<(b&EF3j#i8qA2!^OAQRZIm|opIH|&$>6fQX$TY7L@uf}d zE}VLYp#$>q*4<{D9FYiMip^)Mw_ccNL=J#xvWf{1P4h`yql`H=<_&%P#j1p<)7DoM z#`u-CNjv9@YKLnlIa&Ub=$pgoGN8M}Mn|jzeE}Ggg<JG;m_^o)7D<|z6<L~;(_JfY zCao`S{5^S`eXo9O#|8RTsRr}4=_b2(z=i!~jH+J@y8Ee_JONcH*Avr#w<PLOWk6(8 zgT`kq$l9I6ERWw|<Lu02kUz%s4^t$Umnc*rKgWJCk-M4->h|@KMi#x3rgPqMUt#%X zg6R0Ana_B}6rqHK*nXI<kxG+GV};%pE9vVXO=UoB<OGwm(%}X9ZlE-70IbG+`HW!Z z&P?@UH<a}(bvn38JwYesn>Yu_U6}j%0HGH<M)I1$za);3ssx^YOpRMeD0hF~EO-6C zm?Xbk0z#$f8!VK4S{8?H1iNM>cRzBspDB6|3)Qu&VQKanKXu!xi^{dzf^*Lt<pqkh zLsA;lTU3z?QD5bDlti->s34?Jz@oxl2_11>w;%Ek<JF&6ol*S@I(pKWC4g%5um6kO ziyid5pw^eGy%=mc=f9SG#!7b}e@T7~tIbWQqY{$R)}{Wl@~h3(ZqYHAEzOp(AtQ-_ zkHQg;2!`JO1VS&!Y8Jly>UE+Z*n1yxXcbx<Bsuxkw|jvoea3X2??XBH7#?49D(1#( zb!&H)_g`e!*aX_kI=pZ6qXxw#yb82B8BhKmEjFzHmxboh=RER@MKH)9Ld+W2x)#OU zPO!m7!T;^7>c00nknE7a@%MqL03lWBSKX)J>%O*NIT^zOFbah?<v6eho0I{JH!!DB zp>Hm%-nWs(bWpa=T(J7{V9(rYoLu~+VK=fcRi$v0Ay=<|6l>D!Y<!1vTN$K~S3xb3 ziXJ@(G96oAD#iD+!YPUUXDDkyb&m1!wTJC}5CWQ275o-hg05)qVsbP=!YM*XW~8~W zRudFJ5r8D1Q?{H=d)CiR7L$-vDvQU7z3hYPO?Gu|-TVPLlfMOMiKz6C=L(SVm?_lv zSNQ(RHqm`G9rfB(EUlk@D8JwmSD{S0!n5~02*QasZ_$qWoKCIGagXP&E|e%sS)NR+ zjE};hPFZ;R&aTsN0$Hj}Ah-T2hdzi`Ai3ylfg(Q7P2S|FZNDZ3pv@{?ts|AQ1u^Tb zh&_`&@73Nw)Wo*pS2dJm87ZU2x}>tS=LSmth$-r;jlvH8`lZIbTqlOZAT7)2Uy2WE zmY)-F6Pz169x3pK`=eRI!|7}yw2X|qAhNtWmY0*`PXbX5HUMaAcy48%5}}o?C7{z< z4%_=FmIEN1ht#bBw8-<{UCY~;w<_fRVMprX-Qm5Tx{9HN+dH(eCh!$rOS?-G@_p*C z7$w1~-%>GMKffI^Xg!P!R6@)5+B;=t>3U1#HMJGPhWLA7mMQ1z!>po)MO|iD3Npny znW*fpT05QU={Q7G+{IQ{I5~-M0x;8P!WDuJL@Z(;#=i`4pG`VB^vuuomH|9RCp3~d zZBBQA-pd;B4hyu<HD1YrHOqz+j=wR~BOUV1s2-m8Uy~{+M{dKh_iWKJzZ*ZEE+5C2 z2t$A05eaVrrpi8Sk7S;2HRTDiAyKcr(VV<c-sKf{<0G5+;_}i@1t%gQsn4&!N-51z z)45{D<+FGhPViYap6jVGZ-)T+i)6wCV5}*M5(lE69INRzSq1xLg2KlSo1^1`s_&W1 zJp#Yi52rDY>4ft6gIY2=UIzjj0E7~xnZT&x9(X_5-+a2#a2+#tKJp&gqeg_$Fj#=A zKCmKU<4zjAZ*fofS=VteX5AO9mBiQG>iwG9sP^&gTvzyt!hknqw3F|6upT4ta})3Y zxxx#;O$UT_`J;#B9?y7$W&FWT<GC{<*`${rGQ85=$D7Qiz3k8x=5waAkr(3f6M=Q= z9Diq~=?W^xE9fZ6RPrz9+lBDU)c)|nP=wP(V6diFCL}{k-K4dMcYDg4SQjd2OjI3Z zq2A?ZNOzUk69>`fN4bC9EUJMuo=NHce8q_L9T=usXaiNVeR1W@-kZ!7$9nZu-o?So z63lc~QT&XwJ<d=rO2$>5kUy8op9hcKfWO!)@y(&025U|f{ZQ)fLzcd}1S;l2GXSaV zVsQs>@?jazi)4V%9$SO8d-=~}naAWqs9Q=p3vEY9>sVBg(&uM|K}AO4w@yx_5|0p* zsk9g!>r%6DYSowteI%<;LSwiHGd~=0*`mZ6%@W~QRQLO#<F?ZCRw!D$?t6E^n8->j zoPQh+Zu6hxZ$LYn%s9b>oVYng5=>Lsn*^&(s^}f76OmF8ydRiGZneu<q{3&XBHoL^ zqA@aFwhTsslszs*zJwRncuQX&udMI@3M;h1)RYta+W@R{LfOjOojnZ0G3-()iUy+w zq)2d*D5D!sitHSxyQ`>2nXAU94C$^P5*zWarcDMgb(%TW(%#ws@)^5)aMLep7{J8| z4G$xc4N16>u@)`Uy<|nDifh?i=J*iyhXRyefl~tEppi3t@R=t_tMI9uPC{C+7a3ps zRU%opFEiKZE6H&@3uo8tlWw$=W7pAjw9vR;3WV|u1*f?G_hLbF>fwKm|4x7LZ!o6Z z=jp#gpYEq38nP^|g~iwO3sr~Iu4Q^kk_n^*Qo=;){hEwCPhFuj!#)TwU_}rikk<w` zi0@(_MvzM*<A~#$23?C5L&WjLf9GgCmOpDgTxXUtLSVYl0N=Vv7TP?U%6P(D+4oim zOP#o)Kmu|m`U*U3*z`|SsuHxFwo;eXpNMSc9k*NAEDR7@I<QsOu$7qS<7-cj+tgkX zK?iHHnpbOK$^@uix|!(qn~nl0$@s)^Z8?xaUcVpo^GbcyNFZ7&pV~B`I<Wd`3cij? zL_|cAIpxAb?Mxh_k5XLrp(bdQ+T(ZI(8>w`2e*NNkFl8(F=$V2PUCtONo3Qt()+M9 zioxCg<ao%<j>T<Y@#CKXplc>!uf4*JgaF#I0bcp$lxgGunfsF3QC0nzJ}2#CqlAd- z%CdT!q7r>~6e+T3MS#}DJc7mvzi4@ELWqmy0U|oY1m8-Bm~L&_YZ<!qKHvKDdd4g3 zpgEA?7+_N=OIb!#k*Py|=1$|mdX3epC;UDg8xBJ!a^_3h<^;A(6!#Q6v(oYk$ZH95 z@_weghoNxTU%De;0zThQ+gOh49JOwfLs5VyUW`<a7&1ZL!&GvjapCHIio4ErEEbsL zyM@POCIsY68!}}gxu87vf}Y=w%pPRcx5~(o8X;z+Sb{t<r=$m#dgA4!rDR2`ab!`V z96g6_8t_aw`D|{9{4uED@ksQ@YInIze@2j<I<i7th<<}$;Gg>I$N#hd6fjk+??X}! zN=WT5F*8D+`-a&@z*MvM@OUQIc3BcrjIw+j5IvQGm}oOOksn6UN#(Lq9iRnSLI9d& z{=+MpMY83RMft~biBC-a1tO@F|9Ja)tmVXUT@;_miU!Ahh<E1-k?~%E0nL;(ZoJJp zv6HvRRONrr$@63m5aQz=mQD4}iGa?;pDj<>bD}`3v+dY&GgJus{`to`pZ~tQ_!IgE zg4@dsR^zKjvvOox*K*9}uEm|{J3@`e$@6rUciP_I|5{>EW_NaW9wH~D79q*Lo?FfL z+Gt9fQX`;2hN)DJcoc`gQZZvF;@#I=`ijev#vfB@d|mM~c2RbH(Wm1Rsb!Vtf*-K6 z+#x9FK#`9oXDasbBa`701Fl04S|~V(zr5wrBxpv~=#~%#%|9NY6LD_PQFgj@AYl;W zSpj5TW$_nUJ{ekL(t64E0~5lDD8c9ZwXiff3)C9?L6U5M3@oL49iM>6I1IR5f7<Fa zT_~$(3oy*>@sS)?KB1BYM!Q&&q{+7-Ihew6xih<$UZYg^zeJ)2CO|DM?M{w_7ibzX zytyVUnG&J%BUBulszmbfmEnQ=8}1V8AItBx?tcLLYhNP+)@ARj9AL4Worykbs;p-y zTp}vD1bW?!X?qn;SnLx?b)OWnT^LHs>p#X1K&_`p{>FaEOdL515#=WsZ`A;9Xd<4{ zZ@ta`3x!>}I$|>yR2#qP&HJ5qVTaOKY<OEoV3~t@b^h`B`>29aG#ra!E0!2x&Cse4 zTN0VE4#nUleh_7~)K`*1o0`_GO%I`C00@V)*|wNg_>N7%vCzg)(nPsAf@i{+@ugtT zJt=`-@N>65>D*Y=18y|hl~fX8cvG^Gy<j2N@bBt(?#pv4<j<~;A4mj6Au>zq!yB?l zl$FB-R2z5$aj-#X0{r~9J2(MTC9n!_is9lH!%I+1CHkW9J?nABk@;H@*daTz@E8#8 zyNW^wa8{ghNq}AKvz|KNOBY;Xrm4wrPV8G|D8#}<(_m=+b~ahSr@Qvem0^oxp(SW~ zY;W^Kful_ckhGc|xg14$iWqd>I)5J(T$<Pw7sD5=NbtlW;0`qvS7tMok@x)6)h)bL zm>EY9B}(&NE`@<a8V*NX-WE4KQM|>Ccm#pKfSq=E{5u$Ax|go0ZWqq!ERM#v+59T^ z6a-D)Ixrf~U$&d<x#)FTu7Bwm`??CSB=dpLw*higbD2)w<)X^pW@E-uEp%<&%h8<6 zJVp2f(STw&s`6-mIEZS%%CU%7w8#G7Abx84l<9!AF@Os+tMyY8Md`(gP?+(8kf|o= z+PUmUx8ySsegpMr^T2&88r8+O4GRYaoTD>y@ixP>^#P)!hg7(I*ew6~PtV1v6rbM$ zXG$BuCnadhq3402B!}iOt+JShzVxoAZ?QTs0g8b&R~A|t=uPan_zcMf&<YD*ZbH?f zJ)sIka`1EfqC7s9*v9tuvvu@M`WrgCf*)}%n58JDy<kDF6+D0j==-R&J`vZRyUi?$ zM}%0tbzJt`_I+u;ZbuO6mbo?)RsCYn*s<2#DjetxEgtrbpBH3oXb^?-**=2+rD6Y0 zq{Kw|yU=4{?BJ{90xjX6ah2{82$UsA`fai7RS(!uxGEkNx#g8qHwslbpLVrqX+Tep zc>UxDcge;&KlfGx<0+E?2P0fKkisNi<xoZvYxP=zyWb#(#kjhJKRz<z^G0p#5!CpL zs>}&*nj&Oy157&Nr|}kB)3@-IT@=6lgkW^T`5v;(#!zU@Z+ktQ4u}*_;syg0q6AQN zN~E{ZwT?>PkMH5)Fauzc*Jwle=@0@a;l=yneh84iP7{zv=D&nTB?u5lW{8N#)Xr$z zjiR73Otc_ejiuh-2K2?SY{B|Zr58WLz{q1E!6<-TH_QpfP*>A_F)}h%zS#T?=(;O8 z=2#43De;bZ>Zea9XT8^7ThA6A%BoCPdA2nNK>dtRMN^x`tpD%{NO$vv)<t^bCp;p5 zfU711RMs9oUYmLnj-{#J_Uf*F>Mn+3pULn&1p52rEj*VWAw~JTRHki~m6u<TD<-1= z5lIqUGlZ)NOwjTvJ7U<e6s5*hl`{iJUUn`8Ag6nf4U!I=KMeki@zYDRd=$erDwA0z zqv})U1tmlp0_!*v?m7u3n=OoeFY_Isg0}@0n3G$dBXI053klj^gjc>yw5b$l-!&SM zpbU8+5?EUVwz)Nf{RvZXvDD1C46k0TLt@?9HQ1?8c<7LU?OX^Xv1lT#mxlJ=sfV9J z!E^9L$taQWTwIQePQ1kC=Xg}nxmg2L8L<;c$XT{vfy_~ACm22W1$DGunJ_&CtW{hk z*t~=lv$Tz7d-Tn<1yygBcRuc%vuaQ!TiOPIT#kN@H&8R|hjk3<4^z^>XW@yY+U>tc z2)qD3IROYGhfgL`3RoV_Q$^Cmz1ZV4Ed0mOCz1;LFR<p(K9+|q_g;JtNU7e)BmbED z$~Ulm{tLjaD?;^mRo&lSGLvgk{fl@P7R^@~BwNkK7+~=s?xOe)GSxtjafE17)@pfa zoXZoqIl(K(=~bT4LlA<3?;4c?3n=P*)zM_6-+yPPuB4+zA`Pzc?=Y=!xedygQ^;;z zz}x2d?W&Rt8vT4Bs|m`ZgMNO1?Lirri9w0Ze|rkE!tcwy<gh;Jt7cM<QRD8?3TY=E zW829f--4C7YS_X;LPAO87WXJK<Bo7JUkx6d7BfHxV&A;j=Xkxot|?b)Do;p7LyWgu zgnyJ#*p711MQOtFL{(jwxHfLxOGOJ)xp}-nMx@YYcj!D0-Qe^><!xQuOr(p5w2d0D zG3;stYQ)+x5%(W1s&qvPWf|ML2tDJj9))EoT3Ca2`aRQ8AqgU<m_40JV7!jHGf;vQ z6-^u$0F&`%L#H2cxW#N`m6gj5!EYdGtz}_Q)*FtcgLvXXopS~-gro(A@ZN3gz^H?p zM2)0|0$fL!ZU4znyHLKpUBq0Lsv37C1W}^lZmY<CkN0#et!Ad4_^WV(pS*RWJ7P~` zX9-$aSSI2@1)J~+c#NMM!oc4dKlU7_>$zrM4|R9|?Ny+us{>kM31N#g_*o?BPw<lU z-;Zt)L%{UfA4;_`e?UHc7{B{!?@@=Gp7^a~xGsX`^iXWbG_T~*2=aCR$IjsJlcKc- zmxb;bNQ6L8bBc{B>ZAgYpG7zZ1LvnH_W;>8=~Ep(j@~n;(yxBk5|k!UE$R^JkOxNX zi+}Bp_+?LL!)yU$LRK>POu(z*^?j}vshYAQDm_O*K>=kd3n%n^GBB+ysHJyP+0mtd zQNT;(lyd+U9`7q!)%ky%BdH@3Jldx1e<b+!@w;xc@20_nAhocw(C6OL%_<2PfcURZ z{i$|PKx3K(bO`Ts(y0=dv((?A8hrO@nIK=D;4LSD*9WTa-XQJ0WDHnL)85HXPbY|k z7mz;`jUVXs+>ks_06`2G_o1hS0Sw!D%8K%DF(vKS%Go2*{PA>bmwVtw`Q5$7qriWz zPGhF3LX3(5hg3FRYq1Z*u;eP*uzUKhN}JN5iYX+4wc!8Jblu@twtxS&vciq*oxRD* z-g{)1O%jq7Au_T<R%W(BnaRvfM%gQSgbG>NoA-M^@A3QhISx<PeU0<{o}bzOSCbr6 zI|Geyy0)ikVOXdJp_Dp=Ne~9=Zoe(yioAu;s<vcOGT{I3lEy1uU_yi=1kMMvmA_a$ zy=Y3v%xsFkCK+%ql}#m7A#eIWVC}U<WC<d4KZ8$7L!J*vO1_|1?wbpaylxScrAf?T z9eT$JyK*;g-$Di^jq_n4?y{Jc4fxd<0*(Hc&vgHM9AtpQUhZ0u208%ARlienL``+E zUX_k%p_K(E@VV&kQn7|637|KCGw}Y}NI`<c3)PpH8rs?yQC$*fR|)W0y^#C)ShR{6 z?oT^uefRL=q4EzH))1$B6?Np%x)@ILh$}2gN1lm?UO+=sa7cMuc}*lieguOc&hg@M z_zRxF8Qtnx97Ly00M6K&tP*YI0_EF(K>-F_U(8g7nAg0%vTv!=%ls^y0-EXaPJnJ$ zZ+Axu4N7?|uBUF?S}W=li!5E}P3Er4hHGL-glmHO1l}7(x~T0sDp(Fjft-7&v3Vty z1`v{L^1-6)<g+i<YvF_wT?Q#3-8dl~U&#FvOFac7^;sP9N6IJ192f7}&pq3N%C8-g zS7fcTPbVzMK+4v7+WM$H7P!GNG_B!hm}O3mPmdDShen*0F@GBr!;Pws3xRDp#>KcR zA)uJnHtxXB)O4DVdi@x6w%Fa<GaEsnjyhfP`b=qjTIkehIBTMGU+2FE94-1tZ$idl zP5U<$zlfRg%qN8}raJS~&q)R5vXdC#@cTYqo%B&lb$Y|eKkcU|ZC$NQ&fp!zPIhoA z@Xf$<f^}!<gVp%cNjEPan|MqMTi-$)+0<z+^sR`G%)yhBp-BBDzSwKUcPm=t!)WQS z;+7bEn&(5R$9KNkNU0oOTneM;Ej7c3yYVKWU+u^pxEQ=W0n9U&%7$)C4|WZkfzN7m zj5kO_)t*bPGOZtaq<enM-YdDW|7}yo4ffY^6qU+u${_=}W#3P8(gf)T=}mkFmNbo+ zLigqF%qLVnu(O#K#$<frxAD;l4J~l&S~gNaBgF`Y0xTO@Rn_O1E4Pyp5_V{`pWZKL z=CrFGFNdVGXh}}gEps8EK;Y3Hc%B=dh9l<7B#%a+@3>)U?Kv1{#+Hh<X8gESnN~jv z71e)>xtsL$B)oU*9G8IzZS!uO*;wFM=sujxkCaWhWvFhu<raak^p5Pu?$nC&RRg6l zT!riJD=Unu9=!HqDtj;G^_Mxc<I%u}vw-m!Sau53Qft<JioQ+I3J%Agj-}SQbBAc? zKKoDE5zK-?SguD7x8{1|kCv4(Z)Qj4sw(4f60rBg`GWk@pU|D;E()}?{ADFh@G+`4 z@wkiB@ruum1?$@s>)-Z@Hy>1sU&(k}o}Z*10<ZMJ$~|&$<u!%X^BsTwcRD=hAI=UX zH{LUth9gM^A3S)#!<#5>>qnrHOL!&%CC%4|O}mMdb16Rp`Sb9zbnP$_Zj^>ga4Kqd zzH|p8$^sQOzTOd}v8BX5uCB`_vug{jxUG7^l*<_Zpo6iXZ>uyZNGqJ4mfCYBii~@f zNa|l(T($9eUJW@AeSgJvBl+v=*HYt(6>uawo#e{=%N&>#)T9hx2YdyfH!lO#7*8vc zVYOKvGB`tneF?yk0+efM%jO0WfIgDWs9KZR{oW$JhShvC<l9KboWYfBu$-}@Ko=eh zMB+`GS(X7otZp0C%TgY#jB&ra6$Q&xaKK&+qsYd39k!IH$@lr)*E~s!)@Bp`L&IcO z2^@NN&E}=LYDXN?gRcPM#zHfyN5E90w=3)Is4>k&HSKF|k@{WgTHEi&KCk9S?<el1 zzRCCV42`47YOCWl_=3Y!5H?b1U4fS-zX$sR!{5ouWwo5ayN`qhL2a8R^<k+5-w2H_ ziG;0F4Z~~Qk)*p`OVaIZa|)k&@o!0m%z9n~{j}P02m4)%r$(=Tp0YAD&jj45`IyQd zbz4{UDhsKw<n-m8fMug=0|Yi%@$K~}+5Na4DnO^SDIpKDEkArr_O}SU&UIzD?ckuY z8`|Ymq~7C-dUlj#0(yuMES^UVJ{@2`BaeYRi5lU{O^AXU%Qn3HQC5tg&>#|S8Y&(t zW?%kIBD}RtrwMI;W~6o3unECJQuYpUBM11SkEX`P<Aq`+%@=c-UMUEc{$S48CFxK# zUJZ&ISpXK6J69BNvNAF<aL;AXInG5Yyy;#&y|0VOWe4)l$<hx;YO*YfLbR!{AiUK6 z$2qQWCqp?053PjX!tXoC6Q2A;;i=|M7B^>zfgtv@@S3taI<FWwGfQT$M<8Yq!Lj^U z&-|CN`s#|8b{QlB&cGQ^sFitp2Y1{eQWm7^Z%nHm_7CQG+?oCSxp%x_1fN%WsE6rX zj)wSNLta5|Q{7t(TqYL!@4i)s_K1(b+)E%MaV8GG*>#dMnwJkcl#%WeI|h&ZhV--N z#E9Z%<7Co*xQXw@G5h=(LzCDbYoAS#nQFRx?WXk5I^Ws+g_Vd6gk>DGK&eSh{=v3m z+3%VO%NZtny&UPiPqG2D#+Zqo=^lEpAcv*Qt3^@2v;ukNI21t3I7(Qz1)-ZVx1c6| zhHb4)DZYQl31xG&79^L92pbCRnw;j3MHOq|NCgrMpk!$gg!EEr7Uq@lvBGybe?Ku@ z@5se5jB+UJbfPHrB|~^wRAm?lqJZ#>pIC5+x*?}#(@gY6IsZmmAzubR<+Gu>8UT;0 zAeHPMKKniPe{i8CZcqwH)TZnH^OeS^><blTMB$&T1H7xV0G#9g);k*WUk#>-6<iCj zr@E8Kn8I0@2{;J)fHC-6mS=YP3fC0nl5%qFINoD6t9Edo!SH+jqSSgG8%HJE*|8vC zs?#8A(CWB=&K3h`9lUOHOse#ppSKcX;D$|KN2sf-6BywH^`3edzk9n`mI<s#hC?6e zS8dWHdX(?vpz*;xrCp{i)7;R2sP`|QF2XEbto+XxDmX923~}UemKtl<eKjW<=C>!_ zSAGVcZcAxtsWL=&&dorOMLW<$tf4{U)QAqKANq;<lBZxCo`Au*r=a!nbbXHO%KNNn z?=RhI#cml^A%492kahK)jf#rqpWcd!=s0L2Z=_TKp>TfiwpoN&nE3vjsMkpzB>B`y z$vO<Vg6u?!fYKh25pz?hj>3YqCr=QdJ;K`ewjEAr2(Wogfn*<4LchN*i1!Rau6T}P z8>vM`qW&`Udu8pYbnVM5_Wbcod@JA*iRtr=13|2?gsc+@4UejgNg=t-QlR6_-8W-l zGu@BhyPv9m6NzIzvEb!&%#?IXL}g>?i~gHd{!A~nFI$S0U3Q{xlIW<GVlGk=lA1io zMOEOE-o#M}J;ZuN9*FvI$H7KY?*alMeKh7zIz9dOZsm5h7*`WAu@LKZz9rclusZzH zDKy<|{RKTiwCwC1iZOVQxWnJ>WbfGG=j3L60xn?seC0R>=vz#=msfMI!P7Cv?O4RR zeHTXR_%t6Ir0zqVPfiDFam3*xiW=|HBT;zH;ASO;S)=n;6dXZDiH3tvDKBrbXyEz6 z{yj<<_l~cytNG7Q<sZ5=PChj%VKJh{Y}ebf+aKWRQDEgBzlB-W4#W=|+m;+c?j^hk zv_B?i6L;zH<U->+$eA857TxoV+rOWKy!q?ESGvE4?sIwMojjg{b`7B;-{w*i?_dGC z(j-ceM`Ki=xTx83S(h>H>y<HClID%kga1dpGFtH@;*sh<j?GoRhZ7`vT{cyFN2;RJ zW<s>`hR74Y_BGYn)yU1?1PW>tAC2A-4kkXcO<HJ>;T(E3?|QuVUhl1C+ISI>x9;+F z*o6Wh6O(PgwaGeYBxu)c5W<qCZ<s8&AGlCQA)j#Z{JJSyMo`$rAo>Qo^ed$18MFt4 zTF59X%E@s%Q)_R`w`4S{+(D|KCzGIfi@<im+EG0=JxW>O!Dtv&+D;Njd`<Qe^kLyG zjkP>M79$l-m<)$JkM+a;+_tXCIy5aS+7#E3pcN&N#2$>g`~cu<2~R@#m+mRb^waI$ z7C7ZR^5;NwlI49t!YP<RU^jR0>PJ{FHsg0CcXi+o#sgA0{;HAy3w58&r`D|1Y3As? zRqN$_1hja`nV3=HVe6zV9Tk?(_4LdX-OVm=_zvr(L-0uY<W+iQAA^hIO2o%?_92O3 z(_V*cBBoH<IE;s?$Msqb@t)!xjFLQN)PnNU`1;<z>{@WZEI{|tI^eEn@BM*yWmHyj za++vkK8@7A+YOI;Ko7TpYDJSRc)Apg%0AqHk?{P~J!H^QFD33h9`EpvfD<NUXprzA zbD0W``aLv-bC<;jZi-?KLq8=E$KaA3P4>cBa8dQV6{Mc=+NmM?_dTEXi6AzPXHUGW zENTo+FfJBr6`pBJN@=gFruq<DqP{<pPF#cOu?W3@5}Ei&rE61-E{7{z*7+}x!9lfn z!tL+qz6^g#M%R7rrue7DSQn|Cn(2KEC&!9i*tZsjpd1LvODYRs<t_vxojYorI+d(c z&lsp^7#vf5%vMZgZ8yE?T<=F{z>CZDve|)qDLQnaF$j3b3rqwU&`S+}HFk=AkfJBr z^tmO&sI9yE96&14jf}gTn#0#k2*qCRrsdnRwRh|;u!UwKAY-I}nV&|pG_EOh`6-t; zT07G*!t4D3Lje1^G!~<Ec+*l~?YE<E-^IU=H&e98X6d+9o=se~Tv)Ox5@~)unub7J zQU7o8On#0-$6r?VJ|8&y`2Vt8crm**^GIBI!i|9M>?oJ@^mg3n55`cITJ*eV&$8=s zYH09j19-8G5d>?k(QEY~FXB}<mUkjVE?X^j6a>$fJ_>l^l2Tu1nv*QoANXWc8&X*R z+Tclx#~OJ|;jy9`dOjm#`({;td|ugdtP7cH^y9p5@*3xdQqw94tcPljWC1C1<&sZ* zQohl=J%2b-a-hTZXuR|Ug;SJMiaF>8rNr<by#v_lLY02M8E*)iB{XyX^6unBV#47+ z7;@dw5OD0EZZ)$MC-;6G(C0%oscM$Z7=y`W!*_ZbEMz$JK4UQqqv&E}r&@#QR>ZJu zD2u>&Y=izoc{&~MU{0UwB{jAC5|5T9!%R&^UnNzCcvX8cN^)r{toZ6je8sQ;_;Z{* z2()Z@sA_~PsD1IGRYKz^Uj?hnMPFZE`-!$p&SNWnK;P-~yy{?nu9B<vv<X8hV93eK z%hTOMBkdtZb5wPfZ75$Ftp25bOerk?{Znb@1Tz|f-hc>aAb2P-I&!3q{82vZxYF4+ zoEvb=eyK-!);*D0)x|PqFI7<0rtOZt#=^SI`8BjHqLfqBq_IFglE-_V(#T=!YjT+5 z=(Tg-3u!=3JQm=TY35jejOu@}D={iLy!iEGbQ}bMiwPv}#fu~e6mgh3Q}nq5G-;f! zvQty<E|^FtlWB$lgz%S|`d>#Lj^W5<Mmw*Ukq24i>a`KREme(VQZhG=bL11e*uenR zZn}GV6ka}0zP+2i@$5727Y-^AtUeK7WZjfi`g@_qecGo-s`gt^O>F;%q;KimlapSI zBCYgYmV3NxE-?Ijf+Njxj{391e}^SrA|Jac>vO%$n_pkM8S0i@WzS>x>EUUh9y9Hi zH>s)KwGurs4<~d{PA5^*|1K@q+`W_RHxCxt;Y~%(s``%-Qt^~aH@q%2eh#aih%&K! zVVC3X#1|MQ<1&2LR_^81h*uN?t0tO~ubMlOk<~BIl+zkegVY`74GDRD1O<;Y!`Igl z7RL~`A^cxd2rs$pK1A|IC1Cr1AsRgW<(2G8F7`QlZ1MFIp%gjga%KROQuZ?5(#Ka* zvwtDTN>BfchNvFD4|}!!<ofE{nxqQz&$|JpyB#(*t0cdI&wtOo3&maV`iqaJ60jU# zVeXb69J@Cts1O<7@z%$Ja4oD{yd+#rQ!`{@ooo%7s{J(ba&r+7uG0>%#G7%DuI7yJ z5Nd0rso|x$ogz`BJ_N%`%`~4q^9C_x53YMh>*YbkBgi>fxc#;#<AZKt^eejlWU?L_ zNk;BF7(@E#kN0$N#GT#cnIF7*k-}I__Tk6~^7+INJoi4f{Sc+Jd@zMyadX?iz+lhe z8!2cMaBqDYp2w9_LI5gpsFR(PhLOwu_Qie0YUXDgIK+u*TJs5l-o61<WU1y)z9#~r z`lq~pyHpWoAWj5Q;T>lajodWk_9j*W5I9Y0T*fsE6IzY!9=&D(mb&_4%xOaV?S9@A zOP|%PMpr2hcu}!IUaH94i3<eB8p^F0xc@~}B4+D4t-EFxy*_$jeVsd=Lc$n?KZ=(L z((!GEks^LBQ90VWe*Rs`j`kC{Ky8UfQ#T?Qld`i1{$R7CvA-p`31P`1fHET#QdXB= z7^7x#<FI=&4N(=pVRA*=VoBwDOmpWOXXp&|-2xLvW`~05D76y3wOb1zeAFifS8si{ z=K`-TLR`$<NBJhIy01PyD(eI%(CC8idRaLH^#we(867N{>dY?)Rc9YXay@9SBR@Di zdEc%!q4vZ#zxspFQyh{teX`H81r(>cYBzZuMhMqia>4))s!SbR@rzE0=9fJU#^<9% zEe2Qag+4n|Yyh=>A=^nn5p<7Gk`|1~WnXf8L>qLo-a5Syc;ITPi<^$=JQ#QAOO5y? zWICPI@onep8#&evxa0bRCO8tM58=gJ**ghFv=kO-#Eq0Me{GNl^v#Q-(&(GX+FPYN z4sBaotgLSH`Bg`8rML5kAxW@d&T~{-@{SS&E-{6cLj%T_43~zr8t`n7`&909kZ+Dx zPhC?o%_)v&-nO`h9xp=l?M87&Q8UJ$u<&3te6AOap;~YRFX)a8b(CklwNM;2Gsc@U z5BE>~M$l3;O5zDYN;+<9SSpA_7Xw?Z2JH!X(@3PkrEh}ge;OG%-+wK(bXh4|#yDp_ z9JSfC=K|F55lP&`tpt=H&*9#$!muoiY!HmHwvnq5jo*yKcPP`RvA=)lD#R5TPx7pd z=T2_gYsTEoDc&aAU*RoJJSNtNq};x~0y)i&>Ygx<s#_4t;{UV&znlPj6*-^4$8J3s zH(LgL@aBVC!bxN=9;jk|?rUd|C&Vj~^z!rOEc2TrN+>tF_w8|I>F0*cT6%kwEjz=p z47G_SXF;yyuD8=wh0LQ2TjPsvwM7?~N)m-{f(cvty7G)3#s`CFqvGxhE&gQ4soSKj zduQL&6^Y-69`Al4m|&(f$>eYj`*>364J&s<X$9GcK5Mhe4R;TEATD3tY9}6eq<V=n zxq05sX(PRIm-D@w{E8q@DJNeNXT?87?du#vWp3lorc_JQ+J+17?>O?4#ByAiYC@E9 zSZRbRT4inOvJamNqGo@ui#E1BntbR(B7(B#q=?U>R4}^8ob-z=#Lzrz^Pa#+y*F4h z^F%1P(2udrPyoKP@Gw0Vg=uO@r?K}ta|2l_nA4#4voquswUUsG`n<#a$|vy>TN~*Q zN6c0AyIkKb({9*4KdwXGawtorwZa^Xh#w7d<0YgJen;kSiz`PUD~@k(^>l9tOvEu< zWmpGU-t$11r&`Gfodq78YoO`M{n_{%&!_qpL5S_y)>LTxgCHH=mhVH-bx(WgAg6R1 za)=o65jSMbA!=*0eD<*8SDjOnUmc#@w+9YnpYlKB!F(LqFhUYGi4LIPrKjElOFp3# z4csv>rA}P>K!MVaz`K;wQE!sb)AkLz9#HSF_#@vio<5#ys43S^aQo@zjAwv-KihUO zQQIkbZ1Sd$WoYIS2N|&uPo?th8AnZ`{p7orC)=v@&wizk$kc&$2&kYq+3dOdCLRUC zAD4@>3h!0Fiq3mcB#nk6X|YpEw0_@E+^Ps9gX3GHaB#T2914HTg38wMV^7Z7H8I#u z2+%jpvMdW{&{yeVL_DqoxVgK9BZ`BVeiiUo`fAxz7;md`%WA4?$A=3SuOY1aj;Q<` z+FpmiO8pTm)@UhDYqIdJF{8iS@cw&&K)|?<pdL156)eQbW?(AnWnrV!6EPlp<%!0P zKUyel=(yj9%0$n*mt{7XEnP>zAakDBl_MgsCx=vEGvSL_l5=Z#dqa0UOY7WuLBxZ> ze_yX|aOEu2_$3ka8>~HopzU@4z<}dIk<FG0%rwD*(~U=kIL!-xl~$FM$c1>$b#Ryh zZ(WH`bi?tlv}tN(FKk_eZ@uY5`P_rA;%}z&{d|2-HB5JY<&v6`M4t!VkK29w$y0HL z&gmVEX}UtL%S6=>N+c{am}aCVmWR2KgQyc(#~>!5V^{Dk-N(20+q|*Lwny!X63kmL zDKU<(pc41p>s*_c>63|U>cnbRuq``BQy*286q~txE+`*dnbC0SAc6#ey&wFAO~Nxe zoXO~HPX-THFoPaAB)k4Vd~(9T(r#S-ce|q~1KymWz^V(8WFnNe;|N-chk2V)8Zj2$ zBj0G;WocfRqHp=yP;1YB@1r#V@3SQV5{_x~&~b$mJrl68SU)Io7`a1bh46vn$gJCT z@RL3&ezY_8Z*QW8<wBKg&^^-8dwX1OKHfm@b560i2`2L~33^OMME%9#%r?UowHHEQ zMe><y7fE9zkGh*wA)QZxg|_66K`iGh`pa1Y3s*}E^XjI~R`1Q}--YlofZwpx7nqVj zKc??Ea*Kumh+1o!04r<wQTi8)5kXPsRB(Pq?y_HI2qesMEyNU{3WTDb%jfCUCq+pY zUSnPcfmU{7s<G5}Cpl83RM4*^Vf<^PEJ1sERD=1i{Ni%U<4`2GCSUXa6%{YrS=h?5 zd`c+yRk69XHiz=QDgr~?_bS!nh5{x?V5bYdpNBt``8GX~cz0{;UvAO@36q7fA+=U2 zM?sm39yL0>gX2?q$L6LV^Wb(6x+tk=q3&-V-1!2Z(@#g}rfsTx(OrAxcJk-OT6lI7 zvn?(!%&e>-LS)ww#fBet;oS1B2J`1dm8=yw^Tr1xpHYM>y@qg|%nM28M#K#TK!MN3 zWKzftDcp-zkB3rZFI4#zzODUHret4=kDrb$O)uqZ6=i3)_iW1g3%FQgDI^_mKZr^u zOzFrRGH44KS$t!NSJ+>coX=s9ThRTN@ppv7KXw1}l8uYz6dsc&U6AueIO<aghMW5^ zy@*LePRivS>VZ~sGSk>l%xjtIc_{$I-cSvR0j}G%G7##<v(73m9e^7<7ykLZL4c+B ze1G&#b2KMK&`fC5LPNtB*VsG0`gO-nI!_ZKmdKdcV?UY36#8kolzE~-vq*gnn3UaD zXmOZ4VHLX?e|&k;{v<$ciRkBImX_U9aq(Y?)O-l6!o3ONy0I)V%i4{t#%&$n{bALG z{Nbe#_~RcYCTXH;R1;PFzYiyEy5d+$ay@Wv@_;lFhtq^i0Wmc-)jAmg>67W_cLO~k z27!rMK;jR(-cm$4O$EC3F1bZQ1`PrVtQ&|B&t-BjhoZ($nOolsONYiUw{hY5UoI6o zKxB5ck90p2?>&Az-*hrDPAjj2X84Uumk+HzZ!|2JOJL2qX8wD}*LlA;fuI=Sg~)*$ zxi$9(NAJjP0`{|+-x%2BtqE%)jo~*9&V#ht?SE#&<~JO1ncjK2DH1^}^I$-u%Ur`) z>nXELPF(WSJ0wwZdMv_}@bPKll_Y)^AeIxTTe|~c9@i0VFlgDhxUgZ|c+pP8^sAmt z0JqIf-vwMOP?B3@XKzo@wSI!fw9g7-Y%l6nu8}m4H&~V75gwLBP5iL!_}M}-Lpj_% ze?|Px?&S$!{v<!8#y;N}RlzsKF#dIiM0i7|d|=Cx&({H{vHW|t28^?O8<978{yv84 zU8z?FcrEzaNNE=WLSgY3uQKeJPO%y;`kL0d@~`2=x4x4^;slLK@<z2&FtMNi3+<jN zt#gWofm()myJ!}K_O7bV9~Lqww#O)&3TFNy3encWTwn}&qqq5D4U$+cGDbhJR@!z% z5>G*#J9nnu@BSjmWZ5ArjoeGsgCGQ^LSYF-sg8*Ly=6RQQ+UwgXbPbd-3}t$7w9YY z5XA6dpCT|bp=P-Lny~yn<PI~8pjpokl105^<_J?jREQIbn7gxVikQa0sX3msoAVt= z5Xn(zai)0~HS>T5yu_)P=M;Q_Hm!6er?@|`DRKxMl3pkU>t|t|4HSt7b{uoj(|?LI zqMp;g66jY^Y@eKh>uNQwhS}P4W6XH{Si!J)fU=Wvg&uU7BitJ2G_x2kPS-1bTrS-S z)Wpb^%KVeBMpN349)yzSEO;Rc@WC@^U!Sd9pFBrg_xK0O-?uhT7qbM9`5l{pSoNpB zXduXW6bN@EP&0II3##7CEt`*v#v4Umy)9;5YBTo!>&Bv}Xi8XmZMyVPvRJ{%FAeBk zZOL(7ShjuUK4q6WC-kI(|7!U($2<rb+Pr@5awh%#@J!Yh4X20`>~fqh^(1zkKxH~1 zF5A=JU*;%grW<=rGw501{E~<4JG8ey6-P0Lmtp06ia-=Z`4X-1{pQ@Ye7~hnKG!KT zmy1yHLz0wXtKzk-AF#z3=vLnEbZ+w5860<+$-Tj7km~`^DANnm7fqF13revlUd!w2 z;`-HRh_U(vg=}ACOnDAbg2u;_x$+@Dn>OMYibR0Oa=8$jyfg!yag@^FHS`z0s%PaW z@rdzI5Ic~39Es&dLWug4(ze=v=*k$yNV|<~fVArk5d=Cb`5`wztg82Ad}eOQt|v)7 z?cYy8vC-FT7N<hp5)*Ts28&s_R?h{!hON`l{lARt1x^k7Pyd8z?mX2vN*Wcm+7m`$ zS^pRJDsa5axi!0m7kGf9`$LRDz~+%pDVZ$T-wBa5yNyzM;1f_{U4^qnF8Q*A;-gs` zRyB*X<KM7&@FBRO^-^NfvsMZV)M#T}<})wd(16-CBmLb3dar%sck|uclnc*2Keijz z2jw*UzRCL@6Ojr26nY-9zYMU!YyU<$8S;|vZx}f6`W|ihU!7BQZ(Myk`Q(A9s*-wS zVW%<!!h6~?SFclN$llt`$|=BqT3+KI#Ra(Wq#}N{l*=2&;<0N8%s}su2s84lNoOYl zGW5NEpps01h)58ayP2e)=|>tgU_`iYaAMq(N72xG%I!tKFn?4EZ@*03_)BTfhtExc z{NTjvpumZ>IPHB|nZ!X0PlDJ(!`ICsR8FcmOgo#6^44I6^;bA#DywOu%U4L)7RO}f ze8H7me6F#aB?Z<elDsb|Z&%Tg)lo=OF`shw1GmW&qC8yP4ap+h81$Q=N>9;AiLn7O zV6;hj4r>+nYp@3W!|M|B8s6DU&5S0tyL4>>MkHPxjpGm{K;WdX@Eo4zT&pOv^j|Zj zI&8*_hreJ{vJU~ukzPnY@UN6G1QvSNSC@O8dzO{}f@G`)*E0JmhGb%^KVg)65S^tO zPhO1zp*ivRNXHH>^rGwV)_2e91inmBV)+|EuvIU~IS7rD-?(9@o%V8KvpoO2XhB6T zU+?IG$K34;mL!Ak>gfio;uk8>9g}fGrtk{R1|FtxTF}b|S~0hg1hNP#Ad8253ug=c zXwE(1tz>aY7}7oNdB#C`-8VY0KV9M)0_bDBVV_|E*_Y(y|MELpD$9-l^M6{%X<lPw zR>Q~=l8g&lv6s~z<RC36RTAF}4i5H3ePJkIF-OG7m<=m;(gPlo2sju`-BgmrP;zf8 z?sRls3xsekI#L6a31nD~qov`rs2|0mlYoAxGEcp-15$~?%MY#Wx&AT?(Zx#3)I*rV zFwYava}vMYsLX$1h~p;hbU#=jWD!l5lRHh!7;m{gldu*=XTJ-*MxjPjjfVzR(yN&q zMbe-%jZLg_{mzVFk^hQORz0O{IKBHk^q>)2VsG<r!ja2r#_m<iMe~4%fhuH}Cac8o zqCPYYFR#O5_KQ1ZQ$L)%e|_K#{g~mZX2Z*Yj_gm2+gFU#^8&N%Hiv9S))O^=NnyO< zWtScrdGorU_q2`7rKV$8T4RXd6$!x5S`yRfSZ(1SE1TaVjb%`JDO!nJ(ZCl}EJ7&# zvP`Fm6EBb#Vsh>bCBNvj>~1P->^rU9y8i+%eeh9}1wju{W!Z`j2bQqKb3&D*i&ix7 zooi^TTy<QEJHkofqo|Xrj(Olzmq*gIpJ6GM4xDIRdZY?!O9rswH4hwtp1M3V*S4TE z`oi<;of2j2ad_$J<GL|ky$x%API}23$#Z5<pdIERaSOCT!O_qCXtDmeg)kIBKS!BF z(5#Ql3PiJ(p96-WulstUqB`DdlVh{q-h4>%YzqbsJ!WTPt55brxlZfzUNg=c5+t^8 zUY%r=l=M3Y*U6AtbmBn6)Y^|5iCx!#hb(v@M&Skt9OUU9N1HQujeb0#{kV>1f_3H8 z*JF;gk&E_rk!Bck81=!alTmo~oo%;^J;&+)8G|W7KucK|3@R|6cr*mc9&iO>h$l-I zo~>XR=^d}R%AP0_rln0)rwA2DkVO{$07W$yA`g#|+TWDns{FW(E}EQIA_QIcak{Xh z{u3BcS_1~8cg_g1M4!Ezi8@yg4zImgFKo?F)Ct%5Vkb8jn0on@JaEKCurf-r_K8Q_ zEjC=kpytznkOCx~LSB61aeIfpxY+GjFE2h*#?=nwJYHz#jo9j9xMMDms2M%;OxuYU z4j}vSBZZN?{Fb=OpE~I6loNeo(ySxi)LA}rw*=&ZI|f!%^jBmvoF75Q?QLGOTeu)2 zwf_1~5b-+jQRfQC{BLX-qTLRn3OMTK#m$xny-VFN0~!ui-oADF4KE68#Nwr(<3LyL z4Ix%A8&D_yvsv<y1fdYZgfMprRK@#PPX_N@A10ek)IYP}9thFaZBYor(_TJ!Zr_*Y z{s#ndRcJrsm-fw;LTNopBge3dkK`?`?=GBg1M2mubZ|vdO|df;A}q$7LAZWdjpr(r zMQ(_WcyMb!>Z@Y~T0#<k<FQA5At?<eyn70-Q&MW{k1H+wy~S|iF7ne%nR21&s39yR zI*~}5R0$H30%ZP{Z*5u`T}PLjJF03zG|9b_{Qkj`GU<agN|NF%5h9;fos-kx+6~%) z^ZaoMKI|Mg<X^7LXx@cFV9&DKaw!5_4{))Kx!uz-=bk7>w}IVY&<9>El~ILCTfjTj zA$lrXR^lq})k2NM3Ra&`(<cFE>R>q(B5(`0A+my{Ux;7&k1{t9bisH?616*btS%a# zH6mBkRV958LEN{nZ}78d>nx$xpT%CQ5h8}odgKxkaX#tc6n0bjdis^34>yve;77m% zQM1oa>_!3Lu8XZRFo$-z3rM{;{}7D)XSzhjnKkqE(}9thpAN9RACAV&T;~)^I$}Y| zP2<PAYEXYVQsZnS6KXMQfyMa7H*P;9Jl@hFlrc(*efoKKz;I$HGBMXDSDJqC;R=%z zMumQTK)FZ{1D=}S7fcX9PW$Tx-_%W7HM|VMN3c2f-n(yR+>nQglp;dl<kfz{qnZA^ zwecAAc<l0R)tBKv9QD}bUAI4D+>zSpXarq|R#fU}rnpDpI$-pfjh}msCBt4Rp-C2# zyEqg?w?qgN%V}VwyBc*05wJbz2RWD8?WY+@5_PjrGz(j>Bfvu-f*bkHdx~>+@dz(y z!4n;y;j3N?Y`-jmE87Z@CFKo|Quii1UXsp@;Fl$lp*<?_Eb=ov9`u9?hWPPl!W%F0 zBN!0Vc4SR7pT9C?d)&EhI-qG=#0*DL7QCB5?l-i~R)aVh&kj0!djU>4OZHL6KZ6`W z6{zwSoDmcYHJf?;+RZvqODP#IO`9wo{na})%$Im*aJtC&3@NeCAX(>1DZ29-5X!J8 z9&D^6<}4KM>glk_+qW1cgJd**G!3K<iUUWm<?WJBv5*qye18bq+9=fPs!XaxAd7hL zy-5(EHTkJMV4_N8R}YW3eY_AysePHo^_qf?4|>&1M0n|ze0wA}7p7K)=&~y+rv9K( zrW^b@SBdf`%X@W4vo_PoW-Is<441E!PhLfHum-U>97ALbmGNEjLhZA=)BpDV3}pEc zybZkH4XyEG2RUa9`}|V&J3o3{mF4iQCu$m>K`P5H;fH`lDCheU(%z1b8q$MakSPUU z)K;mS>u@q8EI)>0dPO$ktT2TrefoS}rfKPJ0xe`-F|kJ)(Hc8y;voN|?aOh?c3f>T z2s*;aCd>AzFSHa41VA&8Yz1)K_>K=}-KI&*%vHNzf?2GZ*A^E&;Z%^W#kF;#`OVRF zN{GnfGUX7JIv6wfeKl9RyPK+S8Nko`9`u8n{K8U0IB9&&)g-Xs)OvWkxXar^_37_+ z$2kP;`a?upQ!`oN@DsfzI1r8L1{np7kjWe}BVCBB#GWUeSz*G=#ezqa;2|pXK|Tz5 zsFTPQlm<Bm*fKd4-i|rb(flnw1CVBO^fjg2m^`tUCt%aXC@L;cI8%)PA@*R)sUYb? z-Ne<;g@%B`DSKX&!-Sm6zj{0$&Qx(kQ$7<f5?&pO8uV<;w_~+25C_&1gS5Jc-@e6Q zWpAk)kSM*iRnq8mF&8t_MN?D0D483u(r;Ar7a0|F&?DYo={2*IOy;@G4*iswTx;_B zjTayPx{C^Ogn4*Gw74C`_D_37@Bd<2=tI?`qLn>;Irz-fNf4AtPA-;5ajta-v$$(7 zQobAShum7hs;!G9<VqwN2m9HKrL?_%I?yZ^{?u%uDEM_n>#vF9;yGK+0tVt1m8k|o z9>>U9U$h{|qCR5~IE2i?v2qK)XFImCSLYrzABntgKyU96D=&pKYy+cdoZon#w1s>{ ze9Rjyym627{-W{w8!zDP`6Y~S&VTe+9^uma)XnTn#by1iLL>^e`+{=YmY_Nogf#v> z2OQD_1>pSQCSz;P!=uaURftUz!9r_2pc4PQ&Jg<Tc?nnf)aY3)G&zk?3s}pcmFb_N zY(*g1EXy?X>M5qVb!2f93-TwlNKfA0JZka$^3Ls%$EJfg0N>Id^xk$g{I`cCVcpC6 z66A&%-|Uh7=FKS+FNN}4Fk2-3537npcOOA?>k^HNu~UxDgax&o72yaFnJ77;leQVB zOVA3?<+szZC_rBmncO!PhjjGj<-c=2oOb%lE!>y2PEfXaXKSje=yCOcEky3lLlpJK zAK1ZY)8Q09UyQiF8ymwqB!IsNx@@^PbAx9z8{<VWp|?-gb3zxUA!K6*p!?@3<B<fQ zuWESuOMbx>_7QJ-1aM{qMEhL>X6>;}`;>Pr!%DxEA)6WDcV&J5_U#*Qz+?Lb3;WA2 z?YQ~~%L;FJB+3j?@RRH_-Mh>XZX6H#-W2SfBIE{7jDm}YcvKL}IO<=N+tzU4M3%2< zEZ|yNO&jWV7ngfe2`_DY2g{h39xWGfzpuh}yI88YCjowgmj7PASXIq<H(e@-qJY~d zc?KOhvO_=v2K#wLG}kZgGH7*#ApUdQ&kidfa1>%5HPsdFNmpdQ6-|W53x`HGuln2X zvSe0xiZ{bmZe5m~bDRMrz>rI(nIpMX|2DjZ0MwjM533eU@1m=LY3Vsb%S7^Wa~3(u zj4+lpV^{fX-sR_Fu*;9)AM*<*9#u|amHsS_&a|lcJI!+m`g>do?A}IXz)uJ4YXPxv z(}Jstsce`SF~9kV{rzrW(Y2q33k0M?i)u0oXp!+gwqutOr{6p4w}J)xJK@y*P}p_; zydU+opPe48Z*u{5#uOAJV%j@9JNpZUGb2zZYR|#>>0krGq7UFUXu`NI*7Z~b->g2S z3LSytp67Qx<fb*g<cqgj<a|y;*G&(S5W>f|Y2c9-i$QQ7udwx+kjEdb3EMbn(LG1; z%i^0)31LP@MlYPm9{Le9s%%wsUTFzXN*xVewt&{{T%lKm2q3X{fLXO#5AtxdzC6_n z5H1JR;+^Eyz3_jpTxBWSiHVhT@S_T9NfhpHzI!M4m1qZKK}^4QojzWM$^4*y&xNqo zKWqQsT~Ru1#Tll{5vt39*}4$7Ik7Rsh53RS@#x-xj?|DF2F`F{cZhz%$&fjcbjMbv zx><o4p^heeTDn*S2P^HOC1*SJwINVU42WCpKWm)`LvqPofiU75gLOaAA_rr4VH{@s z>(`_lpHxOnOY1++`XNrqh+}R>g$=-)`qt)cz)Q92)$xxSmziFEiE;G>kck9P@{G?t zWn!}Sr!RD{i6ax_0{4IF;oM~TbF;%rDqR2kQgQ^(j*ueTI7QbcZf``eO27D6^Gq|9 z3VBtk`|thJ<hrtchrJ_+t_V~pNtOZJSgYdn>r74zh?~W&l?D|}-;9BngXxzyVUoz8 z<V2f9(@B+vRLEYYRUjyer7$K4xD3%s+`}&{xaqVC<@oEL1n9%o94zc&$WQ!|JfcL{ zoDi|*VzmE9jCZL&cuCmw%3$NR1a&Yv6;ow4!lLU-yh};4NGYF+<*ME~mum=(sV^-* z^F28%?MnM(BFI!hM<SS!>JE5v-PVDQ{n3PIY8s*ITxfF3gVY;I&aRTt=(^YcaF!{< zze?}NWViI+u8~T={uwD}8jp@rP0O0ED*ZWKN|2`K;krD46Du2cNp|Lig?(-ZSS9Nq z88~HUe0cwhL-6Vo_)+s{jOGiBv*b0$vA6J<Nd)wx;?tIb!*9(+ZM+fENKe^C#rJ$b zPnjhBC_#<uP)`fdy-M#`BGle7<}w~TFwh(}am)>kIBhsZ#2n3zZ*GD4*Z%amOl<(a z-Ra?`AK@0si$Uta)`_*WxJM0j*DfgF1_xHQaW;(qNLXFyOaIZzdwBpdI94*mPeB>E zgjVdfUYggB@R%q~kjk)Qq=S;YEEzHo40(9v7=AD2k}AtFMaHM$A_GV}Z6(=8oI=3_ zfj$W6_pK=$si9aL#<K!#Cttgo7k8PsPe-{(wDB22NN>{8u!eQT)~t-{-+lbovkO$z zIr(84sSuDhJp=xpf>ExfN<2K05vA{8+Xo8FZeCZVcww+7FsU9@WTx}C?=<2!K$V&7 zjjKzDwctjy0o-d<Zxd>p@XM<z#(nI9{|#fqb?W`AjXCe<hDN8d{|3bk65~TdNv^XB z3a@bl>np7(o3xP|7Y8L51~=p`7+nio$15*!vhpM&<H6^~!@G%(-Vns0tc+AzLu1-U zCVubB+&f#ImlVQvj{N+(edWUUw=&yj(r){$Sq~UBo()L1#9Wy_D!uFZrl=|TqFSP{ zzCI<)U48OIkXXqOk0AGJ=8OAfvPW-v8~c8%zYJhCl)*gjYP%aXw4t*moTyxMA?-N8 zw!5R~Kd+OI=fu*NCT4E9-3;rOI0Zzd#S=%B1A8A!S@pZ+oI%3*5w}GbkGLJ#A1{U8 z+spVek#UW*F?JnLVJ;QYHdIf6pp{clXrIrI`2FWkA)+m2oBNftZJ_ooJG~`;>+sxP zbI(??j%e(gPRL~F1~&GeaEXw0Dk1f%tB?qE<l=<mdT)bHPHl=sgfzc3&ud)zyT7*0 z_wVN!9n(qIRi33D`1JfqlJ3d0!J^o|CtchR$ON`WkGCh(6#q*cyk_+5nd2z`{B=GX zBFZDz;FTu`^pignXHa(IS&kX<W85smvCYBEkX~s9Ef@Fne_DWAXCeyefUC=krwD6} z-VF%>cJ22cO@4qH$Ldxw>p8t3CTj%@4%_aAR+RP_#KacnhV-E^FUqCG$lT=3l&cF! zeJui(O22DYjlLsoII5+WZ61H%+XuW>L#$pjfEmn<PuE2+Dn$M)%nO~YI*?5_8+wQ{ zL*LX)`rn^#WZ~>N{UJXB8~w#~k2asK<Xe@Ml{rH1S*1mb5@ok*$U&N=Pa_e4?e#Xw zlGLXs>q_za>+r~)R_kH=^-ugZvp?`dy$sjuN(Qq~p&22=QRPtlQ2UJevR{PDdiJ`M zErFt_GSs4<qiHY7yr`sRo7ll4iK3r|*t0q@&vTnJPa4fwrdQO_<K#ObgjYM^sCxGt z!S}2YLN7LMuY?U{NqP_5$Bv2$d3oz*F_P|j>M-85qEN|x3t5(Zm%Ha*2gQ79sY&IA zp*p)h4Qj0YFMKyL78DdUiYgoF%!iO&h2$DxKb)ZHqe1SASF0L<`C9uYA-bH5jG1;y zC5kC+Gpdk$usm(tH`J_;>q1Vx1+BgZRoJL|3O@00=Lo)VO30>H=bg~6_Xw}aD&;tf zHD&C?y$;L~uxTg0#_0<M5T{@GZ(H@9!8lnPCNbI4jy3#MtP&!@Pv`m;tv1DLF1-t_ zAS+K4+s*f3`)qR!c$6b3I}$rt;<c&8T$<wbZVRym-~4R+L=;JEguqif`mJLi6WQ5a z+}9*@6<Z74v9vu)gTo#Wtzp>z?c3y)<J{mw&I*&hS?BQ!_Zu!Q!M*LbNg)C~!2XP( zMKaA30jTvtmgt{h(=CSM3{r&G=`uSR6%tKn71|8UuT?(~#C`C(m#^_LclVBcw-S<g zSa}G0pNiLJ#&vq*p2yUMcgs!}&4K{eFc@h-!jdk5SCw;h5T5lR=(EzGvuGPh5UJet zYEOAhY@LOHR8;6aI7(UisEH)=K(SHTyy_0|0x2|qw8nU+w*Dwzb?K1Fet@zztQd#y zPi|oz{_}0_zCWnHn0X!jjgVzzB-bPCA)ddJM-#F!R*i?FD?kDE<|=(>xH|4WrDPZN zfAfOUZnN)x-#=m;O8?i^i!M~YkNqJF)ldOLrm7MR9Kb~67f+$}CbPz*<I>!O==-0= zhyJ;!fBfudn@Av@HCpJ!<3!*Tx?>GlCb0TV<n6y;QYC*Qli3&uIJTg&)2Xa!;WuoW zc*FZMI9zB$GyFnZ@0Z_t<@Jk;J%7C^aw+!q1#hPaeq6?D633Pjxp9*3!nyZ_*1|7a zk5!!lAZ&k7=*@6Kdiolw#WiBv=<JApD6&#w<l)=<T7yJ0HN4Mf=0{r~QJG8UXw+ub zP#3N3jeqejBRC}QkV|_(w#7?hx(4C{LT{YfyMkSNDiu2Pe|LQ9)jo&1v&H+LUzh)N zn>+GbxcqZQ!)4~%?@9BnnV#VNz!tm~iG@sHb9iuF_&jg31z+S6vYVb$^tiL@gePK; zyXgIS#)6OoO(eyB!|RvZwO)U&>+EyqA$Vkr?fwX1mup#mdZ2#Q`swh_*#7oH>sPgj zL_hn5C;M!-bM@K=8HgdB*?w$8w%!d+YG_6MtKyKAUGwvK&_DW+ljh#v_pfiRE(>CM z<?P<z9KgHzNq+d6$YVCSthh($E)GVByxl&!;65r^s+@Q7UGlE~*anJW<$5Yp{Iag9 zxGZUF$jWeD7hSDqD2w5}E-xk5gf!;zR+falCc7#7uj{p5DZY{=(><N3*8}aryLoZ% zTwDTJZHiGCfonXR2F<2mP1F4?=4E610Nz63vuu5Yz}ZVG2CIgjS`mMK|F%H4@DY9F zvrwa7pb=9<aGR7vLXp1#vG_7K+TSZa-1>e@lx(<Is-60B2$^ZBGtc_)nadQv^}w}Y zQi<hd&7(R9N?Zeso;OFLW@oGau6aVE|7c;`WuV<Wp&XA@%k07B<%K$m&Gb7z-kFDp zQ3h|Q4lb^0d@%UPg413t4+WvHdYTRd6?uGaK#;vbGyGMn7aK1zT!D#>)JLE258SMT z7>@ntTiJd(f<D9Uy}Wg^yTQwy;>AUun;S`~d(;M=s6%aA@-)ZfhMB1t*68SHE41EB zI7ZORJipC*?=>HC+*SB28W$JWjB+Tkn+2KdsD(p(K}ZrmPM$^R;868KM8;TwlW}v| zv>5bk*|2flS*UR`JcP}4AI1;g+ExhoC;Ev9s;C(^fX)@4@1<9l-rp>^jjx+7IELtA zA;bP+g^Bz!B$RX~cjDd&a-Ua2V|irfx$)<R3Q7~O^W*Mz>=l^HDC;<Upucko{$t~_ zLso{u67=PZd#O3MOP*>CSf^E;v`zWIXNwms#@L^sI)XM<a@Tb^{S*hxE@ceQv$>vN zkjm-nj}*Z=VN3F@{8t##G|rAzL%5JQmL;9%<}LL-%NU$~LPSg>??uYkH&^%3tZeq2 z$H(W9#LT-3u)p88SV5d$`<V{+M@H89dtzS&q#cyqq2YHcma_GVJXy56`CckV#aQ7^ z*u!fkZ~TWTZM&{J9YTMK%fom1D8CGy$mW<(h1R;o@r5HiL7eC3O^`^vhCi?+c#E(B z-i5|N&)Mw0=2yuSVfH2Kx{@hrY2V6}o!eND#CpnPre?gQTy``~FRQYpMw$<vGD~^} z0J}|;G8R}2NQ(?&8_EwJZ)H{KU$sC{<8bTY6umDUZJKe~p1MQ~%l%xJjJdiwucuY2 z4E{+pOiEwC_)*MbTD_Y3o42JHFD=Wd$fWK&4?5lK)|}}dC?URKH~u(#S>~k@2aklV zov}($jIF&?J>qU=*&q`uq*?#NXExoPRQ_1iDm88%Ag@RJHWKfc>9@L4=i5>Rzwz#N zf;m^Sg*s6E`mUsVIdG`MVbN*ynM<k>!hA98vfT;YJ>FDjfXT_s$1YR7=F)%^?k#;C z=xb9c^H%F2yO7>uVzH4OjTsj^LT|`IgHq_S{m5v@CdVH#qV@mEZouxT1$$b_o?bsQ zEXNgI)Aia;d0jYIlp>qp43_AdbMDWeJz8^L<8L`$vQ(*l;O;FTc_(0tNJYuZLxG$7 z^HM0`xQpPXXV)FWhZean2V}LgWCJhN8cF34s3Tqt&GzYHqS+^x`Me}|X>-r&9<4P2 znw;AY#d;O63HTi96;|R$aK=6KsiAM9yI`!xo`?PMu?dEcRJN%WLb)3<IZD>uZ-35P z_P%rNwZtF7z%N;b=zp|YKd$X*A>ipd+Ed<&mn1{z>+8!%joLsHiM!gmao+lVYu-7s zAL7Mr<edGYVFfZLT*BzGAT1#_3aE047PuC?)-vnpYHwtA64Z1By+DN*R>F0gE<jEV z!zo#$S-j-Rm<nSKwTiX*lySug>1j4&Fd~j)HaiONO&f9x1h(2ZvBt79@P3D>?Q=6( z3}Fz?etHa6idd*~wU>QsFX;}(x;xJ*{+>;71^IBBu+s@7Hlqauz{SLHefr@CH8+Vu zbjAP&961hh?oO^B{1M6(-AAKBznQ<Q$w}EOk7@1vov(kct+YU@MBhb17a07A{B*=8 zh|Olbf-;f%{B>^&Ld?L`pJ&DoeG!Bnhm<jU-KHuK=WQZ(^^lev+dqfedmU_FlRuVs z++s`mp~X5uAEF8}4<?>p`M8N^i>_aCV0t^Cx}RQ`&KG`;X@W^@A#3d;0R0-{f;dhS z?><w7CCNb;)H>nx7#0g$n-7|Is7S4h2V(mc_QAuqr`;hKwctxUjw=xN*&Zp-yo7af zq^bX}F&>`o36H6niZ6oNCM*=q!^s`H`k;PO%=!7%`#tj?D4zx&#zRT>A4YdCS_3=# zZ`YSB%pViXcbI&k3V66^uZD1O_&!eqE3Do)0c!z*3V#k5y;31M@71Ba9)Y?rq5(Go z)_4Sk=fj6=u6~mvSS-bi^&(OhF(E!q0+c-U8^WofSV0+8r)O+hX>Ly;nLy)$uLn9L zi9j_}N^w8Lsnvw^{g?rvKw?CI5a-G*F(KWq<u9r(XM>R2O(O&XLfh*p&GgUzeff*( zIX^iqcD=ezNw+lqT|A`BL{>liA?BCvbU9c!Wj<X$kS#9)7CX<tUg8(<I!2{$Qn-+{ z1x-^GSxroKu8w{8TO;S`;ZA#(HnKguG-${LdVYR0D(AN2$U8n@79{nIEw>=RIQ4LP z(!(-uLZ?7AV)OF1uvdn@Oyol=;ZFZ2=5Y{V$oM*of954@7P5yiN83|=uG0)ep_^TQ zplB6+oX}dg=lv9<uNxMoYxV<EU%UU<AJsB9CJ?9mQMN?!V!F=TP{WpS^9u`7&xD@N z?Gt8}E3yJ<?m<9hD!O~r7Re1nOzWr8<|P1x{eKx*S$%);m`XhG9X_>=?MbeuqE%Ik z#TFpkB;Y3RWW65W42mto0${sUFDD)ykQ#qd?NU&rp7~{3<)0+_@CYr>S9{h18kl+% zQ<yk89T%qvzYh$Q6Cflpc3$_bIFOAubar(3P^p<Mpzcmx6c51%m_>lB>20>#DL}ni z4#0fo{LU~A*U3R=UYOmUXmN#tdI@*vL1CvN^AiEb*NgP;+jLVSwq~Dh1bM!x3Eb`f z{Y<b+$9lwh3+Lg%WXx1RaN|0x80imd_1)dwod&(sU@VnDJpS$_COf*FrL&@cZG>J6 zeTvFlB{gz`w#msh{(ZGzh}^SRY)4QZ9asq+-FCIHy->xHlia?+7<rR7QNUitEnD$r zCPO^p{;MgOFZHJ1F(dSlz9C}n<JA%d6(`{GRe5rf+N=^spOwr0^XGVWs}y_K=P`U7 zzPRg`ebcyo_UBGpN%y73Z3a;vp_8pOTHD6!SQ;^xv#D6WxBZ6~h@rE@w~BZd?dBTe z(6mbyQ>eX7tSCn&ugrtjUtsMyk6&-ZLEaW)RZ@l?^8mWN4zjs=E6yMTWnseiAlb4& zp<>~j(Et}UuxXGX472stRU2~ct_vp#o~b@#@^xKzckrta+scMQKQ5I%OBA60v88)H z5KHEr8o3Jl&HO0o+aYkWHLKfNtfCuXlsOs@I=t%Z78Deup;F7}LS9EB))W6NkP@zj zyCKClikAEJ?;$o|GY4iS0aFS%P+hq_f$(@3mHxHnQLY=g-FM32pKcM>w%Y<`=jb?2 z*QPkG=J+q5+(?@WP<i^db_{Xdq%$9FzFNtYolVV1zm6jeL$6PRWt@x0!`ORNS^FHa zt~qYc*r@aUpp@gly)jL1i9n4fF4sosHy)7^C*L);aX{1he6uk&Ne+PY93CP~-v;k( zne7-&Q(^3HtjfQsYV7#3tgySo#(JDsf~HGd!f@|DZ=A67bEbX!paL=z4;n637q({L zjq?Aw|Jw?_C^93E2Bl<{-GT9+1wB$og6Cm|1K*}@Pd!swQj%wyUN!b>IVC$}YOtP? zr`uhDGCW4cJkY*2G)Xn>gFojy>Yjti14-R=jJ7xItX{F!gS>uE^Q~|ZtMz#o33-YU z#=aoBZLx9NSl;o;1eu!IiA#@PPQlreA`|88kf$Fro4%0}>tX5K!pVgl%bs_`9Ci=Y zk6jiH*K{LkBv@I)XpANgE(I`^lzt!Lxd><IEH5_9c6g({=MuPvv9U45SF+A5jL|%} zqXLO$TId&-qhD>tFL&fovp|!OYljo0IhD)Uv}5vJeHw-d$5cmVk#lm~&ky@|NIan& zR-eTrW{h2CK=vZ6FoK+R52&EY=Huey?#$cn?F4qU(GPE_g*iVT+ODFWhqyL$mC<r0 zOg-_Usno*g+GG)(%K&^QA2jQ>Pf1Kbk2PKY*Zkqbhc9$+qe5ze>RC!3=)?sj;5@2o zAe%4W{dWa$w>#0jfSHzBH7EDwS7HOt3r0#7K0IeWv1JWv_qCvI_%;aVYc6VRPhc1a z8-(t;xVX^9&}r64D7J2&%}(A!1pN0|6DJFr<EbRXNxYI|TcA&_L?CHsqM@@bHFeRB z5rpMqtN5W0MR!7U@0XujmDoZ6q-#_6^5T}2DC(I!didahk8J6|4l)^A(9WZWo-t`7 z!Np-M+*k(Zx7Z^Q!AEd6USJEu4eQGDpiOWq&j`>dA_YItLo-KGwil1z-LREY61B3g z9@a%~E40jb`iuk5dE`gQT_WjSnh@Ld=@0ehY}Hx=xCFS|df`8h{s?MdbpIbsUl~?a z`n`SVl5Ug~5l{gEL1_U|LZmw-m5}Zh0ZD0)ZbZ7IQ@Rn56a^{iZg|(3-~0bC*L;|{ zbf3MSSnFPQ&?=Smy-Ftcp!2EUd)`z9M#}}q5O~JsrL<u`=lJvT)K_@1!s%#kDQYy~ zk|)R2i6$m8I~LW45LG1T_abWQJUo=GZf!%X`E=!)rdb|{(737Pja(}sX9nX%-jjRS zEhU%L@p&Rvwe83n+0}$22Nykb4O39{g1N}CmRe_dWhIc}F1hRY{To&rp(rRuciBu> zx=@$nxql9JiOts(N_i=XeN=n+L?Q;W__7!+HUDAGdeXb5Cw{c7=Rya=61%XWHvf>T zd!73C5+>ENq~i^|g>$a1`+G+REtz<-qf_1db_qoxjxo;H-7=25ySh>%ogyp}Vv;IN zn>TCp(OSw=$}WKzp=@2e4wrzS)z^*RayTr$q0DIncRX-AusTVy7EwN)3KMi{G;h~r zcy1wWPF;}!-Be=d|0VwYbeIVpivM;}P{7V*dV=n*g3DAh_kb8Mq&Nd2u~>H1EB9g} z`Bb4qH!V*gtNvUJAMJRxK4WGpj|eJM_8|?j&m3<j_P%&5&c}`8IYDE@nVa0;_T0(I zDPL?$(-d8IOvT*kBbjMew+;adZOh+nr6ZOz)zZ%X)fQp;60IusT?oPLHr&~G=ze7R z98~#g@=x~SU2k&}I3xP0wXGLZlzJb>*WOAF3gR$Ds^>o2UtR(Cpz8glh=rILMKC5( zAMDw~Ivps@kjd>|WwYjIhi;e`5+k;ro!kmnMWLd+o|hcZzoxF6PZYVLa0CjgC_4KY z5<UhX@ka#1Vl=Ou!{yopkUi$VFX<n-{*8Q2BMOqGtB$ZZr_x{1zoUdrJZveT)*@Db zL+<6u+2!tH7bpJqwtuvrG(-JE$aGdo<y=_4fnJmT=lvwmk;j+*I9{JDMyP(9Z;;Rq z^HdD}5^BKBNJWo9tV3gZRXF!e{S?B@l@`HoKDEzhO2XoSb>rbg{I%P{m$akV8bZX5 zlUh~mPT<mJkx3YV`QyYks4hda!D!VvW&QXZ>q?DtY?xwe9fABteB8l&;q+9<+SsBq z{Owo7Zx=Cf3?Jax*gCkn%mFre{kaWpV=7W#lgVOr2h534E=q^#=Z;)|S6kje%si=} z-QR9Y%&z}@C1OFmymD3F=`D57>bqWD#=8>Flg|d6y+Ypad!D4W12P;bD<dP|Fo<?x zZtVHhK|`B{YkGuTwP3@PZ1cap^5n>SzNQ4lhdEx+-x$)hQlK1D|5Dhz1yt3uPJ>;Y ztidq8Z(^eB8|fk81nak2S0S|F(~%)<WLzBI6@+WPTi<oj@a$yysbfDtt8VFWb_zgx zaCBR;Bc%^Eg`b+?cJyK6liM%KodKn#WXtgdPS;B6Im6h4v7h(sZVxZn?PA7<O}@;q z6B1cqjpW$Ft3f~dRXOisFj#Q9`E8!dez||k<gDUrl@a8=A7kcSpE3OAuYMXhf6G8$ z@<FM9tfD29)L4xt8nKBJ)jN*M6UYb}k12?-yKa5uBb@sxZR_o1>7Tf3-LgIX#;><% zX@uxKJNHV&SMpp3QJ04v`Jl!*--b`772dVDo3<HG7xBD}{PXE;-Q|~Y2!@nl85HQi zR#+&HoS%Noue2Q#qm;Y(k%77zg60OA4dGfYu_)@>IJ^XLr+MQhVYAM`-3xhY(J}?p zZtChn?3S1THg|yKhyG?s<e*y*{%b}$K!((Ug~7Mozu&r`Ql4oz7?s5k)o<S9MrIV} zQ{iBKw6`XluY9AN<(4{*g*$^k{`pR7TwL7Hi|G@<?BQaJt_qlzp?MLwyA2HFxBcMq zJ6(SA8Dfzj6sJN3C2tRT-(t-3gT_5;hsU6yM7g-T7>&xg<I2URMRa8#DP9B+H`LVA zqvUufw%oQg=k4dcoHsiS?#94X#L+MR{9?@hQbbU2MmIlYywlQb-5v4RbuT+DvXT($ z1IeXBR1U-v-o*F_mox79>6z78(YIe`8Wx-PElN&%?xr=og(ty3-AdffK<m80K<;)w zWw`g<Sn8XjXGRxymaZMsKwroz)kha0wD&>=IHrww>)s+<lQ>HR$SS47u6^O)ul=PL z9G6m?GPXxoR?r?<&`nQW8)HKe{v|UkZ|MGuuZ$GDItd5BpAyoG)7ygZ5nWg@r<Ur? zjh}8A-~15pD7}G*X!)}XR;8o!MsSIi%e(r`YW4`>qe)7ksm+HTCp+iYpRdP!i-f&x zQCcwHE!?NZ!lySwhG3IFmy+r{f>R7ytzD_--5YqHA6VNcW1wI&y6|)kim*x;+%x5} zYRep!G^DhPk9@4)W&b3SRO^%>)pa?s3$TWezP{ddsBQ+vwgtTO$q_8qpUUGY%S+dW zmfdr~VmV-|?#mB;AS_ATiRiKqHFN24hl%BDj{1%A6rO^n!{oisA5v0=$4SPds*zDt z9X|n>wBOorgwB!KJlTs!`STruTMdfl=aasS4D6owabI?1sN|>0Whk>6%)UI`nhtXT zy28&wt*U~zZ<;4SlT=}U^zYU4d-l#bZ1Fb_tvUW34<%c@X4yqh@hD2Igt-}mQJK{T zBDv?229V%H+qGH4xt+Hqs$Z}dHn*CMPUO?Qvm*bV(2rID(3geUqiKtwTHy=O4u7S1 zYZ9^*)qCT^X7UZ+B2=NUkKJmclWL^XI(mQkP0=-<WzH81-80?j{~o5b9v~j1oU=;; z_MqdTzqIM<1R7<n3n7jZUFFxaO7e@TUjisCCQW9zFV1TykU_rvUw`C!4w2UXee>UF z_=@NDpOmCne#_}6Z31Z%8}~c*qmdhj0H2DB!KN5(Z*T7{D=puPiDy^jlU-cXA<_)) zyBr+EQ%RCLfiH8bOyjT@|J|nb!9|pOZ_wJ`s=u5muc)}0m!17ra{rNh^5ch>zx1Up z{SmMK_!Dq6Mv8q%voIVOCgF;5q(SYS9DgZ8CEL=kJ6dP`FGkSwOyUu85*%#i)N@nB z!-ai|Qc$f*sxX#8SQ~HPFCpB~PcUni!=9@mh%bI_{A3Gzw&H$uX2Cz^he?Dj{3>{O zG49%`?8aob*i4W#19U1${=+_sW~L*V&#D#{7mrIc$}&{}@2GyZC@Knbs6J8X$PT?X zEoV0(r;~LJ=gw-eqr_wquhS;_Ni5bPc?Dk9>+X_XS8fOV>Wd%R>SPK!TAlf}ebOUs zuY=8?R@Yw<uH8ZkD}0{X?Y;~eH|D+DF4id(SG4%x<ydIwvk9}K#>b@HaTWyUTauAp z8iiA0z&ZB4adErpob;x5D!>Rk@Xecz)JIzvce_FU9G151dG>DgwU@zwe^3lplrm*I zgHGT8`@`!h+^4b_itg6zXUE%V{APm(#o{}4rtPk)SI}1Sc_$x9d!88FZ$$I)(cBOG z2y?B>g>btM<3Dk>S9tX%&2N_;dR%7JP1vhyyc+w*larHk*^ihBIefcu<wBH#6(SyO zMVXF3U{!|l$a9k;DEPI40dqbp0z!^gGmv@@qORT{x1u8@cmf=KiGC%T<<U8@Vw0qu zc3b7$Qf5#yHwj@#xLV>zs#OEjZj`aBe2Ob@k>v;V!dZxrvg|L|bH%C2o4dtU-yoYS zq2pVT{8vQ66(cmdrl^b_5>ZT^b<ihn3T)F4=j-#Lp!?IQ7im2TQLH`{HpbqdMT1U8 zrNBdqmWCS5YFvD3co(bTuUGBq&YyN?Vel!mS1Zv=$*AHuD%G%fkSm|^`4_la6Q+6| zO>NFsURIM66`W@^5KYKyh)q_nQljA>6uUZL?+s|ZuwE6l+>SmTmLOE60cIdeYWkg9 z)<w_Y#GFq|y!b_vGoTmF8~m=F5CsMQF3&dd0AayBUTU*ggK6f;jw@C-P5c-8%I^Rq zJf||AnHMjYHQ+7J5p$Hv%<fXj^z+1iLdTf&qJ>@Z2GvIf^OjpTBoeiIzMajJ*ZeE^ zTCEG4_f@6!+}S>$*0dt?M}L8E2d8fgkR5V<K$D-E?6&s#QPFF=0K{_jq5OXH(tGTy z<CIQ$)7Gwqh2Un*>pWx{rhDnttN%96Ug+C*n@X<vHxNjCTdQm3hT2tIn3Rn=AN@Jp zIFcPb4CwJEH{Vwbn^JMUaV-`JpU}#GXtrgfb=gLFv+<JyI2fiFq;G;}z|kHLy!5w) zzQt9FW{8ZjX0)@-xpB3y?#Hu+x`Es1JGv5<E}o{-f3?7$q8*=qwlo)d(U4i|W4*i| ziA6DX&<HZU0s7<`Of)tfK{QpR@6q1$QR3N_3a_664L%;Z=TV}gdh+lneE}Z&o2KxP ztPl8G0TXu5cn;Qoa(WLY=haof@2ZDMCsu#{#RL{RC+}iG6;BKzN=iv7-$%2Cy9FJ> zC`YyzxXh;8<Zz#qZh7$6#&POz)ok4m<y4Xw>H9rB_w0_~E;@%Hoa|&zV&84NxI@bo z_Z_=sI!fn^!5Zp4nkBri@gzRob#Leyj!;O{+v`goG+@6}|3Q?GldrPxjr-%*|8W6C zf4B2uEXpg`c-Dy9$T~nL%whhbLL_o%@{A|pe!*&ATYsPGX6+ZM$E9Zbd8ux}ea$kH z$h1<(tvy?4*P_?YyATUk{>L2X7wduNMR7qiiu1q-1s$=(<7@%#Q0Dyj5Dv#?)X9a% zD}ctFQnt5qa&zsNJ`8A(cIyfGt_l5=FUDrP$+<JZpx&y1YD(Zyl!n#(?O%>YURFTa z`zY?Tn?Beg1nzn}r!*hFo$#j7U(6JAmrYo(Zzr3+9$>d-9Y}l9pSB`#Fgrbfq|9}R zLMJJQh%E)UH)kkW=xDXXvs(Y|hsaR5QJEGQ2MXa=Xhb_SD*~kdEgz%7GaQc7W?RiL z55(%3MEtwK<5^(ybZPOU=iGR}rYta)2BtU0y1Fy<rN()v0X{+beolTK8OCVLp@r6n zHukv3P==Sp-FGb^UB8ZL0G^%5fyoMen*68?tG%mX1~U*Jh^Our5)9)B+uv;ud;<)* zIk%=f*T!EmAFiZanq_WUJvo1Qv?#~mz61+YlDvl4@#!|q9neGXJeNT^q|gbrP7)M7 z04pZ_u5h`Y-u`}vyxd%CI5Ps9@0^7&`}7ayzy1!P%$7O*OV>&W>h2U=1lUzKr);|d z)elE(^8Q<Y@`T*gLw#yg?NchhsCGB#LUU;pa0&$zPqzL<mw$*2%|Cx5uvN1delMO= z|H@e^-}n$d^XZ1{vP*^aRZ*nFQ>=J5X{rvkR^$Rz<UJF8+E!Sx;<p8O@Zf2x``_+J z<MeKVvOn{JPxAO_YHs!G=@3Xsswh55*Y5axqfCHD-P=BvhG%)=FL<pjb3ML;lv)jW z{Ic17-ztDU9pt^U<wG!Di0h;<6$UBS<vG`ACKFM-Gt<-dZ#U<TFMRg5uH8U=T#$d$ z&5{G<hmT^(yUxM4eLn4>Wdm?8A^$qF4ye19l0_Z13%Vw@ZbEOg_!>3eIE-FYWUJz- zs-DJ-SNr=<ofF%`ouh)Rw|BEp5h{_IVo{VDz}3(;Uo;KDtv^+Q()SgU>pwuPI26@{ zGlu6$O=rTsh^pdowfyfZA&YJD=uxT5v{YetdF}GQhtjff_YD<fhR4<Q=e%}4dWTuZ zCi8qRJk5%&+K<Ph@iI~;k<FNb#6~$uN#j@7U4)FZ%V_p*oMdEr<0FNR>%Hog|2!XI z{xtPT;_ltMCC2`nU2xmh+zJiKM_q>;!XYGd*&Hg_gA*F?$u^;Quc`K{!T<t;F=d&A zOBDSUXr02hxPFK%Z!p-{Yr>B?Pmrzo?Gr$n5AHm<FH+;sV@)58C?)fSP{P5UM6Gjf z`y`=J9+*Dw`5ixY$59M7RBF_#_<KL~zj}6`S7*3&Ui$Yu?Y!*e&*rNRbOjt(baJ1p zjlT+!$s?%oQHZd=UXo&KtKQ@ym5{rF1u-?_X-8Gz>r}sRmpyGHx(-Z6DwsUn0?3w? ztg$K`sQP-d(G>K8V92p$=%4iigXP@j2^F!TrekWsLmBG6@Nn5Ls&xKUWM8hgL~nT& zojM%D4NJfkbSDpVzjGy=C$EWl3+(FQJ7t#7c^72v=c0-g9lyne#7U+$v!8_Lf_ZaG z5n*A%-H4fpzSfNnW}+105OLC2E2S2V*UY}mX(SWq(O&guaN+;{(FDZ+o9OpD%v>~? ze=^;+A6V60@GWBf9@K*y#Y87c_UWlFvROo$Sa#zISd0nw4WS@_rZj7Co90p{phaz# z7Cy~=L5cEKtpJsC(JFLYh8R@juMZ#3>IA2R--HIinctB)Amt8=lhwaw-c>9VlOgUJ z!2(cGJC|2#t9gUQ@Zf=!wdAWGS_m8RfA81YF3TVv(T3z185fRmi4O9p*>HO8)AkJK zy`wpL=}M<(D{YHj7<I)3EVE0j_iA><4ST(M6-vK^b8!_k1rXoGuoj10dy&5(s+`Xl zo2suC31JFFtvmqQfZ{4e1jhw`4%!PaCF+z>Y=IS)&~rc1mImHaWEgE?W*f(ofhO}% znDXVFfkgchKTGwsBzQ4zyqhV~_eTH+EC3bgbhE>w_(gjze~`qIAD;Qhei%UONt&Kr zkono9SYYzqTBaZ}7G&|==vXpv2-v-&{)8y@<6xhwNU(6VgRl!EO4ZVN9*neys`b>I zZ`DUDDJw^8Z`9xYvGIWlhk>?146?BmHO;DKI2ay1dXyQ)4b?ZXQPpwl<{!t5rzF5% zsU0#yz9mi$tlLcN5$F_P_R0&Bz!U1ws1ZPLZt6KUIo)4ho+o*yqjp=rE<Kh|{FK2s z`3V~9{N#ttPLoG2q#vL;DCCZRE2kG<&d<ZMufqI_jg>V>a0P{gNPNfI75V3z+1zOe zMOB>2;SEKtv|bePA6*`joQx->;mG<@;YBYr_-2F7aeAn|q*UJgYxm}xp*!avhuvvC z-VGcpe~ymI;ldTw?!p)5Gmdg0_M9YUqxKykdUsTE^!KOL#QjgB2?8R`U9D6njM-dy zzAF+flx{-J>#Z76;mAjG$_(?K_^yM)C@ERt+yrhJ=xf-AeSQ_bg)&buk_m4;xZh}A zqI?5Iaq12&kO_M!k19%+pR*x)%|B(MeR?Q0YL+MJH5zB>yr0_hJTUd>INSCHf|b)> zmA7Pgo+6`J)~Tu0^zJjNk674LKf*6N!}S%2xG88*80O*yH#ZC4-t#W>J~yh+b9JJA zug)zMek*a(d^cWG+x;ra-0>v6mOT!hQk<DId5}Dk4p6OoX}gqaC>mJqSR)%u(VmY} zE}dU1nwQ6(-wzApBN0>P%iD-78y+<zYgX37j>U@H>PwkG4x!mXn8Q$g_MWnq?B1a@ z-Fxv_`%PPNWM-&Qk7;=6_lVOR4^vd^WjTiC-3kHv@$V%A+n0+KL)<7TN`P`q9EP#K zqnn@JkC$w@D14k=Gz7F2;@Ea{KkNaIh>(zTj?tAA0mp)W)b78QhgiJh%ioWLjk<Re zO$OJ$S7dCs)a}eyFk+b-=BAjg!(*gviCLa{!%oj6WOzGe7}+qbd#L<)v8;iyH9O2b zcwzTc_6>_$e<CYUC%O7w!A)V5px<^}&5G_UCth7o+X-Pb|1wS|&KXGZ--V$e)4ZY8 zqw^0i&clfaUA_lZPNz|ZeLH}q<fAf^Fe8}~_TSMK8yeo`S>bVp-jq;6Y@6MoH&)4d z4`&$d?uvc?E0qB91Zh;t19@6eHi;E^)vMp>s$YE`Cgn|y=9-V?6T=SQv4X52v)r5< z&+9+*UwI=pXWU;UKmOAXqsRu(!ny(ZW9<TfIl?(Wj~1Fd&r375Ia0D!xIP-=`{%@_ z|F*=|*3^z?=Q(5;ppoB^NJogjNnZ>&5+$G+TekyIn{yUA@D^l{0AT9eWko?7&I7b( zxh`K7x*|8Byiu&ZwMb)C;~yRo5pjY!4FSl??`7MEcKD;CqSPMNjI{pmF3Z1v7pE}b z1q!wA?3-3iVS@C*z^Z4E@2<dKwB@bu_GQ3Gx6T1FuxyK8Z?7ZzN3<e@y)In#;QDiK z;xikZ=d+yrbOZ)Uubr>&8%-#npqrsR3yfiHSgIivo3ty{KAt}q{5MWN*W`Bi7V|5* z0{|kIMp(jM>DJ#(43$R-nbNW(bkydka?N$QK7~VaDSX^bmVuGuk3#mVn^CFCY?IGP z4R1On;N*Zp`{fO52RHy$5Il$yW6Jpajk`FgorOdQbAYM<*L;+~m9bXgJZsyf4@|%a zJ%xJn4OU08mgcI73SgU0ob+)vCqHxnyEur1Z9NhZ^gC2=@eJzxFqw?OY{=|`+OlAz zYI?<UTvxI(aK1{8nQvTa@pEgbq*&w8wA<`EMf~jxYb>MpAJa<DP-IY|_KRWB^zx&? za3Lk=V24fJlwbMO>{=TLSoKt6s|F<9gDAOp7&|-!9UTkAWMQ3nOqDwMr{yeELN3F> zzAz*=A5L#=1!?@w@ull+#)IgII#1B=%`_n8x*TbO{8#6LqN_W)?cH<}H1==Cj7EEB zqdekj49^-|w~LMay_$hM(lKk}GQlGp-Asp1)iIV=*;~ACOL-fbTc?3&_QEELA#b>! z?dBtjfo}Tu5nO6;t*y6t-(z7}M!ctKWF(q`8`m+rg-$Bdg<Xpz=vjuWZ|yS|n?yKK z38=LFu|iSS|K?7;L2zxH7|11X8Gc9lPgN&2u$|g#ttSBHdX3C@rMoh{n8}D=<CZ5- zHFmvWhMV#{v@AP+Ro-I4?zSp|aWTDU;X9J>CwjT|s;V=BzB#S+{L*QbUSC*ZnXWR< z?P=g4yGt#!Cj~W^77109`V$0j%I>>^CtwA#+I2hG_`S28_HM^A1&5TyCOUkz@q=+R z6#w~T)X#jwLQ?Q(P>j}{u+7)}Q)hVvt-js!T1aud?Ey9*&V3N&*=(YYijD9m`UO2m zSPeM5S|=%8+9K(XEH(juBl=uCJ<x{Q-)(^oeQqlIA=(RastT_{^x-9azGFcC+G7(C z?9|Blk`XocF$0-_)oF2|B+-x#yxrh?V}s{RFA*4060>uUZ3Z<Z^h%D&-ruB!`F>v) z5mBr!UW(@VT@7q4D(wKYmfKioS0-)#IEUc)U-?k0BoFK;ujzP9<+@I#zu^}N^FNwQ zmkD(BLHz!G?j+Ltj%+H<x<YW_QLu=t;YGg;LhtY}wjPMJ6AADl{yu!$9MQFCJ5i$V zy}w7HFN`9Jj+!ApBc?G&&*BFQl$|3hCBnu1<XXM`HcO?D&Pt_z!ndb62#8r9dKsJP z{|G9AU@^&@F9`9v0o`DaPN!`fv35BGz7Q`0?5izCGoOXzbIvsUjgnPE5|-?W4v$AK zUm2|_-KgY^|7u%i?LWKRJK~X5^DSoC-Ety%t+r|=^Kd=>SE<*fTkajNJm}R9dY%i< z(63_zI*3b<%Of;XYIeM#Im$=nKGV_WWZwS7Og<=J^#T?6e@l~3WRR@`N<ezePx5ev z)njFv$HmO){d3LPigz(lYfL=_<x+)e&jAeBv3S$i1Vqql8#vq#Y8{6jpdw-@7iyw9 z<?iSS56=5MG3dW~81JEp5mfZ~)opo#q&i?Tt+!&xG;6~YW&4W3WRPQtXE}d7ImJyY zk;fvAmJ`O9lH_jbm=*es!lQZLySnQAlEnRwNej1WhhZ)8yEl*gli)$GUic`td>Cdl zJSs!NERDg+^VEP(B)-J_Bh*gYUto<rc(D0%62O%Yx1~Z|%6g*u5D6vmhdxYK1{m?Q zPtsLeG?>&@7N=_-2-@!e-n)<e{@~n2h;9lbASP-0)y4vdzmId`Y?0h5%pfKn?}Q5g zvg%wO6Ys`t)z;QNG;3&mgC7;jjlFR#WfA%vE>9TOjsC?RxbQ{OVlyIg2Lh=jE!Zfh z_4W2`K)9;}JjjmxRC4)qaxt;pqL3i&xD(B1%_!+dvnogfuQ^aS|1$FNN&_~6Y9d_Y zJuh{?Ibeng$PS1UvISRL<~_I^g={e>mjB>fP^@KuQ|4BvC+7aHy!QpOAir4#lP5ov z;X;ugW%#8Hbk`~m-!wSdtHWIpVI8?;N)*ed666QR-minIdQ}>O4T{dWRwfsBa=(h) z7|hX?@lI$jMj;RP%cIc2?H>?RMaL68FIZl+!YP&a0Fy=}2(G!%l%F~oLn>T<jJ9rc z{@3+lY<VYcUSwXX@;y6Ch7mYR^7^rM`P=~Y)T$u~(0mn`*ux0ZYu(2}b;s4%=q0l{ z@OO6F37aROmn<wl(&B797##}4zZpk5yB4f&b{q5A&#=JFgX-3#$Fi=BF@y^+jQ9<c zAXyKP%N}#tG>4dvX7}6-x%oi%{=kx+5`vX$okKI?GQ&A{RaclzgX%M^>o%vM{-%HR z<q?9TD@ah^&Sqs|ht_t$s$ffljz1<c%$hPOU(Qg`oV^S$Su@XAvhxoCLZL)Y7{W1x z6j`4C63>@~2fK=s)uy8NL5N~2a5<gXNwgdG3n`*h>@)Zvhv10c{~i@Z0B`9*F$x-H z@?TAT514X=yaC&*;(<ml8b+hXq+xIZ407=C9Z7y)6fBCyJG@`0CAJ)c^KE9pM~e7c z(6`7%a&zGT+nUKTR);T`qAHZwEzrp{B8~e4d;j%W&DQLC3plLq<T_Z5^<vqM4CNAW zMHw1CGWUB(jNlz!U)d5Z)IFcSR}+45ObrH!S(LM!SJ}lt7Vf<Nb)rlv3i$-Atd$c> zD%r?dKHsU6G4iycrlw}#hUI|`3rHO{nEeuYH9QJ?`+-a<tRJUuEh8f%59p}#SgLYJ zg-<Aj%srEdD_gPlH*&Ytrd{;UH~;at_e9-^=Rr9*2O}c<<HiNA!@IGRpFK?n%AwO{ zVwa@8`~W51((|*JhK2?*)<sOSjA>s}akhsKccB^jtZP|*b6uGzmV%gFZ~gSJJOi8% zu5t^T|K2OES*V2~cCQf)VdX%Pee<j)PC=xC<K-=fpY-)YWd^N&qTDY!R(4&CL7foq z9aXmDy2KMKjASP?IoO^tL8+UPsN@qPrlXV0Ke_@5d_Psp3gRqSVn|3x_`ue-o%z$H zmmzkL4ChA!@=~jbLTYHWDtgakL2#(?8O&pkfgtE&oh7G{sZWi=KzWeRFd_k_SA2;m z>`mZc%2IWCdg{$#b@uFTi;ig?!?Lp=6&?oTVgfe&@XQJ>YpT=R!XAq+H64Qwb{Re- zDv%(#N(7jX+!D~s=Z9{zeh8cTC=;dR;~>ueb_{!WcemE$@{om@`2q%)o%|dpn5exL zI#mC>K8It`k_t5K_1@d&=IY>w5uC-{tt5v^v%Qh}7*t~<B*AXL(Wu-~XY?`jA@X;R zfW8BVvXs;*O2uq@mZl>3h^GMgd*>D@@l79bzP^vED@DUjEXwxi5jg_4x3zEJi&_y) zcJ$qdy+BjD@zZ=3$f{7=o-#|*?ck|90ZHreLFo5yO)6eSr}3fh15gVW)|6<3(I(LU z`>Bb$o;hW75qB4uiBR+11ALWiTF59Vo&6QV=%CO2_EjO~1GS@OHY){jtWaR&3(abt zYJG8WzY+9U&nqBEQQ>?F9=uPWaeznSgXaeILguL0`=NgeWnFY%&*GaeK1d(F-g6Ne zgv0!jt7PjUP~40LeUH&#OY-gj?a%Z!Cqt-Km~dY)JoaH5C^zC*m6k`3e=m)aHJHWw z&gE?oxSIUsDp&L%q()6b+h`m7ed+P_J<ORD9TL*2kmL?@RFs%Nuy7Z@m%|bMwC1K( zuR@?WGBqS25tUxDj?;O1+(PRdY9)F>w}aIzp^Olie2;<AAEErkq=_;fYu1krW*A!$ zlP8hZGi`-iJV+mkbS4^B>J|Fm*Vb(Ac;tmA*eZdh47I?9nb)A!-IW_hryfhoChm=T zj*2=d1INz=d=|z3IX?NgE&f!4$FEp(erp)`Ad7I1iEzGJUZ56qvMlN85^lEoS9eFA z4M8$J{Sl_$AojWZmJ)PrksbIdk-Niou&e}~gp?GIY7)-fZqvZ1^)!T^>@5eI+V^}G zoJ5hHsLKZGXnG~zbaeJBCl+8<%l-ISHL9{+g=L)Pb-ts{AQ3rNwa>eXy75k6D*dDa za-Pp!yIo{q&)Gn=KWe6CXtfp)KrfDg$n{13{Vpl0>HA&d?m8_z$qJpL`#f<Hkz!I( z0cpNrbh(U{YA}gwD9u#QXpJzv+mLCbxXS&>xb&AF!Ul{wvxwQxZ)s|3QvSfgQ0S!C zk)f{eyQ(p3Spm4joX!7tU_O-)T|@<>Ce2@#jQ85I6N(EUsEt^B3WEe(e37efK^iC< zRBL5`-ErhsM0h%5F5E5BC=-A9--;iABV-xRsk$hK5U{vs+e|C|Y9c|6?#HNNN}Aq{ z00EZ)O^$HjbwT%b7#_{2i+5oc|JIhM=h4R0&;9-fpx9Hsg!WMMXq@~jM<CarH#XGt zR+XZoFB;13Apd^6yFOrNKp%Xt0|#6}CMiQ(S36Hr39l27ks6+m4~RULFc8EDJk@pa zHD@ZnM!kzz-~VRRMQ{tmB1MJGrh)B|P4+AD`5}M2f+V@7RNuAcP%YlPTy1dO-&#u4 z7BcD#tu5Xh8WOFqotbc{IDEKp6I<J9g-?cuoueE%MR*+yt))wQI2av%CqH`{S+=vT zo$@C6lJ=70@ziSBd%DIgjfHvy!YXx74wd*>AR-(qv~Lzn9|EA>J!D_!JcU)30wz5U zwhf}od(3MHh&2&Df$k!)H@eydSiT1<lm~tH+*s&o*+JQBHJ1J!+hXmKsMq4Z{m;bC z@@<CJmLwmHkgnuB4}O31d%tK7auL&T_5bi~6r%fHxbdf)>LMglvS`vWIEe1v-Zr3& zZ;xxmPsK_7=R4%!?K<7Fk=%xd5Xks*Bex9&s}dIxKUnf!v_oXp6#~Pycl{sydh!E= ziaFbA-rG3TXb*IU3n0at3WF+Rpqj<<iJgr!6>P#03?*DhG<KKI?(&9VKF+As!Fe`U zDxsPAH>LQ#j&v#NXt5D&JDo_>WVx$kqyGHU>!){qzIcOp*qKz;IK)w?-`sQr<&jeF zzja}c6PqF^!FZ?VM8Aq}(B;R}-j3}nlwJ%hC6NHTD=1DZpp_oDI{MaJ^n1$f4=mPm zWK!z4j737-So${hI@UYRX@J=?oj*<)j0P}h|1@fF{~OgXs}cW0TrCdkvTwtL7djMD zWDnNE?=;;Ts1pMXXd7_eFyqI6)&cuZ8W_lr^qln;3hm}wYSM{Wqb_i$I)eFKNX<N_ zEPJzI@&r*+qj>zVQvOzpie8^V`;kL&_Mr+rbQ2F=$kg{GyOiLANpL-5&zqzFi9M*~ zRI7tUJ;HiCLXCPpUZOuw_4g!f?X=aeWFwn&s@PF{(7+<FiN4NiEQFHNOUgobc{ycy zd3i#o#^%ptisvx`LGyiupcs3Xa3an2!{=)!i|ODnT74>hNC3Z|nnAhs%YEBQ#G^gv zcH>uAG%3Rqlrfs<0+y#p07_BXULeIak}fGNO@FgeSGxU-4LbF&)FZ2}Nmy|~fq7wJ z!(}{yv7mBUac^7pOAT4!4c*_jeD)HxjgqRAmWR?fMK2G2{4rT`1Q&KNCKH9n%Gj+- z8J0#--TLvp7mM*u=$WWq*6zESd^*79s6`<N+(<}*a~6o2nB$Xsf5c4&i~am<B^V9J zJk)fo0e6;kIx4~V?I6$?N#_lMF|x0>WJ=Yt`S`Jjp?;V>4t*OlFA>n<1;@$EgOrmd zh3~Y(h4_-jB`MrqOb8>K+}hcbr0Vrj^O4M-K#U*-8p~{{p~Uv_ym#~Et2yrg2l0}= zmmcb>K029Xh~(j3GiIM+y&rW3aLjB0ro2KnG>GR6?9Rr6D3`-IBz?~=c{JhFXk1G? z(r>8$8ITVmU!wYoJ<aaAig8U3h~0Uj%*VvRVJ&!@W=TXq!k`((2i98gNhf4P)5SF0 z_eo_WtGmUvRNibVs1kh+I0I~G0sgtlzrR6N4WrvJkUF^kX>i-Ga<nqn?U_|9Z3uaU zD=v$pbFLeB8_tr#vD}w8>4*C9z_tTWLamCz(|Du8v`6Qqxjwwg!lvZ|T1Ql~G^xlN zARDLUkB#JPnru|T#9B&{0iQVdkG<i1Popb``s^vZwBxxGS0!A;Mbyn}j@$G-RnPVv ze{AP^5ZQ>yzM)`_>(mXRud^Nlho=pv-z~mnIYKqg*I<fkLCK+m4WPwb=Z&Z2T+ZX{ z+ZUaC*?eEMw;@{6<PfTDbQd)}D(Jf*Lr?VRSp~T|+JE3t@8eZyQV>?()ioda^nV#w z!$Ow7-2o_s;8VI4(a;`pV1N05@jD~tqq>CPAU~N{c3KNyy%8hKQxc5G+y~4kQ@W3! zCAfz%L8fBivk`cbb6m1ISAUFmeLCcA%^LPIx5}yUVy{nM<mzOx>f6C2CN&zqp=Am| zLP>q7GL6{%1KYqcnWPBa;h;xm*(VIvq7RKPK_<A4!<fL>C<dbDqN@_`%f9;h>(t&+ z!{qk=sCLQY6kL2au~S#rEv2dAZz8`s?PW89h?0_WH>|O4pL-O6kT<uG))=^^N=hm~ z4T7NY07s@QVX4>H8!HY1uR1zAm&wjD9{1I~z{QJPUcaMlRdXcR0K{fIwL%Tzamis= zC$q4t^)5FmhN|brI%XLg5#p|l*=XIiGPFAXl;duG(l7@IdR1MDo2fIoC&rAKjiqMm z+GC<nvnUZ!X9GcjmOt26)(`8?HXoUuqlYplJ^JxnfC^cJvD1P+Jp9B-nStm<RcCYD z*MfYHb$4iTv?52g+Ii5ALLwrLI{~M=fvM}Ge0W<$kK`WAqhGNjJT%-nz=`}L20h60 zYRt#5r<=XKd*Kq~yIy<c{kE~_*hwrwn%;gzjFmx}Rih)OuYB>Ul!cjsW;&s#63J%d z->!c%0g<2cNoG?YAZK!hwxp}+bQ1|$t0ghcWz?G`FG;{o&$*x33M(ek%iDY@!I8(p z;okhM7S?ehdit~>8>#qc#vojM9UYz2L+krhKL5uBuvPp##h+O&CXf+J|JpVy$9!k_ zh_c#pYE)EE@H`iU%*iD0*s3TX(sTO|G#K81$=<TusvgfjUwr>!R7Q-ZDkL2xe=m}y z+7!`RV4`9`=6l7;xWD>*yU|H>s1)xf_`Cm%<JEMFSK=}a6)+(4j6=jInrpui<0gh@ zmdyE!YU<jjiY71TPxzw^tEJI`jy7`-QInn%Gt0}|n}8l1E@o+2NXaTxBe<^Ss&c}F zW<@5;)?O0P%Z6`w$Iq+Q3yaS(t?qi{xpS&UrTK_1lEkQut;iHMdUbiu^9zD32;pd* zpJ+BQxmpHzbs)N{<~9i;+fQur=+~(4-or%+M6X4|-n6~4?T?rI!n>f&lwa;~^v%nh z0BDNBqWMkzmJD!9&F)w6Xc1){MO1}8t~saV6o$tqGf`q#5Fdo8wxjW_zLbJ~5u;C2 zT`6Ua(*<>x+!vv59UkJ4(fYzRbR|aQ?NYjfrxWQ@SQ*!(vZn(m)p&JP-PC)pE(JdS zx?Wm`QpE+%GB4Lsq!oi|vCgT@L(Ic)a7Lp*x<XyM1JC)Y^mPZWWwRlc%FFLEC`JP5 zL$ky;5En!;)IVM`_S3fYx<o-RV60}g%WfGv58yt7+t+*0Y^2<s_|O9^0yAUdThqVH z)H8Xvqcm|C?yZqFykQv76oV29uCOl-h)CMC41&OR6Dz0kAM~PZw6#A%!^3yad)Dvi zR-B{$!&B@r0N5kuQ5HjuXNiAYaI7zfO@m%83H&P6AgTMSHBm3@?%{KOU$)jpv2^TF zHxrt7waTLeKGT^+1f8(n+p+wSQSb+7M98D=Xe%2IXo(ktJg*muW&GpqdGAHQtGTY` zoaY^_=IY3`-7L|H`LXtvISjC=>dmBS-Ds8CG_*dH(x&xt?;k$WnneI*^n8yqLiCC= zRfQ5177xco08W)aY6dS_@WDCGgbXJTP3tp`cr_J#G8N3TAuJ~0vGv2c*xHCm<gD!A zua3Qg<-yxoYyOrQEyXTo1&3AmWT)AhCd`jx)12)%H8iEsAEKx{1QKnK?P81{{SVLD zA2IWjySQx$A2aqCn#`+FCmS=Hk{_<sddXV+HM=_=Vl`RH2%YyXOw-A|n(2{BxAOAx zQnMjCV-piYvu0fd6az5<ABT!YUbB<*mi#qT|IJ(zj=U%s=zlG{zs}>Uf^b2~(m}S} zumjZep=D}EL)cFfdyvO)^-BgJjg#+@RU8%iLG5(;ewBeN$y<qRTjJMRa3us~3KIpp zuzUgs%&MmOw0rA}wKi#;YYu+(-BR>WCuWe6kf3%y6x`-8!ueqAxcXYpxzcr$DCcNC zH~1-Tx^rxn#2><&^6nCSHn`rwzNfl`ov2tS9{9<AyCz?(y{b^t2QNI<4{)xE)4RR< zgmMd+y<_--%_LBFB*etqF<Q(vP+5%9?d#oB4?=GqQxE0h{Qwm>iYyK1B|i<N$n$JR z`xXlpA5_DY7bmBr2B`l%^7d%$T9?lpF>O7RhmTcw&Nyz566$B6F2CfoN12Qh(XN{8 zO_1`u@tsJL&6NQiPcPO%E-U$yA!-mu9cG&$vwLBkC^l6^RyrdR?K_aV-Vh4MNynQ2 zP@}on`uY$n6de|MEWh=)^KOh=sYDlBHzdBK_?}3InzJ43Qv2l(TYnR5;ffJLv2wR# zp}EG-<nEzXOY26ldSFz)=UoH}1H#IBxO19~KQU2K;g0~II0T=5f!G3v0l9r#mA)wD zEJo6~L#ZWcFGend`T_sz^tGTZ&21V_C>cHutw8@ErIwkS9rftW<#AB&9g~R%!5;`X zQ9Z#;O7{wY!xBRuCP07w0$u!G_0dHRf7X9<D^(AVi;pk<n~s^-+mKH)^e|(9=x5zT zGArVdZ>A)6YteQl`FiR1fe&N&uiFCigM1W2<~~=AZq0n%@xJD->jCL{HP_=vBr|p6 zuTiSyI2q0;KK^raJQrlUx0emR8N_#eK{=v%=fXClE?$bn91R{j8HenS9BQo6Y`f_} z@^(m&{5j(3X_)b|MvVB^U_^QdS0@)Bzb_IaPt;P`#r$~9RK5sdLlQwCeAC{v$;nCR z4w9mymB;%9%)h>){xuW|BidBrFcB8t%!lD5;yeKPE``_L+L+!JfS4qDxtmYy{yJga zu>+;uyIs?9YAhARC+k(@ck0!lYWPo8gIq4XN$_XSzK9qY8hXVh#6@tfC*Jk_`$d0{ z6n*^rXVQ9lblYbninW=%HcOQ8A%S!>s>qh+oI0|*3VislSK=R>QlTJ4PZ&gN-6<>s zuV;!r@%StL_cEkpT-isBN?z>H^tFE1yq>U@swDd*5y0TK_$9NWRD;+rNG2Bh{3i}R zB)>#nDAJhMRT8tjO7*}Y6{F0Brruj?+-;ys39<9E1&i@RErAHa*Jn2Y9y-6lwtfzp zg!A?<H3A4k^VG4T6g_BXV+k|ip|Ge%Ru|>cS-<GimUlkw^bP8zGW5b=h^aMKtxM<B zo>UMz-{4_`8cX;)!?R-e_q!s?`nOaUQqPeuJKwJ-;-E#0K|yeG{ze*+p%-V4P`?dw zyDQo)e8&OWL?-t$HZcLjV+lbYlootZeNGnnh8!*Mzm4FMi5$@iK{`;K>3<#HjG_Eg zHoRlkbQe~&YAL$k59;0OEtxNs;t@r}WwjsdEiEkxZfoIgGfEKA!sWLl$H2tye(Qtt zm%5{R0xBNU7vsPRrZ=%+iUy|=m{^be(l4HmWXC|jiN$e>e8sqvjt-A;nS_r9`#eMt zom&QfZgMAGcXoB9z5d^d26EZ$WLO#|Ur~bI11bZh96G2weZh*73&jCNi0+l;Rm44l z%dyK9l{LiZ@^~wVEg~afh>;oGz2+blgFdPi;&r&Mj$l>6Q^&REt7|CrCyD(HJOCnM z-E35;+cyyECAGMOLR`skNPJ36)I`ShJZUKU_GCaA&E5Lf*9<Ovf>J<`;T=4NY}ck2 z;YmDZ;r()h)P;Kr4i+v9h!zxG$mgK{|Jwu_>c7Z0p{#=9?;vqJIZ6&2!vJ*^HI!bo zsdeMCJ%QDF<D9u1Etqd#5V0eSrg@O3#<O)%_N9m&h37i~8ZIQ=T4XFf(9$CQcVzUy zflr0b#BN`Fn){xL-&!XY<{dmJWEnHo^_$aX4MSElYzud#1E&~q5jIa{`72|5_R3g! zk<TpTE5?w?JPiMTidn-Q7V&FjxGijDR1U0=D45okaq$vAiyd9QLEe&(xPbWmL4oFz z{A!$R(#Lo`w{jWKmxn*piUc)xPpR`)ubt``u>etL8iPVBEQJ3ZFA$Q!nq$xO_xBGX z;fKyOTAQ58@$R1wK6qMZ4C(z>Q4eK<c=BXXkQxfrF}w!<$O~{dCt{zMLp<@h*ZlU* z)zxvcx)Ca?9jts$5BuY^Uvct0xyY)JGA*cp4%B+}LolTrqx$veUhG3uSZZKwvE<_$ zlsO~*bvRb<!(7E$Rn=XXlQZ~uBumD7!k&f`(5(&NFveN2F}v|`5zYpw2aeM01+ zgzA07?Wru^%$arxM7X+(auF{VEH9PFwYHaz_3ujBz@5PY{KvVIT0aKWfDk9XXnkkS z2H`_0AZ;`A-=AatY>c?Kr{|0DL3Y37tMncG$`p1l5(!O#1i*_6@+nWK%$EWcM2v); zO490$HYUp)!J%OHW|qAdXo>jVj2f>WiPQ^d@A{L!qTJSjPc+hD251`bp)Zo_M983m ztrgf5k6QE2_JT~RBBm4j##0AS^aMU-$W;1asOt{Q16oG_xQ^~iEnWa3V{aF}@;gG; z>n(P|VeAF6>0G%s+a6rZDj2->^&YIPVD_hKV>xGGz*L|xQAK&?zhgv<KOW4q^&wbo zcAcb>yiBcGZ8KA~O#GQbx)RwJ*8CdAV88To3?j*D1fy|c?aIZ~<KscOwuS5zW9z7) z^TXZ{V{RU~)F<{Usb;DBx6HS$K+YvurP$!<0W+0R6iE_McBdx^h^G74*<7D{TIX7W zg5Lg1a=`H?YpK;wdv8(FSn$InUN^2Q|DpkWiP@KYFKe+>sZd&`3|}TS$#A!vAep9{ z!i}NdB3>yfjz}YH8X^Yn_f7ZOuwdQuE%2Gpa@d+pl*J0l?{(Ci_-|lNjTD_ZhjtG2 zLF$hSoDakZueJAaBtC>RPwm^XWEfkP43LGNU`OMZpb3G+nr1Se7`sR9iMI;TnKBon zgPeBahle94te4GZET0f0R5j)`jB|{Adp94C4C*~ax`uv(!**^T6lF2h<|A#G2DCyh zTqeM!cnL$A84Iv7i3Tav&r47ov>i{~46kii?u$A|6key$A-IW(>JuCnCDXh%q?D9K zmxDqbBrT8l#5Roml=Y_hVac+~Mw$D$4kUx?+jCtvfUg-}(hrX<!bpv}tgjbCh!*5a z49Y+1i8v0vcjl#{PmY3}*z1rpFjzHe=B9SE_QUKF7|2v3%mySuLE%Gw;c`I_5Zq@x zF{j_w%kSTy6*#Dc*rA<_m#+v<pJHd24SaTNaKCT&OK1WmA)`wE{AlJKr^i`}bE+0t zG*tjLZZwmyNkij<aS(&C$aGF<ju0__gHnpJ)Q~Y|I?Da7kZ2@3fj!_8%Bp;bU{Leb z;chFOb0;xqrz^UU@~b(->ta&G{^1ivzdQvWDY8wHe0Ze(yAD6x^$XvMI)vI#r!yOp z<iE9HdO9Ax$*h(9AuG~ffvE1>eeOHR;MC>nOXoU3w|TY(P6Z_=coIS42*C9Bv2IWe zFTN)fNpRd9&B^-}eVUdy_a0*rakrK+`C9ww3q!BCGF6$XSd1deihWAsN|}P8uEvhP zJ&PRF4_|**B3MX+Fx_+%p7jB(+_p$(sR0>!<W-dQJq=ySoGcN?LRqos_28VR$h>?2 z&lA|xnTz!GFK_F3Do7hovPU6knzv<kXXe9ecB5oDT-C65Me|-KpKIh)4bs3I{F7#d zz(7)^1DnX&A=~WR8*f_gW8HHkQARO$PLwY)5mdd$^)ekLeJ*n%LCAIEkRRd*K}ade z361u`v&~-~FQ1T`ag)>ZQlHDA!P!9E5iE+6ZCk!yV&AsyQM_@X16td;8)kN;4;{vT ztN0bHptNbej-dm`rQem#0t@_S6vA*;TZ8)BTUHV^zaQ@z_Bi;pcOV<eMoK-GKOYQl z2B1DQ&q1&<48=R;RVKe8CQG9~4pW_4p5ghm?WYZ#k3q;f5$bBWXaE7|_1h6P78GXB zVQvglHl{8L<bhRoEA;#`-{+pm%|94Ss!tK0K7V%m^ha*=Rs>@{3DdoMAs-nEob>uF zb|SSIM;tXNybizWf3Suliw|ZKR|VYH^GKDt)7I?iX9$TiUOfyfCLPuMHzq|cALt*4 zYT3VTla@vhGV=$(X7>Z|825@%Jaq-9#*{k4)lSiSGhetX5HSg<GNmu|???f~1MFwe zY}2x)&DZ$e^YOgS>v+#+MSJ0OZTR08ETDM}Li*%Vr7E6`@un+;&Dq{y4Me3&sOz~d zu>rSeUQhMf8(!?MrnTH8`9$+;_5%~?Gr1*R{{X_z&p8tg$4OSN{;VZ{n?xum!B6Ee zmsSo}M;1%I4r$tZGiP8U{;bM7TU#QZgjME^O14{GkFEFZj7u+X;@h8ZB}=K|w`wR? z2@TJ*M4=^eA}vOM;v~KT(+A6ve_b|U==QE@DNcJ@M2~lYG7_i0LRquO+l#EUfYoyu zBDg4!(Ke{hH-;?0<JT|Nv#F+a?eca^ee&QNjn$1Crcq(Y?M1e(Af!I3mF99~F<34` zJ^0taXte-H`>s46({D%X;p2&YNhIq-@Fq*|EJ&&AJzSc$cn&~-<%@|$q=mS%<!nva z_6O2quPe3lI|?2073PX~sq|*fypu$watrs$WwjA!(S>hP=*|yIh8E1j7yXTK<Gy5C zp=Dz*_`g`_x){Z;vmZ9ag_jWYcI|?J`=g`s6L#)*LHBTYowsxnjh+paC10gRR@@`^ zTZIEAXvEYmGq)=dhkx%^3z<B*q+B%L8^&_p+-pitNKc^@LRy1(-#IU<emC!>3QBOR zyv85IqXo3l4%Gf?jM%EUDEKYGEIxYEBL*D@ED?Vph2{(8^SzH#q>MnPK8R&+Lm*hz zzG$u?fibd(7q7d;p9=jPf@zb$kV0{Q=%YvDrpD2{T?W_%{;^R}uOHs{yLMZQs!g*d zKbBkD1Q~x?A3#X&^-Z158f2SS?+#W+>OVJ5RQBhQRr%4=$fM>T-h5D6ces@I3*5jq zNgE}!Ujm>!8i+rie7w2lvzCEABVB;p#v>!j{*$_mz5Q<$sfIT3@bEmlgnkCsTEgWa zbaTIj>=S#$(*Ehi4K&w8B`)%(gT>m-lOk%Nx1QMf5HW4Uc0G35&~S&wB@5<x`huy^ zBo(sb@psmEGUUeN4xR#{Qn#8J!ts{f|F`M#-A_qL_hzarzR7;D#r=K1=m$73yb?ry zmGGA_r+R2C56AY#DQxffLUP6{wiS;)O)q`Z#6)yEJ3AM;BxX5ORs1xlC*fH*`wXIR zO(s^~rZ4%K!isGR1uSs8@#qs4jLkGl^ctNea<d$UD*gIYvBfbnN}hOBH36%T2mUkJ zGD4(jc2;NJv)-Q2@>X?DS!MsIKzBkk4F@I?OBLX=-RS!_QRL2?nneHDhJi@%+v9&% z=;<uG#`iz|z$-u%VU%QV7t_m{72(+m*11dXJ@{nB0N%hiw>@ELY+*RU*;1~4WGvIC zqYbnAD#$xdR0S3jBYAkH;4UWf*e!w+1Qj;(TeA{~(HxAH6<z_(M*~$kX^u$skK}HO z$MfbQkSglT)B*mScWYauUz(%x&@46L4qg(udYFN&?XEPu1CAaBqB;B?tfDp|Spwsx z<P`YM;(y%_A%$_?YXnFH_y!UKUVh1=nrrWyUSB^3OTFf|6F~csxK-N~9~~WiW?sR6 zm(hPLA!WSZ?m0rK3={b&R=-E1n@=tcCZhj7J`Y)}b$xt`Pnv<Ywg|JolV{6QkvmPV z0GG|Hxfumsf*iLb!H)dT0_|o?yN*P&)KfuD(GB?&0dlB<T;IL)c2oK2YR#d+uOauD zmu<bDXXqmG{n1G=n9&_fg)P%rle1s6%L>vI`r!M1dgH>OEQj%_+=zW1`5dg)&>s}P zJ&1~m5_mrFME-zBm5s%>KnfZEU5%N%L_2tQBsoZ7H2MZ^cg5%yuV_Laz>*&Tjofa$ znne2DnGySh7xKgn?(tFYH+B`V%cp&D=wGB5j3=ZSOvP2FYq;fo_9G4RU~|S<`1!^z zq;LxD*Tzs1NaL_6r+4ws{}kO@Q>H?_Lxe5y;*Uy886pw+dREb&_6L4fLa-b2u`BWo zXG=$qx@;MNp_C&^Ugn(LRy*P5mcWFilX9+a)aflAbX6u{GF%h1Acq$b4J|=Yg<+~E zFN`fw^Yxpr+&DL}orJ)WMRxju`MuZl?vjrZe>)RWgoYF;_#%k>rKrR|Fi2UQds7L! z9n`=tJAR@R@ecIPVOMirBO(Z&rGsl|D48<9+YA=*@bF0N>daMd9+0NQpI=^G-gvvm zg`<K2J%ioopZ37#Xowh1Vz#+g7ayYr!s*g;Fu*+B!^_cS5^PdMD<Qv}TMH%o_B-D3 z{9dEo;{HU}7xl6-3FuN~noSPVg0!~4F`P|{j^+t@e{cfBwxo;tP3`)*S6>VySZBV} zA!n_bxKB(UHFA%SwHk00SKWuWq@KqUo(NOA<j<e$0wU$<_yUSiPft(rVd_nmXkKq( z8wmz1+_l2KmO<~8{y~-KrKzi@1=Ke_**uw-3(QB4RCU=m1Ni#sv2bpUDVh1lD$uO% z{-FkihPEl_7q=M+h8Ndiq}}%{ud!B@93_%v_;Z&U@=^S4hKiE+3*aLAo`haNdCIsv zEB8iB2E-eOH!=BLHQ>!4?Mj#9ABmPW>im83EaNXdLek+UbB>RzHjk(PFy;5Zwi^xg z^$Cu`NU??e`1o;2;lE+h7g|2JNy{D7)g&?~n-o=@Na0H>WJ9yq_|we;h&5eI-QaZ3 z^6nSwq*T!zAm>k{^2i`J_QxbnhS6sS--CmL|J8pB3!0)Xgq@N^HN`BFcjM{O3=CfS zzL;&i`9pBl-7JTuSpIRfl@@_n#paa-{~yNqpNwyBez0uppY}F{t2k=E{nCH5y><6? z*1Uzz#k&5r+mF9J(O5P%bo$_x(uMJW(mKHJ%~@eD?W;tj2AD}^Qm54s4xJj)(tCCU zURqwo#P+GhKreRYs_AKGRv>@uvSSd3o9Gymd;8OSX@<SFr!8|~xMDXIPq2N)-tG;n zvXTiLtq_kh<D|>E79o7puHT0L=+ZHphfpWl4@5!&x4M3}zJI0d(3>=mk{c|;Ch4p~ zn)`*XvO*{nxuLJz+k}-d7!-^zpET`%<tyJQ;9mK=bai-sDf+NRI{Eq`dTa^s;*^bt zyBZK=d8{!PXzs@DjtC$8jH<yxmI%H0xH!5ww9X6R@rCg_o~G(tIljObC<x)GV^zk^ zc+3@H1*dRc^W1KVV=rcIu|=isSw>EDiwYz5<io~{wn8j;3rsTU^b4Z0T|IE5yoNXm zj{u&J_Cx{cdyQ~Cgqg5cDg`;HJ;xU3K8vyRGSiusfA$HZ5$wi~#{Z6lK$L}K#OpHr zpRvzL5L<&LPgjNXr&D@0k1)Q;biC>H^z3;AqqMu+gF^fLL|98@DYl)|bCgxu7qKy> zD<xl2jw>Z6r7u<!9<7X9{y&<oGODVrYoBxI4r%G`mJsO@q*FpcX`}=sq*J<68Y$_L zE=9UQItA&Hmj2e^e(xA}`0v7I@3rQd>zPlu3c;U7l>s%KQbI$hm2J^G4P9id?NOvT zWW{?1ZTr+lYeTHrd0V67In#$Qsl<IC!yaQ`tC~cY>D!2s$A}fv20Q7#;`6hQ?*LbD zEDY!OcSK)Dd`)yq6JiyV^sEeY_Iy91y*5N}{ZtMIC<N7p@3T4}7C*hqz1KB@a1XTo zz%9*#@7rRHW>$yAjh+lw2#7f1G8Kydq>#;8>2rU#C8I4*JHmp=U}OVBGFMQ3{dx&f z_H8p73x1N_U->`LpEWO0=(u$LE^Y9$Im@#{p!Hpzv$u<w_V%?qmr}aW(ICLetAv-{ zr-O0(t<LGcKaU_W-&0=dM__^GLp?uSz;%h@UV)n|VVRWu9HB*xS?fm!BXI7}HU=Gt znoFYs2Af|mLIQ=bntYwNVY|0z8|aVCU;FF<dd7Z1m`U7Am%$Q636C5NkcE+Nb--y1 zwIt*fuQ&2UrvxL-^pjx`dqVlus&7DJf9UaQ$q1T4DZzb&m^=;yU3l8=8^)^7bSL!F z7);ILC1@S(FyUrj`IwfxS&GG4`tQcnH;Ad8@R(8Hx+^Hb%s|@Y%Np~@&E!DPoF7WE zWCZ#~F;+cGq^``JZ%2SADy6F$%%Q>4A?-o1+YK4YaupUSZ{9`lo5$j?K@}rSj{_?| z4b+#T4rIVM4ZHvbdbGEXglHXKHw$LYgS&^WoQu8au$P6oc`)fZy;wUa3_brM-!un6 zAQZEVnIh9Mg2;u=tiRrp?RqEQw%&oEC)L?;TqQh#4H%gWTz5K(=`v?&O)gns?rW$} zr7@uJ8c_n(JsVsY(n;>ula!I+wPCQI?1>-x3Kf<g%kV8%>5&6`F)Ef;D^NQX*uF7J zudnN0z!oazvIE!LhR5ZC1<YEcpgeDU3S-9z#q{o?u<6CfUA%)*)t*Y1XoMuP=@tO* zrQ$SQs&nAEezi~+J3pjRk}@6JoF-|Lm7UikxS?DNTGGGXyN^Z00fn#q&x%ML_%;<i zxtdFcXg}F?omJ^QN7Ym`m^<j0AC`vGu-VBEE4H=9kKW#GT<0!5P3`Lg$$V%DGN2J` zBXFfH;-A3?c_wQm6CaQ7D{Q(3qLg}o)sTfX&=9-@v3|2AcQ==v2`+UR&i%@C&33ZU zc73Y&KiO;IVOz5`n{B|V^Pf^wi%Ij}9~dM5R0~~oSsnn7n50>3%8=RIUtZI!>tk@6 znIaAHYj(DB^I@>%?!IvTGCRBmj-V@_+!cP(t1-+236mV<_<^HqjXHWMgjV(a^<)t~ zs<vqo`<+`K=O0h*^I8X?XQMBowcqW-?Ha~6KiZ_T1Syn0cNI=KnF}*C*Y%E*uu9<= z@EV5kleQXKL3C<em4{W6i;ysg(%A!7@K#8g06X}@`%m?{%>(%Lk#lb{Ct^tB$6v`A zv{lE!%PYQzcM0@ghF%Hp<}YD3l@h9veb>DiyqKh~3rUijozHBGPZz_yo`hztGdzly zNVEao#6xqvKjixjdwEnR{g6SRdTfyXE<we!JoxPshfSxnXj=3oH|KG8!XQFXns4>* z1OM#BFU1MN)eMkZowII$g-itD+E{pEf*I$4zSr>QibR;P<csf_;_&mXFB9YEodIAW z{&2H1pLgjW$q+a2G1rsP*yIMQ`U>dcMX0{nNXqf$$|#6JZj_{|FE{V&ukr!9+l4Xk z13o3Ksaxlh`X3j-$bCIAO?>~Xv9SX~0cL^W=4!$Fl3M}O>JG_w_|WCY*|gEJCy1+( z7g~)H07@&(`^EDzdx!*b&TpsH{x!JfUH!PIw}2et3qWh4E~gq^1!}MK6AQ%y@)(*T zLm*3|cwcH7{bz-#f*djG2~h@*NZV!G9l)l3Y`LFoET#|kG=O}t0=RR}N@NtqmkP#; zU%windmW2?ZJ1c{s6UUq^9Rh3f{`cFhBfhY`<9?>vurO~T(yU0cQBn5OK;bx?fi@e z-YK9#$;(_*#Cz4R4K6DUA7O+91bK-Sw5)u~e~;L?wok-^vmMK*uJ-@-c0|txr;(~1 zBfdZN)7!2_xm#acnuhmckHDTkC^CKa6AYrJGk{CcG(5N!h{p}sH3vD(Ux(%psIYgA zQIuh$e`Nv)?i~Qq?h_F9EdgQ8s<n8T_%USSM%XBCX%c+p;r%SRhmZC}OQ}u*0uqBG z>Uo^?PgT-S&Qfa51HxEBOxO6-X1OxQP1yC{Uwx`13widNWQ}{AeQtK_z;#G>FdeLH zf51r4-kyTn&5!)s6bD|vfN6yVmMauuDbW1&uM+;G^4)XD(>VmoQ;*2-iaCMfBX|ND z6}hqe!0@mgZ+&0Ovn|UXg~|;MPa)66PbF!dBoDwVHG`-@w#gk<k5hbZZtm%EqC}NS znuntpLfT$oB5S1Rm=bC}`!%gv*nC&~1&g4%6;xCcqnpF-UI5N+(F2K?{a*UJisCMN zi_P_yaF7np+w0y%@v+B#3Ej#N7PodKuE}#slf<yJ@Zs*&+UmZQ^Q;7P_j#ePD3>u= z;wLYE{T?biAaQbqXsSqAPX0dCBNel|g#*k9&O9YA!SH<5x?An#%ar#E*U*@_xaufB zWllyv)-mZwr?MI3s&yks>>#UpHO^ko`_Z_${jpsBzgZJY-vQ0_ekJSfv~Z+$>WpoT z#;UA~Da(`hpuG9u3MfsCx{JZaPTBeVEW;%kJx%_06$eX)Uc}SxFzY$27iH1Qs-9v* z{Qf40+)(}jVJ_Rgp<oSsz;j;Ihbap6Ibu13JB4N!Zrq^?{2OPcvH>;W&oh=+z>$Fw zw<g?97=WG%+4O5xE)4pW#*(iJ9XPL!-xssx`RWnLB`EP=xh=jYy-uXmf&HKt%;Ubb zYon@$Qiu<|ng-WNFSy~Q^gD{@zdH5Wy}i<wZx37t;JVD@d!m0LxV(ho8W8*RdXaqa zO`EPy0*S7#bZ67D_!YSGGrklAZ8<WC*H$ar3>%JVE`um1+m5<!c~V}}=X2@ZPW3NB zvoR%bY}3Wd2T6XdM@2_G46={$k<8nyRi+iy*#kp%_iWBO09a*Cnm4OVd|=lE#xRS6 zTa3v7^LvJZO>WuAtoE%C^3(aZIvL3vv(LijEXs#^r{PrZDLo72>mKpD_lJO?c$X9# zTh*THDh?<_C7@|3gy+Le90H*4zTSL@%!aH@c-&a{Yc4~jKJp49yV7Lz@*Z-5;^4@l z_%jOKS0CILftAl3IltMf50ly~Tm>V&ngZkb2Bdut6!qBp?cQ03*GP5~e`VUS5n=PB zGk@OV7vbAB3fXgqk)jkY(YE>pviPg3ApCJ=w&@>6h+$G~^jYr&#m4;~@Yz^~Kdq=| zH>ri^3?Sp~L(ri!QmAF$h#-GJZ|4Q><9FbaC(;W1+Gc@I-_a12*J<p1{Oc^KCn%!} zT9duh{Bf-aDF(5*>4yn5Uc%IQICILT{8`h8?UzIALvTGEZB$A%fLdT9)2USovzE*m z`9`sn5~V@#7V$Wtx4ho&P!2L~ltZsZx8-;eLh{|%LGVku;WMNPnUB0;fsuC+h?607 zfg$8GbnEH7sFB<<Hj`1czApE6;Xv1r3mUe+m!9B1HO1ecnVo6(5kEgz4EOhkl~SFT z$uY;h<f(VPwiNDzaoya;w(H8cs>F*~5(dv~s5YNOpM$9snBt*hr&NRV*e#EW>*}*& z#C@}lbnK#(pOkQ`HyIhqXZNnj4#JzQ^EXz+bzapD3WiQAX_bg%#6L5|n-h?`smP|m z3r#iR9_{N?%<j({O_t2IR{p$`{CtGSiZdPtV{IZ(M9zNmz4S4*BmjqyI*1@_UoOm` zy$)@2Pq|{_w#JKzPslu-5BrVpKP2yslfGFGRm96r_kKR7Ro<~38OR-|NfEe!kWB8j z&A{l}4|ZhL27g+!Vq$jdX=>i<)FWEoJl&6=py7>;keyb@dHMZ|lNhxmYTj$V5x!Mm z%5V<Bdng;BH2{FK*F4*x_oY>iv6WD?SmlIR3BSmT;!BNAh*z8t-%OcybeZ`)>S%P2 z#_^l8^%#5LnfEroqwBp6i*L9$$>qXh`<7F76h%ECm^*G;Y-Gdj-nKiW7yM1fvDr)V z_JP&X>%^ZsDWL*m5*78*MLNj24E2WNXHv+*jVXCW^sQq1+a_z8#XKlsGrYqoi|MZy z=2qwsbMlw9dY@YWzJzbmSCwy{khNy$!?YA;xdN%RdfAyYS+9_&oc&a-Rc{v2&6&jO zS<yG__wLQwN0!~zB6o$K_E$4W-JDhUyn<!B{z0TA*M$DzYt1B>w}3ar?kayejqrv@ zew7&r-ie8ko&7=^UIlRvvrhzPoydc;;~1stG73@<b3Z#KfD1NNZNiu!O1|IG(8Zaq zEMx2=r<G5vL29z=#UTsL@x%CR;?Aax+F>W_^zmA#w4$YPuUS?FzU$OILTOjn&phi( zMFOqPR@Zm+g9br7DfE^mlfm*6I)!IJTPpS{NHH2J;w<p)_*ekCe{#7x2c4Nk-3SEZ zL@5BU6uN4m6`0v7n-LVvIk_UCN_Pk-WIXRuZLHu$NlF=rYRU}$T8akXBTu7M&!8_a z%38+xUtZ;y;p!(!6uk|BU!j2%x7-icUjdW+tmR(M>Q67kIauR|S2^8?nSwKB6%~BG zA1kjn+V4`_U>gE*fdBM3)qufCze(nO&mbP)M0C-sRgcV)`uFqHT6v4h`4xSpqUNA> zNv?JY*Ixtm>m87Y3H}`_NeA}}@jQOJ2>L5{!&vmuX?Pnjz}9RxY;G3_0hV1(GDAP| zp2T1A?H8s139X?^+}R(mk+T7gGs__;=qiq&Ife0sEaLWKhv0=``@{(o=J%%$BP#3u zTM5-vrzQZx(j6_Z12VjYU?%WqF~w)@OF=AVf8%U|8&Z7#ID5RnevDzBtL^w}Vdhns zBufcsy4uN?J(o)$l{*esr6y-^aS3g%bsTj_AFhxW&j&EO3}0<&yx%MbF?9f@h<hLY zPcfHZIPQi%z35|m)C-zCq=*IH)$Je*qpZG=gh{|%J!z+GFi)yh&Mmd5TyZ?Vg2Nxh z-Gc`WQs|ojqG)-Ag~>miCcwxPiA3Vi1i$E*AJM}ESKFgiOn5gwk&RfzoW6etkcOux zH%r}7VEV|$F1P4u%L;uaAP5Fe{X@P@p<n@42MiR;A4dyzz<!HG+?B$vJkHY)TL*0~ zbeQRP+yr&*PU&*-5>l4eIcZu;GM~dr2N9UcoP0|dZVn0KggSAqRRNp!kfNvKu}Xf( zzFp$x!vs=4zXg_5R&obHPXYgk_50;6^5^m`Ljp;yG5|i5(ukKa!(%H`U(_VoB12vl zpw*(M#l5i-PPVEcd<LEkPn+*RIGr!~_9Xdk>1audC9xaw5io2Lsc#EENJ4yv_;F(k z^Cj2{W8crq+CthdFa7MvY_sN=>(zmkGfM!$Bmj?p3F>prVb*UO&Cq+$-i{<Vk<Q;f z{A|?&_l$VVt7_^>hNUzRE0f>2ITd@2w=uBKCDYfFDUrC68|A`%9waTZlozJ7255tV zW}9f*=rjSNC?o&YyHqze4$J~`|Eu3U)%JK&qAy3ou(ILPDeJ$X)xy&lh_JNPRt07P zMJ^}eDk>tFFOql14s@_f+n=ZG#DE)JW>UIl`t#e#oKwAn5nZa3za^koa%7-;l>d$B z@PpoYDytmZW*%hWHU|D`8M7dtea0sy>bpGRS65df9^Kw`abRumRQB~KW-G?fXum5D zral(i4p?&Ej#gtJL4kA%U|;scF>u{Q#<FY*9NFiO0uV{Nm*A|Qn!i2(*vrrs`)&5} zG#gHX$QFy1dJ&*h+2HZ{y)Z3pl$C(KXW|=wd&7&ENF6ajf|zUF0n-XqFg?A`9k~E@ zOr#^(36p?l*j_?wO8hU6^Q1~L1?}N7K-Qx$!))u~1xT5{58UiO0(OxSOTTu6$npz# zILx5|vd|^iNQjC#6v>LX+5ywW@sOQ==PcF$@lsk!ngH<avK>j&CE0esaHUq>Ck;@0 z&G^LNXX2AMk>qdLpnP8Rc+|WvLyu~FQ8&;06!`o+4oHJ9SmCEqKTOqU$v^i_H2Jsz z!z~kyD<CfK&`#$8vO69Zvn(!elnzhB6`eav>dp!XBV2tJV$CQRO6M1^@^o9GMKEp7 zOSNaM&YK8CSL{S%+8tNn7dfV*_nqRXe;6%P%{qr8B6xDNJL507M4iA7e4QxfM6Q{S zTbXT!UaR5D8f<y>@ey*^!#8^*0cN5&Jzicxj0gKsv^fZV5ZC21@M~G=ieN(v9A_cS zq3o8=HzS_|HfJYJSuM+p){S0mV$tipnlzH4A`H%k?Ag+*nxO+r0U6U*uBb4Eu`Hh! zH{t+zudX$LDlxm^sY)nq2u69b@0X{PVJtHElKsf0#j}P0&1byCbU21PFh99d#)PZ{ z01!S=id{J7@)&H!yZ7A@q!=W5MZhp@>J=EhxpeTu9-!|z4@xY^cjL-DSiQCP;ERkW zyx#5i+z4r&&xTaFJ!k{pa#7Ppw@_!)b77Fd)KsRk3b9W`KY+ZedL9XNa6Y${ym;;X zwkPEkuZscjECuUKwm$<QDIp<{)nWHak!sC5-RZ9}_sgFUCa|B;T(&dGyAyip5@31j zo<=tKQiWWHh7CXmBNm}D=+Qd03a-&}GomjYI3OJsNrUk1tInZ>j|x%2@C7JJ&o}q5 zDg6XhYS}q-p=5wIC2==Vx_OiO2l8pE=pf*^uQL~F_tN{SxYuCWHT(`nmO^cNYT~@} z%j&ZGje-6PXfJ`~IX`?{R-DoAiEH_NcxWi{VVb(IHT8Ubgg#^Erna^gmu@d;8;?Ot zQ8Dbkh!_WtVH2`>3WY&P1KYq<P#^dhq-II{BoXucw>*_`zbL!`LB=ASkcZcU5NjqV z7KQ<<1IDhKlX1S1tQt27CSN6G3LOt(sJ5XYxhX+Ni?r2BJ_VMJ6819xpHQaEneQPo z!1l><wX03_DT2z^a{pN*OcfYhg986?<hASF=nFqsPbPSV=|OO3e>9nBM-MK2l9`@W z1T0owD8G=4VyoKpvOV+TCunFB$n-%TeC~5e+M%T&N%t924dFz6_>=R~PdcJ6%v+Fu z)|Yr#S$zeE6DaQzT`P=KY<~DQAjXiCcjb>L=_^OFy(Xh|oYKG2&1-psXMcF?*zgwD z6{&8K(5NAiVBpOf^~Kvl_OOOALNz~wgt8>Iiod<xS#{WBAeqZ2CV<DfKY^vpBCoxL zeY~`S07fH|cFEH5N=_cWvA;1(QV$(-5c<27yQvMh*#nOk0iV?QW+!a6r(DqHjgO{b zifCr@E_8B!hOCG*3`*nj^7YKg+{s@xHZK6Pl-ved$P|u6qnS<hFLw-wuRg!NRI?Bp z=I1-APe*|Mz0MYu#zA2X7+3VpO^ml<ttjo?j%pyN4gYB)fc+p(dDnmX8XZD|nxApV zVY$x8WwTPM`jH$&+Yet#acBMhxRGkHbGL8rGtfC3fdpTG6j^3^;$0q#<Kr52vR@ff z5EZ%S>(XS8(*~XJjqy2o=dww-Qyo~+%>>ER7{->r`IK;g6p8YuE_?s1RaAz>z1_X$ zT&JhYJeWB+hKQt4vqp$3ZADruD=TM#!HFvT{<XDSVKD6phH=MmFz^QY_`rscH62^< z`ycaV6IRhYqz;tGaqCQM{IQ>8HwB95D$R{wcgbw2gdI&i4iJf+fV<yrrpLkT^<qpU zCNlh?Gh)p2JXTxn-n@BZy+{7?X$f&UpYwCHzby-o!5`2fpmaB?{zK)PVk0ZLD=}j# z`r_K+!D?yE@EjQQ&#nQRqsF(R*^<8jo8*t%#lJ_sk&q>nzv)x@AiK1_4_N4B++MgY zXS4yJ-*e&OQJEr0bIrriM^>U$WJy^Udm@on-H!q%_%Jg-viI8!-hhJNnl&`UvAz<H zt15c-tL`w^2D8ZoyUXwxUfyKn<6%Xbg~M%b6-F8war)<jkIcep*@xp={S~qURTZ@j zm{m%dKmHAj(z&DFviVM-c^UuhR4al~^yz)7g<Rx5@Za^23PCTlOrPIF{OekFb^-_Y zJ~x^TgahzfWH*gwx7Lx>+q6TE)?7L}_;e%L+w!G^+*f?XRMtW`kIUZzbUgA=9Yx?e zdcPSt75-WFZ8z3a_@3T!W8VU)7y(DGZvmU}gPNc@_Mh?CYr1G4+4x>NrJTB!7jit5 z+&R`JJ`VFPV|>$}z-PBTn$yV#%%ooQ)-JHr+{nFKY=)EF>{CUr_YH1*?xjoAemiSh z7yBDaP6wLi6AY`f+Z6lfA#&c>^&SEb%qS7Ru7<0f5-NAj^`H}|ai8B{vJZR0em5BK z8u7kThQG9))Sh2xQ!F7DJMg(i@-`2Zck^cI@Pgaq_ftIy=-Lic3C55z)ztVFKLpol zv?e=0-r@Zt3HbOA1gF&99Ysf<E5CSAk`PA7M0y%D)wF%+v%J-(Yve^}g!2-CFgWH3 z!=pnT{UGW*NU;6zon>E~;Ne<F_-Bw8&2SNv*?{mSp8oM1zYn=0O~TL&yyYKz|C|~Z zl|1xf2ejV`TuxDTO|f!fj_FtGJIsuJ&rW`6NNwKe*P9abuAeUB9h@JG<19K#^1*p} zR5$BfKHD$#(6V1jh5T*3SQ4=UG*01GF;R?hl(Icb@!XwTe}n}y+o6po9EP=)co!{U zM?h8Yk_nW63#XO%8nB_)_UPKC_!7K{Pr~6Z$T@=EPqS|g5CT?Pl>urbH>>b`cDdr| z*8EWK$3K^5sQ4wol38qpAF@FZ&c!{TP={)<>xgvJ48WiPFi^>03M?8g=mH{w#dm<( zKryquuQ}vctF^_e{cily5&P<Ok)`I-tCWNZ12iK3ypvXLZHcmFOTXsBwq~d+dC143 zF5=zAi;3HJ^^psd+sfaZ2BXb&pF%5H;8bEfiVt^X##bps(m=Y>C2BO=;_k$Vt4!U< zM!gUr4RpP2Z=6MW<-t=9)HQbd_qY70t%VQ<!^w>ed}mQVKy->zAg+SdKw3sd>rFSf zHE*4+XXJ#Xo4q;s{3>#*{7tT*biHZN$X9(>x_LKuRUmhB1`ATH-VA>Gzb>vhxF1g- z!m!(6>xC!SlUibQa7}~^;l>~uAd);T?s(R4hc>dCztGX~(F_!2Z4C|l)SDVX+{S?p zNH!Qu!5s&$1pz&dI~8YJ5CAg%Y!xkzA5GI)Q|Q(9QW8fqiyq<iTv9@QfUHDf(6|(d zgEeO$JcC*GtpOlDKKiqp7|3u}f{?rLM~WvSU{$W(t<2T!BUf$iu8XUcgTg*CEy^#O zkEo&-9v)7r7Y4enC)yH#8R^CjoCevro|S@7_qF=ueTrt5YUvd2`BHi8E6Q16r68qT z6bLS_NLpi}wjwn7#_cE`4v9Y|w^RqI*01YIcTvt3`ycMex#(4NPEf)_<vY=qzw^B~ z!+J&YaS%vxE-`D@r>|jv^1jxKSLoN&<)-G$u?Ik)3pl8M;kN!Bjb;zDUXhkO6^$O* zL@2gSLTXL4pRQR~J_Sdeqc|piI=d;F*M*~s9OP!|x`0T1%23EDN(|9&nMxP+f&b-2 zZ_!}CPm%D|2)FBJ`C3=vc&Q{QU!m208awNC8pNe{vAbPcZ{~-TK8+Cz|4j`M+RupU z?dv1u3`BL`eh(bkjc<{N4gb~=KnP-f3#L-Bw2l#waf|vbAjS}cc(RV|2bAXkviil! zR#+3D#C5}418m5@YI?7YI&~2ef`_JUB|_lXzDtF%(~|5`%!M;&$XpokJ5WdrqX(-< z{D11z*`x;6SRY3!vmlV*#SuBIC+d1Xar?WX+WPNbdF%OHTFsK^5WUwAmE0~Aj#dq6 z+Cj&s+XsdPzM9FkJ#cS;)U>n`p&t=ocGa*3+;ELhAf&!ant#?bxZ%J5%AOZ-?(*VO z*n$!Zzh+MfV%(@$)**MmZen2yzB!nvj_>Cm@73$PkPDP+n`m$YcS&9M54*=ei|Dfq zB&xR%-%6*Vx@XR&4pi})c!&_-(l*!xj2<zBn<7A-N#SzqW~RMs#B31Pi*XBDOrE^g zcZ3`pf@Ti?eSzFW36ZtdP*FUX#9Zh>4d5-vlNj2A^6m$CXcScRwFw<jJk8Xz#6{gs z*S{Jn@}8g1^ESVGvXx=$x;wT1ZiI3zXcQ=z?8}vSL;}_?#}Bk*H%2Rpi-)`I@9gt4 z1SyP8E%KqMurftux-BD<@h9-0<Y}irqyW~dx&s<vN(}~FB(bj^1%!s>33_rDow9qa z5A71+A5T<|?&iXt#m>!~?#3Ut5MD<WDn28Pd|Z(3%=*Tm)lVTC5gj=|?4U;zql;f7 zYR`22v>e!f>~%_^t{=U>-eAF)LxWhZv3b%T3u;62l}q#ZUu;t6EY2tlcz%6*a<a8g zw*f}~d|VD4vLQW`9_;pKv*w+Rm^s-$Vi%WE0vW*<%Dumn(F_UWcTCdX{j&MoY?C}c zqF9g{EkS~TfdQ&{FZpc)>5q*^QEs!YRmY_ms;JFO<>l-9$Gp6}-a_jMnu9nlr`a4O zD_hiFquk9nDLX9lS~oIFLg|OsrO)0?{|Lh1S`P^aNzT7^sj@Eh!k<srAkoOqmI*yH z)vP~Lhmc`@UPnvxY-}&Y7DQ@u2fencoeDs=5=aUb=^Il2pDdi5*#2eK?<lnEu3H_L z)<u_hX&`^xZ;#+ffO(*NGmPUzRw~dZaIKZ{>kKBHy70U3nj8EpAE^Ed5=83|H6P;v zC#tp&uTOkl(Q{0ok|o6})nxy6D*o!m4qv6Y_i@XI;v|P3PEJm|O!PM|L=MOmAiy$T z;L8pcIB9uFv$cv>`M<e{ZVsPNeEs}B%ZJJtuwV&%S9kupg3;b@>3`{B5(l|*>PQO2 zW^rP6w9l`yV`2M@pWw6)FJLamghR$3l0_~AGI1QwcR}6g>2=D35DK92TcQf4c7G9p z9~;^!HMH5Z3fXaS_(s8mCun&ggG>uqAicORnpxC;A`p?4on6U<z<L&gd80$;E^!k0 zRPMiCBrI(K-ZnPRNO(U51T>-JU<e?x*D$okqvA6Mt92F7vb68!>n?j=?>7sNM~L72 z#)$-+_OtJxNGP@EaR)jU*Dp{?#I8FNu@%C1%~ty(RK(S#$O}*p?|8Mh<VPY;!GO}u zZYNQgT{=eSw}ViIdeM3Xb$yr|0>FpIhj)%G_(2GtMDQ|sqsWjIdwP4$IB_7$`cJil z{R;ZqQM&rbl)GP=s;!-p=6^OekTZSmF0))BX4l&qty$7pYr(~X!P(bIFXguHVcYs| zZmJldmVH<-XnI$MpvJSAxw_>;<+cI^jmFcU{Chv!`Lq5uGLm@xzvyA~UU^n_d*q@} zh)3~279J)tT@Ng4ME4A*W0s5(`e?*SC*yV!EW^W9NO((CSUr$97upYB6KTM>_AM)= zf@r8SWb{d3G!t3|SISb)t5$$#D>%01t)dcSk6sHBpd<O5JGXx>jVYqge5nXGSQLy= z(MG_nVGpooC*++^>-5(llL$T8Gw{_YHv4cX0zx!YUf-B(C_!et$8ZkDaul(D6%)XQ z+ddW}=60^S{03UDi$7ao0MXm^$U42M%{)zI9DOvmx68ypE1H=7whc!*`xiSN{Ax#A z{P(gE>vV6H?|^<3_{(V0WYc+RBx<G(*G4k|oARGkw#|6O*18PGi0%<*<!a^@1t2NN zLOZ#gjvTxGwn|O$m(v|`O|w>Fgej@7j_k($PGtiHScGxHR^#*qY7}q>#Y4)HlOK(& zn9tFmOxurUAG{nwn2$~Z;@m18qX+GfPb&JKygeL-??v$Y+)eA5vH#7<CVR-v;(`kW znsph+h`4iE7bx1-szPR2vs3B`*J-RL5L4NEDi&X0^Vu>FfDCLW2~xnemj<Q-H}jyY zi`|q<oOcBIBY<1^9e7&Ex(KVV@wqxYk~(Pl@%CA3V4?(?7O+;%EoL0~Lvv8BGwi2= zUPIsj`hQ3ansLQ+^wE5sZ9H@6ooIFOcqhJokkVfHGv}@$F7cC5U2?T<kZNPFP<1^l zs7=SDMYOOlAZt3yvYY?#3&#q#%)|ewwM^rD>a<$l>`;^!r!x9L?M0*pdZKlB1Ia{= zEy(rAPzPbst$%iib^M;iT%+y7t`6MN>ilZC(r(Ol&;Ng1fW@XHgL=D2on&UFNj0QC zB|#{^+ii9iSNqLzmQZd4++_1R+@M7yOxZJUUdTYYK}0}Hdjwv9X^YJUpVigEPF7CW zw2NOrm2R0oFbC{Vlp-o-``~ch;7S;&3|SMis0sM3{`(zAaTPyVQUR-67>M>c*%(3q zWe8n}km*2R|6o~Xwuy7#>CKSfp*hC)QWoQ+O*1pIb$g0Sgq46KP!uegC-O$TqKb<j z#u|8&b!gc9z78$A;2n@k45l-?h_U->qj-t)6utiVk>$<DDYk~DL8SEDN$jeT8i5K{ z7HA+1IJCVIr=G4%ek%V)1mXhQ?kAkYCVXpJ8<1XUYumh962TH&ax;;(BPIO+h{&F` zE~8h!cuo3)eJS|H8wehlcdV}7k6iJ4>-HlaEhdj_UI$B_VKe&SE98g;s13Z9fW?YQ z0BS#XC_%m-*sd60o_n}9+0zapCAtAVZ@Yak{6X!7lU9rh&SynnwAqdgsypZJ=e(T2 zJMdF-*4-Pb4u#%X^UGw7F@{g${@eLKYe^sKYaD1P=D?;V$ENb3WCx}R1|;e@LttI^ zhZc`R*f}vv2p9Sq(@?8vaD!uD|2VHbZV!F#J%Xp^;y=8>Am(hb1tumNM}-m=Gm1s{ z7MJR@At}=VI9J&W-{vRG2ZzJUKi*w#3OYhafjb8I(~`TrW+>CxBZ1b`Jmza8Gw+^E z6L=$@@b_ye1lPZJa4@3z;O4};WJi8jH~;dl269d!RuT74U~kwQ8GEMH<c}ZBLd7bd zDAfX*YTM~D1J|U@;F2jT0Q5EOr=3itVo2fQg2sg5ZDZ`jK=<q{`hm_SfQ&N)eeQ0O zg`^^ufg{mSJGgDuLzwP(tE(8{uR%Q#OaViE1hU7rWH!q+`d>v9xdN4pl*Q!wo!OcW zjQe%l?eWd!tJf3y^@LJ0uiXvd>}9$`7jLen8dBWF5B++<r{cP4fi%>90a81d^Yp$= zEv|EZXS>8kKVsiJRCtiWLRA;NM5_0?*8~OrOBo^|tiNhbUMgg#7=UPo0~58@fJBK< zE$`Lte(JUkL~eNJ1`J8;8Uedeq~*8)eAwj;;Qe;}O{3r<;#9hakxScOL%W~9e~MH? za#rHHe(o*MjWeB0{wAlbB?ABJQjOQ?aPQ;t>hA?353f0$rOawkP3!wSzvNz2-}=Un z@5X<r>2`C3S*2rob(NeuUieiL5^1r)sn}=`s`SeoctTGn$YC-2WGc>B_RSukt88Kq z6rW%<8dTSoCbVpsC&3Sr3L4Fvo@lCN7oc0rCnuEyLziUlh3oj!8Mhbp(fH9+4^Myz z6Jc`;XB@6O9?OU~iIV_s1RTcTF9)4n6_Z@@NJFH3D14idbGP~talMWJb2RU7;C>om zDoR=Q%?%KO?~eebPB0!8)3)_nPhTQ+|M#Pqz?i$OTcf(Q@%I3zbtfn6-WvOIczaqp zg8VgR;?Hbk!pI(H59-6G)<E4WU*Q;!t|C`zaKZ%V;?L}lAg44G{SV)q*LPf5Lg|Lc zq!T%to`psyO}M8``CPTx3q@^lg0gQQ<hT1*JGi_j+fubYdhQp@Z=!RR@iRcL&8+E) zi54q|8b0cJ>NyPh{`)@Y8@L;B#|;q%rN&dh+$K<>vxU}N6GspK_a+FR!(?3~iDKt> z97$0qP!SbLv<_GJ=_G;EMgJ)dMOPVmJj;ghzkQ^~f1`bF))D}%-n-diB=fZRBf0*& zDiF$Ur7Cv$$Lk$(c>t!wmtX7?8UllL=QK6!n1GtDB7-kAE0HFsfA|Wxn&gvX!Q<=} zwhq5?aXMY|eD{yy|9zgiNgIa?ueh|uAKwc)W{S8TR9Rphq?SV12i}UH;sAfr*zfG^ zc>%rJZ&^k1sIIOt1dZovt;*n}ixzOM))(*HUjbPY+OzW+lL~l_k8Al({Tw}Ip2FyJ zb(aOj8a_fbPc7{G6dl6C5v@4|7vWIOe81;!=^(eC#BXwhXHdx?Ky$LY+jfrQgP4w} zHbcKm`{HjHO?LVw&0v!h{Mi)48sa4YuTSGDTRT(_n*C#AL5D^2s9cd|uFm$c`E${P zdSg_4;(_A<3;IF_f)|~8E&0BOTnmBVno{9yXLm3KKhwJx78VrUIod$o(1WWor<gL` z-VOq+d@!ikaP_y(DBxJBAS+GAu=@KVQ3(IL&ZZJ}*B24+kHUrTBr*7I#C$+W-6tg( zz^G<Xf_g=OKSX#}bjKRB#T1||?gjJPf$|{JMFd$K|FJRLnx7UEl|yc{H%##GPak!~ zvTM+OH_1)?x{DUOzc~p871VPZ&idN8{~6EJY!EX5sjbeS=zxWi=F=_P8RC;(Bx$}e zg(lyfhO-?2HrX?5$QrO@@vxPRR{abqKxeK#1-}2l!Abh*kQMnw(m|4$tcB3J1@Ti2 z65ycz=^yBbP>}=h1#%UryU-|wQA921nX#T*gcAI~joDb{y7CEPcwFxV2;zsHi|s!5 ziQoin28u4#+ftCBL0FtUraxddkYomDtz0ZSPbdphon5`OxZr0<;e}ugkbBcbvp`v> zS^NZp_ppCN=`A4|cj#^o``q8^TD(Uj0Y$&X&O2PN8{&)k6su7>0&cs8=Wc%oPhAIJ zRaRD3Z2f?hd;*2}xCX8wdP)162L2+!433@*8Z%m%F&B-fT>JG(V~(ZXsoTGqq9Gm^ zpM#jcGs<Z1m-NoM5l`N{d`uTr#^ie2Fcm<Tegjt4XJHUkp6cE1v&d4IUX3HclKZ&c z0OAiC65CqfNUjODNgLp5{1a#7eX;23I282mtaUNteqb?I6f-A1A?`HoRfm=pEGZBv zTf53h{0(ZpA0^wcQ0>RF<M1G3N&<*o%TYI{58BO{J*!Qe`RIT4BOxsc5CA109ldVN z&hEgGG01t2m+?p>Ez5E^tThM}xY-(u=peZe9WSBCN}&a`x(PP<l!A7!A1F**t?QLE zgg^CEpm-vzJnn@>bn-<<1mHAn?=j{AMk7ey@Jqngf5)5;BtKO?_ue)Xt;!|wG!DFj zb*Fag(F#JS`Lrmen)wCzr}d4kLFpUzMoD=iEdT{6e<bDb2O&l1{o6%A{VP-N%=nYW z-6sfn=}3LDo|C$V120B0OB%8CYTn-7xFLgl5i=wH3_wlQ`GyM=0Cm69%hE5%&+yU% zv$;d51$pQazY;k;f@#2zl78vl6u#+uEbW4#-D^6W15J<u*b}FdaiZBon4J+Rp-Zth z{X%h8@AHHo?2;ly^t^en^!cBh%U6f@LNXxTVfxA3>xFkeI-^xm)CMgmdWVJ*t!Me( z3F0h2^5Sz|<v`-DRk#yM;C>**{h=X?(V&dF*pUi>Kqjt#*@ohabmID+StQB1vATZ8 zrQiCN`@}>+K338)L5g`^;ih5W#{$PJm@?&I<*_jkVa{dbrsqom=z%XV?10t0Q;V=` z$)|&T-`~Z1v(_-a%~A?A=~8^$7K!j$L<Gw6!lJ|-@{hN5WDSGL%ULw*gEWW7Mj1-= zc`dS1+=%iZ;lDg&-_y4Y4FPb*8=iaQ@*!8)MH9Frvp`;As%LBzVM@NWnXB!?fm9_D zhKY`T<=4N2Qdd7yL*J~9(fho9M}D37hRu&VaNcC+<+LQKS-B=74S^#kM)IvVZF{(h zLW<)@gGL3mh8Lgv&sxZi7cZ$e4IBR6{|kH!w6NZLex;()v^>*hS<{$l4?}9&W6FF# zFlgz?K-32|a1=o5$iQ>5f{(f#e$Hs71z&?QLuW5u+(y7A8xR6(B0cl6)MgZ(>p^Zn zI4K|uW48jr_a?7?H?Yq5<n6dosJSo$|J(4inScc8eZA|beqrX{(&<&<s?7~IOi6zj zi&>0%Hd&uCq)}T=%<^A0o_`DxH}FtGwn4N7;)1Ha8zTFbeE#Ti_#)H7+WZCs^s@Y; z*UNSLwI&7bwVF^<o`Ot|C{lk!q&NlYVm~bwM9)#&f}KJospk;QoBH#1@JJXWEGvMG zd?CJef1=WH>aWqo?)Bg?YApu={b#rcnieoKCfa`TF`{NU)?VPwPx6ci^v^QyGWwa- zhR7F~CuHVc9g3V@gHL&L)Fb}ZchF!7F2@Z(mjq1G*zm_r%W#JV+T!vbN3VGZ&@=Mh zevB-3)Rr_NEV$`)_=o{I1Q2vP*@6%_;i)g|<-363c|USx>wdjoe`p#QF`*)2dp;E_ z&Y$FMnIOSVQY+H6i1g6f7kv%|kEf-T@IJRuhMQ!e!{MV%6qso$Q3U&1lVi+*R|g;J z2V;^tvIdyI#rDPD0;Zx9VZG9Guk3Q!J2fz|A3lNn`>bBpd==PR7ikyaeLDZ|#+04g z9H3Z+;I7ik`B{_K=cG~T&u--6(aF_<t%SuVBmoy1)j#F%hC+-b>#Hyd2O!Ruw!9BO zQ*kV)zd35mC;#G2I}R@njfEa+6xyfGZ55fJq`3%o?PNONll<D6;Aw?d4ZH67h+0*% zXnQ*ML%KJ>cw^I#TtY=fWhb}J-un}7AOW{mJijk4qGHAX{5%RN#>@A;cG>J+oH8Eh zazBGwVCM`B2PDF8?k7xglLnq(bD+}jk{}hkptu({$?N-K3Z;oO^-&=~G4vBZ*N*;G zo(*62Jn2h~Aj|$nRG9AAFNSHt4*$_bax7JM5&t|4tbg67x*v-L|1toBzVs_hsJ5WS zXPfrwj1Mg^iJ7lR$Fh$k06k9c^l~%2I>^`^0|L&6*7`SF<^m5yk=)Pb7D44@qeX)w z>*MlCW)yFqiwdBaqT)YEO~N7tPbO1qsu@JHP_~kYoIQB)D%tD}V6R68;V$f>cK~g* zoq>quEkq6;Vi01z)I!wE>Wnb201Hhy#~&Vn#AIfAr>LLJz>)1>4Pbs>9E?B=T8nL? zwE#JYzGBLgR<SMMVtzI-G_?NxaR>0#|JbtlrjH5`;=kv?4O{Uh*@;-EI^}Z|F2mn? zn4r^yk!ab2k}O#}#l(lMwJ1X-`J#~aIRbN#TEC(9hwp(sh01B?JakBKpO0;>41TA? zah3Z#Zr6MG(#|DIrkQ#5{ZeL5owz%lVH%iPrAVI5X)1+|C(vYDyFwgXzd6Q<so^T7 z$&GD#x}W24fw)WC2z<CEcylDHy>Rex=1>EC^rap-fV&rYQLMjf*(6Witk_mm#0=W# zeU^eiTq$6RG8v78wXTJzVEJ-mWpV$O&!LM@x7Nfr0*u?vYV5gYa1)?gws*B6bn`#p zbV9sIYWLr@KH8>ao(nHB^3<%YS>q)r0hMeuj|WkUA{tUPG_S?-Q^02~14s|7K0UT; z@I$eIfFYxo!+!Res2M9i;%GN#IyP19TX{HJhqm~Q_tE>!iM7^)UtcxzPt&|}S;=o> zPP=Tebc(nGPo*z*Cd1E8meOGO>ScufF)DPHfCHtOQ%LyA4n#jLJ|-nM20n1N;!k(i zJfM(#TvS<%R}9ga4@ImK5#|R5r1gM-JcU+4?F$C7Y+ykPMbZ>^B_LD2T--u&C7tOQ zK`C_y{N(%IUP%3d<BQhmw4rOYE&*Sc`c^Gm8;pmk<`ZQ&kp>LhK`Wi67Z^3n0a-Z> z&NqNS@WEBs6u;L5ct{kl7i6{-A|Z~NbddrZ0Sz3vpZxwHL+;!ze^BQyZ@$eJ5wp(I z2Sy5Qu_U1T<aL4zJrJn#Vm<1&R?{tm`aTocF9#Q`qx9K_A2@^pvADIHN3#71S7bPY z`<h`5#>%(p*9J8vgPh`!4rDc0j!lBCSC8WVzfCd$o0k9$4i5{v3Hf^R-UDW~lPeEd z>8jYdxdJ*HkR<cYNdhFD5IrgwU%xpSX?GmYQ)ni^T}cNl?z_pxcQp%wyoA9a{C;)W z`8fLM5P^vYI<QtvUVeU82IBGct#`hOz~}d-|CG(Q4wtVD(7$V%SG>UwDH5p3u9y?| zo&^S$_q+j6z>CLpYoAAPh4|JQ$C-|Ma&e^mj0P+qozm3*RyiXb-4~&yT}oj``W0`k zp}N1p@dVZEY#U6+=zthyT}52a|E~x*1_h9!!S6DuPM?RoRA+rLQ|O}|2MoMM)rLpj zp#CHI?>KM=WmchO`kSqYTki4;yTV-sPaS-TcSB@?$MpG7M5Sf{@NdrV039-4s-{Wh zim3jfp|UfIYbQs?(q@;1+jwxkQ1gSKpiq{jWy=0<yjPnMZ%;fPp7e7bSi#^dbOlEk zORST*c&*0p1;fUI@L_IQDeRaU{<KZFi0l@hN;FUj{Vi|hFct{z&bW|qC|jbTFag`S zS~4<kmUK6($|JZB6yD@hBqXF9bi-Q!6h6y3XN3QNV~hpIByKcg_?-OUxB$FGpFR-N zCYp=~12MYyTm522&VDsfvysUf4}w3uNlw6H#01wH2O&fGjO?k+>>=j>rp*vcNh$6g zh1V3R`ic+%nG56ZLJ*SLbHhmxoc0D2n;Q&4pj7Aj@6)bXqY^6hZH)h8z^GbVTQAIK z1xn@o0@S{+d;W!?kdHX?X^hsz%70|hVNgqLn{LZbT|h=d*KWrTumgRgO-C?=HdA5q zG$n;_1dO5zSC|xZ!_TauBw&+byl@f-1Sb3)r<957Vp55)f5qHp;&eNr=?C=4@e+R& z6rm`c<2LUp0|68F6u7weOkD-Mx3eox*E#LwWZq=n+Ph)k*hH_JpoaTTg%r7jUXue= zYlEHhs=D180rcPP9TsNc1vlDHAq}i#Xi(CL!AkIt-TM>Zpjd;0>l=hYT&_Wb2zY0x zYGbU~TRMN?WkKfKi%?wJ19~-Pf-pwE{$)joSe8AX^p2>~Ywjqmc$5N&7D+A$E-BWl zG2cS~w<KREj`x&@w%~RE08iHKQ0$?VG_*teih95QdvpEeVTQt>5h1vgOf!4K!)MBo zzt9)+(IKiAmp+gokk6<#BlJs@p1zdA7k&tpbKY1*NTXqj&j5L;%ph_9E6y(!DZTri zqh<%vKRpj`4vOYqj-q+2BfY(gmKZcSN^RG*g1f%FUHuu#v<V!nudb4SP2{O}{mJq5 zLSQrjD2WiY;a!1q-v8FBkbL#q4eaqtL0<~O#w`0!-pP0#S>uieJ@#TY`(T9rSlR>k zu{0BNlzxp@2(iM%p)9k=h6Pova~(8U5|Yo;jxu^MRA;%|Ci<D*${!@}?R{f^m$iJD zoTFAW32^cNcX#)hTB}Du^3BxZa@VFOs)^n$i!Tnf{0fCr*7b;Y>C<ULkwglhNB1d7 z>I`FfUkn;)P4Ja?k>FVf>xpm%<I<cMkzLbvL45VaP&&ObuPR&fLX+9UUoa;n;)LSb z1~UfCR9!#+um$<<Q1AVV>kFPyO7M*k(SAqM`w4wLC8(dRa4zvEy&qZ1=#f{?yGOX! zIvX^N!-X;Tb0qirJIW%;O32`<%Zz2Sxn-krhPhQ$PDj6SeRbA6P~CvBwCdLr))U5z z%A5_OtSrJ%f5yFliwc$Q<(bfK7jN?5MWZp5Le1EQdttqcQz%GvFK$ZxSg^y=yz%0v z-Pg)QX42z*>ak|m!x2EOy7RGLTsp4-x8VZ>H4Sg&(kXoyD&;e`N-K4B^$}MvvOQ=t z@(zs_za%lj`uDU6Bl%Q%08(nIW&=ZaNoqm94owJAX-^pU&R|4Dba=Ov^2F($^7H1I zH!gb6pIU?*(PF6oUumbWaQkr(o~X-ZHOewfuh!`(p4^zIL20VB2z17uW3_%OQLA7( zqM%_>mFfxNp%!i(Uai);J2`J`aZ)thwD%m6pN|0bBgF|VL!cT28{yyB-Nz4L7SRW+ z4EKGOtIeXl?<O}buupyJZLelM42rp_<8#b-WNeH=7y|~^RFP%l4Tg`Ut(036@VBap zo3DoKId=tt^UH{<AAEjXa>osk-2N2BI0)nU|DFM;eT6YLuK`<WK`45xXs{vA5TBWa zW!nOI&I=H6NhLW^oEo1GMx>i=4G3W4fl^y`UvG3<EC~d&*h@ghG%4l`sOuO|_9^|W z#Kgq2aKQDtovbnPC|jSt6@(2ta<q&7u117S*-&6<BcP#@ipD?j^kuD$n!W5)X}DNI zvj83|<EI}dz#wz$uFHaR9}B__nNg_Ts(uDvakLeoWmd(d^eTWFwf3rQ@_ATFla%@C z3=9GcGqCwa4?u%6^n8C-4cKwbIf==nJ_=VM+x`@+_w>4Ozu6)ih`Sj;DzS7sJZLA} ztxn<@(e+C`{oQg7{aO-!;J6;7ikNwh;EQR{N0kpv@x`3sbB(HJj3Lc{5{M>YN`PK# z@?sGTIp<rK?ov}zGhV+FxUXQf>5?Usd`@+`P*zyl*640W^<P#2?MPH&>5zTx$!|;W zyeF$qB?gtKH-)PB{J{xG^JPy=2{su~dr-LB3eo2!IQWwA4RP21!{%Cfvz+GyprnIb zfeW!WnveEPN8^CpQLx3#@n{?e<dWT#b-F^#Q!xrY<Y+zNe=G}S#iWVP>G`vCyy$fA z_Lu6l{ROC*=}E+M**|cH?TlUax>C*?iJ9+`AIj=$3cAD!O;%rHZa3;-lk|;WOl6i@ zCM0q^bo*ipv~A}6mKo)BPnlHrLS>m!UqPCNeoT>o%)ecnXMa0{nRuZDC4jYp1gFCU zfv~VFI)u@2h$(*Usa_wIw&s~7V(rP(W{zFfVW7`*YFXObKnxN86X+t$qr(U>>!O;| z7hv*AFL|iQl*D|rAX1}0`ee+Cka9$Yn~;bonAG?J7?B}+f@@%8Pi<dowvx;(x$zWo zzF(I+mXTHy|8@bt!)VOh<=w)Q#Ur4%bRV<#K1tgR!u_UCCy$x~A0ADcP;5LyM9?Rc z?tqjVy6CGXa`m4_8I4UdEBYkir!=o8Oe!K=ihX5L&0KK5`FE7rKI5V{dx-_X%B#FX z2=ne&f6FnGFpO>e-wRVh6iS;+ka!N-35jqbj^cDc>cL305miyV78=(N`VF9QfOp&3 zcm%KflckL<$hSaPQ=ccUpeg*bhzc1;!Lq{oI}zj`PXhNmvjDq=OlKaA`V+3y{f=(? z)$P!=y?**(Ja}4ml9WdY+CtX}tQ?h$x1-}YSe;jK-di7ntWNCgGUw&VI<jsq?o5F5 zk>2aWNAU7|_Ly_gEs@{N8-9tv(@q44Nzu--N|spbDZ=Cz&syux1${+L4wyr@<n2Fx z{790g_esGle$pQSi1_`E*JZZj&=tYoN3kHVO_GTXO3=!Qp3@US%6D8xp=-dGKu}rE zZM(#yswNVfLjXa-dnISib>Cl<ERGHdzH^vuBjqz+I6P}}*e$CU@c4Q(z*RzvO7aZj z;X2$Ok-_TziCmRt6HsD8zt}pi?GYt?{#;D*{^0`?5E5pP-AX1m=Rfkmt0|-^zZTwS zFw0d^uXZ{7)(yH06wtcxEMtv)00;XgPB^q!&Q%vDPKs5EsFIJ_9E_{DJ14_c>LSH# z@<DI`l%KNJrCs2nWPh~UC1PDV1y|7Gsnaq-``Zob1WObESJ4rlnTtzRhyN;s(m+bk zZXrd1TCh%B+TjM9O3ZTyua9cT&(gO4`L{=`(B=bdU+_|J00%|PW#Xh|ElOl5MbCL% zjiq$;XOE|^l`RL=tEU?QNl?o|^me6SxYg39*B`g@kzOAn0F|=cR9%USK5?DIw$6Xs zj(~3Cm7|Rm^OGmv`kUPWUAM$}skMljg5DSGb4Tky3?4Ks1o(64^KU<jzlkOH&-{mN zL(HRz_pZLMF-=tu3u3`x6>VVGxUMt(%07r2nBUm%UCuUYUwIT#;=T=gT!N39UwVD; z<WSEMu<|&MKZ*l>R|j3z`OT_Qhdx;Yr}#d@aQA;Be@nHu(QI!Sd7ne+nV6Eb&TxT% zG;tU+7hU{gqJ)kP(Q<6_`-es2AmnNK#?s|tE~k|BRK=ch;^_s9#rI8TFvs3P<B5)- z*gD|6a%}@3Hj#B*-nFVaUTk=eXglEGUb}rYmCpkE>?3i*QTJmHFSqk!qn@7wpGmu& z;6jy<t(m<zGQg{hEf&jbXqeI6rb30^9z5j_q(Ei#eNI0ff-oE}oeGJ|&WBRJo$R&x zmdyZkG$f9@PDD~NK&wO?=f`?VX4NX!-0;~YjKacmT-p#MTUemeJZl|xfyXTZ|AzCg zyk$RUB&Dqh{nYSK|MR<|Ew+@v=fe(lA4yM6)?KGpqsKqe7WgbolBDK(jMexU{wc(6 zPc^Cg#E|y9Gi~!!)RizZ{$aD1%{?8<9fbgB$sbS-ZrB9H4}q5L;Buql$s<Jrw9I3p zu{P6W1K`boqxJ@M`%~LN)2_G2W`?WXiR1jcvMw7Qi;H2r=3Kslab<?Q8t14@xVj2& zEOw2_qwo!B4Z9LcHh8z%cfOb5Ty1~leVBE_HPNX#aszojg*`hs`yUtJu=mw03W@)k zu9_MoVajd{GCHUGmzz!#V-MP%5W=`J{B*Z;GY}U~P<$WIcJ_craZPmNyVUqoKZq6{ zF#e2e{8F!y%DYZeA?O97U+)m86Pch7PjWOcI9Te4Uj*8Bel#sf1%j!b4_u6XQSnpy zd&})qsL5<$T|<AZKUI5FiJq)oQWTc%EVW+4>cwqo0uKO@db#AdUip4eMhGd_qhdb@ zcm&=2*d6i)aD`$0YI=0VAGH6jsY5whjd_u{x&3^ufw<7k_wsl6##YD|Kp%|UeFCQN zU3f3r32L&wx%{qfPe3-m8O>7#?hWmw7$dE~Sl0f9x`O!F)PY5F`Ft7FxJ3LzKalS@ z^Z_!X+Sa;27Vrk#K1^@?OL*@6(5hO~Ls?Z8_M$dPz<fjj<WRA^RWv|_ASe4b*4>i& zuSLHBz}t4;ADeiKYHr)I_niC?Kqm_X*E%oNS8j6vkht%2U#cQr<s~+I!-0n2OS+Nb z7tg4C)iI!a3(^Tl(~?`N^$4X)xm416hE?Imh86;%%g>X|*ynkB0)la=!A<_kPB#&{ zSNoZpm@{AaeA7u;o!^R7@=cDGD=!1LB?#(t(B={#LETukOLmdEYrnlczxlQqbbYqF zdAYwr^>Hib+dXMaJW!IHoyZ?yKHvypnzCs{&-cPMarJkN_g;3-jxt`gn)(q;N9BOO zss_+(CFF`lNeJ^NmizaPWti?@j8H2GK%OP6Qtj$B$HL7SLbD?#7rE^g8dSh&iNAH> zSF)jFAHus4qh+khIekK>atipmP&YhP@6mo=R-mTHK*hrue(8Nw9<0hebMTXX^gXXK zpPnrB-s0C&JSIrS-|(0Gvy3@jVn$}k0=l6@uSMj1wx=tWmw{!^bwF~OJJ^`}%ZHVF z6~5Xx^Qo5)6n>c_Y#G)TL8eS;@>oPx3thiIoNb(4;AdZf@!rk=b*%;@!txb0TZ1>Y zma32igEbnWQV8fkCsPZ{za`<0_6KSUaiCHtTV9qOa=n~>w_K`ML;2V7QS@WMVQ~@n zVb}3W?}y$jg}vor_CX*BW#%hLsS$Oty>>}kaKnxV9cwYT_to;_E^-(smgIGfCw#{u zwQ+rmza<39^=|E!b<gpO4uVa@3<n-I<wO`L)|e1Eifs`|LcbVqpxRao!Ucyt6~9u+ z-y`5~;G^@*;0YrjKVJMFO;;Tk<<rC;x*H^<rI7|v@(3lRTN>$3LFxzr1woV$N$Kto zkQPuHlm<bNPDQ%jz2o=#rys7K-JRK)`9|A97B(toZ9?AKt>h=jyfhBef+6bJV2L>D z$x)pls{1}U8C0{>hROA!a&7_lT;`@|NSgb_!?e!PHQ1ItJ5#Kamw>e=bbhp>QjVv7 z3Ai4vgwV8NI!()W*FDTz@QmA^?GM3};n=^?ui1O+Xl;1t$t-Wvc<%3QG2|IoRz^)I zQNe|PY&O=Cglczx%eK|o<<)#lt;%dB(|svmgSP%l^<#AUX;&UsogAluc$hu+5fBq- z2Q%2=LcHO?!_D!_Jjf_#(Sj3YBP^oj_Eg^W?azKd?jp{w(b*MLiM(6q!Kbt9bTeYT zxsW-`vym0KdD1KwWO`Y`fJJj~>>B^E_cv!!NmC4=5d5yM7M1fam9my=!AO)BHc-F6 zqRvsAXu3VnG~=<Om!6n7UcxJ}1N14cX`~!EsqpRAya5Cq7oqP&$tSu2?8M$>s0aVz zZlA$XRffP=(bom>i6nH%xIfjg!a6Q|3FCLQLELOw5+pF%y2P(_j2!los5h(0Iggjj za4*vJ`JBgKL?MH)`XrmbN{|MjQX5=%-E3+r-V+z2%d*MDflzP)gkOmK8<mpp8vbn& zEc*n5F=)DSqmr0JC?W5Ny4jYtJ734<%e1w$aF@i1$NFOeF>1-9k~Xl>QL(6<5xdA& zJsVrCY@aezrPCn~t#_dP!;$Xt4zv%flzmKqiUb<SCSccGuYz#^I@nSXb)}D$&3|Ov zZVg!f7<tRL@$oQlja8_|baB8**wtHPf#+JJKe>yGY<%iGUixZ}2jl}=i9SBgO=P(4 z`H9Q)m)b5F5eYVh*r#R}yYZF#S%Ti9i~YfOOu~jFuC<j_p!X9#-=o1IQ|(R^l-3;u z|NX{Jq<|MWJ3A-ppTk++v|0Sq)MW^9>qrw>3%YWI-k|u4^4mUm|NZCKRYHgek{B6P z%xCkN1|Jh|`Sy>jkU)RoNNRKBxiM}N)fQ9AyyJk%>1Jra0}}B23BlsQWY-X&aABYD zY#HF^7`_{w&z+<JM9fMRFv$yo-h3M=9{E5Z?7jIz1$b&1E{)gYzmN@Se4SCV37vk_ zeR)a!B9I#c?lvG;$^X3+`TTn&^94gdy-d-2m<4Snf8&_4GP7<|a2?IYcn3oU5=9ji z6$^4T4=kUzu2ps3<om$SgcV@t`X?KAPF-f}c}~H9q#q2jE*MgNlLfi^YUSsaK2R~; zK;vszLD=<{aaG^+{h70k$nY_{+$CW-nvI$L+X<lQ5lyXo^QZyt$-a{#?dgz~#P`<q zsc%`%`a55&;w0~hva=Utq-N~CqTs&Tdvy0X36!zm-p2(|rHLp4HTo-NK2a;6LU48B zSK;jpbPJb|HIh90eNIL=C>gp_(H%6VsU9mEc7AQDZ2^lq3z9`+OsA5bOf_t#&Qfak z>g6>;Nyx-;=T##snDjjE3B|zMrI}*{8WtzZ`u2gjDF5~r+V<cmXw0V0owKfOEnS;2 z!&k)4;ubsy%Q485l1(NULAp|d3gm1=mn9x`2}*M(a1zqJl<&l^6&Jwqq8-BCqwnVU zR462_(v@2mogf$ju6d?sz~kxX^RbE=BdkoIK9g8c_r3y!d-~7vh*QkBHtR!xaXVN4 zJY(}w<7)%J*|<U_C!Y7T3dFXeek}*we6Z11Tss5%wELL%t!+^g7oNA8wmerwZLDuB znz@DFN8JY=YW8-llQNpxFLO?KX8F`B0C(Kn0Fi^>zM;CNqq77^7TgGXAst=(U)#PI zkmy2yXE2{=rjdYu$LdFE!$~FvFGq3-+RMC--J4T$+b{%Fr^Od2r4LY+qNe31rc}kP zYL}KQ--UQPdurEVRg&zg{l-Nd-H6mO5P~PXTvvUoD=F0tN+c=cCNKLk*EWDr1X#J} zf50)`O_X$s9(N_*k3JTAWyZd+u+ZP%&fC0QZT5Jp_E-?xpV|PuGX;YM1CHH%4;dK; ziL_$B;{LwvSuBNjtzPg#e%q}7y|ww!4iF3IV|k+jZlaeRl2&Wkcm`f)AEj44Sju>& zP|Ph-A0m)bAAks%seW{zyaaFtiyKN2T1z%Nx@5=-3CR2bjQ~}EIw6~ZldmO%K0rK4 z*ksCPloo=K3J2(U;DeG~7<ELo8kvpKeW&ApoG+c8gGx>JO3DNRkXy}|QgMNJ&Bxyh z)QOZQ?z&?++h$V0D|Iyta3NM=j_P{zWK`dV9m_c&wp%guL1asytnOM~Di25qoFOhN zlY3v!#!VKC|I+0`x7I`g1bDLLn~#l_;}z%|+e-#1K)X!!G;R-SPJgxS^UAq_^i~8C zsw&2mc07G__d@Sis9Dd!erf4llFNOQCk$U_g-&0P!?{A&7uuweXIevqPAcG&=8G-H zZze!SjaW@3aNHFQ;g2{k0C+{|pcl2}!R$lmzgbi;bFurZt^exrkZXlrzGTfq)UeyX z=Q+YgKnH^%0GQ%Euh*DCh%&J$Yp9>4$RkGK%wii#C@<&7hwji?3wr}Kq(3dKPi9k@ z3NygH!yDZ*b$1Odt2FPC+8C4n)V%@HxC{?4=?VmV$~0Y2f0;IaP{ibUQoo&m;23=a zn(P&+3y#M@Lb{eFq^YfAEKN2(i^-I(?*SZ8tKwcSFs{K28VekB%Y%m*Ya+9X*WZNQ z)kLyq^dGZ7z@kzp(1RAYR+$8KyFfzb({}Fn@%8xl_PuNut}L4z1HMYGLV`i?ugN#5 zd)xC{rw2g>)la|GBXrGLfyE;)!lq1yNj{O+2;f^EpMsH6bHKk*g<x7h_Q+z0v_VUr zqU?GKM(x{8K@EDW#5<IA9e3j9+;;)(X8l_}74W&}BkN#K=4xK_Y|@kPN0e|;YPZ(r zKZRWWk=P#jDEH`;TwV1q7I8ZW>eOb*qT<~}K>y~+q}hqL3R}qBV|#zhH&9y20|0YE zgW-f%J5H>f=kB)Th5>hN9HV+C!x13zQ-C0Njw7_u)${FldAPV_H8n{9++7RIe`dBp z)!YwS+pdO<9xExS5kUnxy-6JNW%zn@Sses_T@s|$7YZ(2PJq_cNv!@Xl9QSy;--C@ z6FSM#eeaFrOhq{a2C(cTl19{(`~^MNjy0)wW-H^k2p__0jw?TnlnH^X?bpwp#;{%+ z&J=E9ZRs@MCoBB0YhPo<4Nr=ZH~BOs(+-bykuybQVny5+A$i6zW@V?(Cr_XSR9Nxd zFY`RtKP|_~ris=?&d1gU4flpGnAI^UO-=dtk~vRv5^>sz7T>=A{T99Y^$*U*$lnjB z?N4)vBko`S2+JWs;XNz9PD<o%Nrg7St$8mw^HTFRbl*-f-Gzg3pd7g|bhi5PY;Ijp zm16zYKm7#|QkaC((grX1`hsfvi;2p6hJTfK4%zYWYjWg$q8&I4&|AVng}rSdS1nn` zXQYOMhUlHbfjX6hK|AqdCLjI#;s-#uC}q0=-Q1vecmFEIcfSKm8<Bd~yV<CK!*?|0 znAr?w!i4p!dK~H7Hxo<|>z=zus#!_b_V)rnWrkP$JO;7RYkOmQk2#!&&oqg-@=eQC zLvIPC;CgW1Qxz#SsOr=JcF>~o#5^kbxMkGReYJ0e5$sG>3oTSZ?3VFNv4?DiML2n7 zO;UmokF{#&aJXBmPW)wHdxkFh`Cj<pGi4OuCD$}vf|I4e!7^EDc#wW@Ft@F($IWiR zmV$~nw9I1D;lz<kr~Uwk+LRsjj(L+7C@5R3^d-trFGBT0-aeXV7zFLL4rB7cyb*SE zoWAI+0>_jxjQE=Qb>18L2coI46gXFXQrbhla8x7C#m>XEwE-Y}iBZuLF!OVyMB23e z!Su_u_qQ4Yv#Uf-&5(>~&9b=YZK8^F3PPZZ&l9!w2efJBph`Vm4*yb?7ndDPhf<ky zb65B>7oETMIaN_eplzzE+k!YVDY`(+e+2#t_WL{+NLD)eSM;pb&$@^c!Pxw95E&vK zZ`#VJZ6Wx6Mr2C<M#Z-8Md9Q;=*CB+rKJgx{2F@n)bMk`ug~i*hFtmX9LOvj96Uar z2jIg~)0l4n|8Su`8N8}}M2LJe$<^=ffz9&pkAy0Ad@ffidB@$bk}AJqi{ssSv>)*z zBj2Lg-=Ieb_cfESg{y`}v}jLZn5CKRgXY?0SBd*6;LA#BcT312kG^p)r_aaI<1MMo z3h><`yMD1i*7y8gKE|aJPO))2q)K9nT0q1dTXJk@f+BxVyRQ|(Eoo}ShXLt@j9=sL zfd=*QhdtiQDsg`#dOJRPy4eIsj8w2>L{d;vVsS~NrDH$$ROuSWFZTy|kih?Fd!vto z7<!t!689=Y>1ZH%)L-Fp1z<R5_qu(-Kr|t)Dd<8Bayl$fvminU;4ph=qB7c)x3*aE zsfq8@etHYbx5w<C({#DI-fL6b>{4w0M8uE&XEvj;tIxgqe(l=BXqj2c(Sym10wAh+ zj8)OIj1c%XozCQ_y@yBt|2HLZmwyC9i~8ajb>}T?g(^aG0M<<T4(5*gLYCBGLhPfK zXG2;w4epzubr93*Zpr!zN=|`>{>$mEdXaaSBTLeQAIZ;=`zF4`@XjpwTFOPr?_gSe zboiy<my#C%sdi~gn;?zQ1DP%?0yHE0l0mEJ(0=IO;GpL@2Lb-|Mjs_Zz<!6bDZaLi zjZF^4TEImiSq+#A!2WK^A}++gxs*|+nZ3Cn#V(_1H!#&o`9r(hh1aGUPdeH;#;-j2 zm4m=*W6WCo&W<T<es?O_{;5_@dOE2YIx0y?i#22fWQ4;L(f`VcOMYA)69OF2I05?C zZw*?Wd*3r3jCeJauxxnqL1JZr7(~5S0W<am-6E0F^A%cs-~oGtPl!co`hd>SQbJ~C zaFg~!6OT8k``JRls{VH#I$IAX;xM9qd{tKV3nbv5BILM!9w<6s8y2|IwcdF=qa;wk zM(k*VH~=J#Z-n-GgW6hw9OX%m07-6wUqwZK(1jyaj}+!~3qU;u5YkIbX^KSD{df^J z7tW5c$a0T3!tHIaa&rB3)OLw}>*2&g>yc$ZIS@nyk})-l$6WZ_dB$2|tU3=%eUYCL zAN}6?-96xU_~*3~g;pYF?g0m#kPj+j-hlNR6Nw&c?4@_9sp1fn+~gZR2H~&U3Cf{j z8})ZGqNLyhbjvfMzrU~P$QXaRG%m8+!PsQFYL`}ipjtjghDzpSRw%r#xFe;JkCh)l z41o9<%^}z4g)3;DKL#zPHu@ZrBhCb@Q)BaIZbN8)#|%mR^Ali&mE&l;yeap6LI0bC zFJdJIgU5#J^;2vEm1Sn)vC3e3S;m)ZNCbX7w-A)a;F0RS=d#Tb(x)C%iP%hG__hA- z4-C?P@c56sPD1sUey_b8X749Iv>x^mfV(hwU+$JvTs00vyHo!c;y-{`q(MBYPKIB? zUpodDp1#SK#@!zV7_;jnSdV)BvGd~fcHbW@extw5kvI%%_KoQ${!#$ix5FI1+xS({ zvMOk!J4E8V5AZ0>0^CLUBIF%;OcjIeYYx%S6I%ZDW6_BpD<tykBGtivb14k{{8rMV zxj7p*u0YL4&OfqCzobPQwy<4N4~FFygl;Xcl*+fahaL_|S<N)KO8WpIyBDT0N<fyu z7HwZeS~x8bT^Npy&OG7QF@JCqm+rT^_f+|utx`sd^`xV}9m~M^y^XuNO-Ng%hmBBV z1|<a*IIIR$mM=QE*y+V(0!E6dI*agfl^KUjucE^c5~D(<F};sP=YKd%dN=Pajw4y- zg}XxdR>30l6Is<}4rO@MhLmyc)S<;s04|jO!w$Lu<yX9bQK5%-@R?ZM!0@W!(2@g~ z-k(0=bJDZGwiQKkm6?m1!SK)9=WlgV7@c)!IB|AVJfgk2<hH-q;blEjX92N=d}g$C z&9S2t-@W#3qXwI6A&4&mp(GerL`pRz$Vc&u`lf}Nj1kt6S@NgS3(8Ysv~bQ?-ao(W zjzLC{NN`21tIX+nXklt0%V=Kr45YO}P%Nk&SyBPM$@jloSJ$_R+Kc0Jr$mrXZ4(F| zB>ZG!XV<r7uZXBNUSdC*QZC}p**2YHmLdd^_rYy@j>qW&6u(2ba|4$n>49aT0#o>! zk%=P@p_*Wj7K#6@G{{_55zSl>`G$qDr10T2ah=x+Y>Cop+sB~i$ckUS75Pbr0^kxT zg&gQ}$||@;iTtmDh|S5*Xr@n#p?Eg=4-+iRe$>^VQQ3Y$9?Wr>?0@%&vA-mOksCt| zi#%vvh0FNx<qIvj0Uo!h0t+_BM^21(2#jeW{QexqQ3+&kY??amVwO&8Xb|_MTv}Bl z-Qq|z)0H9GQ^MBgvyJ+Kq;IqYael8#wG->iM|9ktMTH&ce=s!3xZT74g*vNtJ_%Uz z>|_S!IiKIY{?P$SR!>SnPt-5BA1};>@`sZ{%)}!{!L+!lp*Oue0cA977&it7**ajj zd{$!om~d#(D7;Mr%MWy{$hHHfqwiq5^r+g2(_yB02H33eGdeROE;=6*hm)lId!jLU zjf1b^5R+X&z6hI<21;r4_F*+-bWMPNgB%^?EF|Jmqyn4nN=xw$uN}CzZ?F2;Vi&*X z9x=L~9`I`g<6v8Dc!l3PO$)l1z-I(48aqYt)SXC#i%pZS057=OI(@EPj?|vIN!_H* zZjKAMjGUZB92t=S^z^UL%G|anWn$*(oB3#<g8o4|xYf%c>*<eShVCd9VhfW>(9DBC zFHG6oZ6XV2xi?OFyF2PL5OA2C5<sptsXy&gsz=63SwL~@jty$!H1AKYdxI%3-X0*b z4+w&%iPdBnL%WKlFSU-<A&Z8b%Hash66aylpQr7>%7Ee6QuXX;NBr=dDfJ!8S|f7l zSv~H-ZbxX+4$A?23v)WrNTN`z$J7Gw5fQ@qy=haxHT}um3Kwd}D!bpv<IW<Z;3%2m z6H)_tfs8257hwftgf<wwuTNwk*c*E_#BCru+<I{4r6b!27_Gm46-!of(_jG6KzDEZ zH3a!2#|<%lY<k==vuT`Ezp5)uaIL~YKC{>DHjpVD9PMG#L{YO!f%tNoog{e;%0+Gx zM8N7&G*(QRctYR8f=Qtd`GYAaDC!`17>VK0mycqP6AhlwirI$#Ti#C{T(}COv~vH( znml)P`DSnf8o3x`TV(S^wy<zAh~HGRWV8{XqxMwwbOBWsOVY1{&O^jHgKc82|4?8} z8fw3@#g#`#i>987188^|wW#uw<A+vM=l)%<oKGv(yB{U|Ox{sRU!vtZdzKB5TGwjZ z0+y2%F5p6>$vUBa{LNpS%JZ{mujAY&cTN>?UVmV^O!QoT)y2mY`F!MAlzYtqFj(1G zC<GWnZPeHhCrT#OJ~N0w1;n8K`08lD2QIeHG;$MSj*<KPR8Uyev4=nv+unfkHVzcD zUXqlq_u1S{?Je$;wm2zXoTilvpjm`cR^}LG|H0RG{i7fC;a>$A!{Avi<NYYl%lNTY zZ0ZqWczDZz3ZymLdnDI;>nJJ08y}*o{J792b!N9p$XEaUgNS3RZlKCD#V{Nm0&KT? z$XT~$C(tbbzBxd<Da0z_?a=VBE$P>8a5K*KY7^7%W()a5Tk60Je^(hlflo((@llmq z=^zv3feZzv(dTh;U^6cZeBx|@0)ul8=(RL?&MxqAlgK7C!oAc(4cy273IJ})V_;9j z@DFfzB-2w<Q=4{Xc4krr(Z0_t(W%YnV~39kc&B;Q9y^{u<g#C%(gKFS%Dk*^g@r;4 zmHXiZn`=F~IYplyB#e$<Qa1GxITR<=2BJ#Fv-Cjw`Xs%|#4GP%qe&-k(>gO-h;fWk zR<WQvTNtr45YLgaOTjO}_WYs@p+M+fnb$|RfZcfzAPa_wE&y%Ib15JwuN-GP5Ym$d zs)<I(6k~rAXyFIG1D-p-H;47xYKtcw%C<v$`p|PZT4*^5ve0F59WjZ~vvA86%nrUs z)hygicKaI&kRo<<SDD9X6N3EMC9kt7JrO&BS=j(I`=cG%-e~oiZQPfE4%UWk%}tQs za3`?iK7VX<0(7A_r!(N9y;iy&4#2bJ&zD}FM|gor$s)Kj7ag?;07M=(JQ?M4fcmf! zW%>E@`Cf+1<Cl-(CDAw_9s-Ef2el8#EtAw|s4wvGy{~$HnEK@NloUeoc9Tbc)yCkp zbvHJ=E|<5{5Sj1fUm}_e?t_R-5Ra}UmOoVq2?_~4aPT>xN@pr$F1Yt<_3lgGr?-o= zvmo84d^mV8vsOQB!2O#!I9<!!113z9p&u@eZGbSrH=v-%tl-lBSq^iD`3Gocg}`GC z->w>$viOt(8_sIV*;NDr?(|9dT*j|~7%jE816U^ccA__dX_a4}Q)npi1VzVy{^8#{ zzr}!x2G@vDwBQz9*%O~XTz1an659j34;+>JRgWYq4~K)VJQwp*U5xyhQ=Nc5zq-`3 zp}B-|hV&L7w3tY(-C-(oe@E0q-A43RhqZY{%h88F9?SZAD3x!ehA=uBncshoLV~(k z#k%;HW^j9i2jRs558h`;1&X0<SpsK(4$yIVJ@!ww@kw!7%kScq;13qSF~=35MCKR> zx?2&B%bD~-HmajQli0}H<mZYeqZr;-WlT=knft-T>A~^yDno#qxy<)S@}I8B$wgr_ z=RwmZiJJP2JZdDY8NRlt0NIi&_$+}z06C_oRrrL6n{R*v)9j{tx)z&d8mk44fu}<P zCLxVh7gkx?=6)yFkc6|<vNK=}?&ScTrO&G@5^|RagtX^0QCRRt;m%PNW2oYlp>Id@ zV}yJ?A%l;pU*10%6%=kw%BqGizF5P1y&rB?A7^myxL1U%Fe{5u2|TrG(b-V}@fYs+ zn(V;wN2Ft-H8hes0#|-JR|XO@;b25%+VRs?Hlz%H`?G=PgM{DT+;^wKi0MsPTG_j^ zz;WBV@Vq+>wy{T+o<MvYRC{eG?ec7h^^KpzYU;>(b-)y&9NaGuvE}}(k_(VO%Hq6i z$p?MER5w`kHeJ*vH?gn8VV0Kl=vLKHoDZIg@;tXV>RO)PH{O|%9;PbU$6p+D#*4(K z7W7>1UNHJ*)~$k+ZHi9@!z{jX77cKd*)MGKvO$Y4ac9$@_`R|s67kKXBUTxrCits> zVx3HKXgcdSi+~qnp#3I9=J1o!<GtAWcb2N_p(wZij|D&`;Lpgj@!GBHmm9y2YAIJC zj{Ghn_x@g6%lx%{x7)d<-<#34|IqT>tKr$wTd8#*_*B(Q99o2#YyiTR`l#gyO0y4g zmy!7CE%&@$rl|l6zNp#z;vU~_t8qckK7L0PotRgl=V|QYA!?VvB9G))6f?7b$<4b> z+{q{&k&YEDK1=#&t!gMx%9m3oWKKf|((|I_RWdB3N>Vd>2@xVPaO2nDuyEYHyN!~y z{o|g`&YdNo>VlZF$(ebLK4ik|rK9&<4Eb@&W0slMNi2v%gR22l+-;?iOH%;u65S%z zB9Dc>7LGg9V(N7WQBrt_=H+P6<Y7eYm~_mvjQcnNz%akqZY3B8RV1_+@AY*TP?WfB zj7dI1STX}5jk2S28SmoMry+ngz>N?dXub`V4vwH~MCz4#S$Q+s?-1XUEctUU0R~MS zgEZ|)O^r~2>9Q8hyLN5xjK3O&r)3F4_K=T1G9JV$0PqY?IZ*@v^J{%%Oz0sgu>w8s zJ?Hyzn%<{W8BB$!z&9SgN@zjh!z}%;R?Ytj7s0<%*S(A$+DBgrlK9Ma{TuhnZ}-#= z0kj*5o#WB1=rrU~_@y-o?GC?q$9=w1jyj#B=`G42M~p?+LID@S>p9pUM4M4!tv8%< zxSA--w5iGY)CD9kZdJ7L2WR0X|6CiuzLC3*idwpa%p6Vl&Z4F+;wyW4Tmx;N@)z&+ zq`-R3)uJ|Ln&!+uMB76cpdPmzL5P<S;75tic~6?qf!^(5yIpYN5h*|QfzU7#Ou@{@ z9qS+9^x-h}laP(^=OcJW=O}Nl#iGE)M(rCoul`A~@WICEDS2P53p?%AIQFeDAFQ%E zL^JwP`(}gB-`>rVV%2M8hn;z^FYXvcHmbHyk3unMZ2P$}p$|St&7=+w8}rOol3w`D zFFr;)4&Lvuy0&1Mvsi2o5o&AvEzU{MT;b4Mu{maK{#p3uNtw<mWht_}rMc|*K(1+{ zI>7Sgyy`_P6E}B12N}NwLGDi3sAR?X>>xtlbtooW9JGtHrPt4X%^yvdC8FvKY%_3L z+SFC?A_HFhGke<DV<y?CGliejLZ&vPUk|5bdx01;*?l7{_C+9dXe0tCdGp|X?iy4s z`s+F!Yw4CZ0ED{TiE^|b@*Bk~;LyH0W>PMCo=C6d*1qjSi%Z`Hv?1Om(b}D4zna#1 zLNoD~UwymscO=kuX>WbFaU6X>(|Q7k=~h(!FU0|G&1-<N<$4xI16PgEvuR9`#)X0I z4EB&E62kS@92JJjb3HE$wJ(_vEW{rF0aS&JvC3X5T;`_pN>oNDGmgU6cmcqK`gRuD z+J3&t_sc<v<INGssZqX*Da<?(7`J*T)eH(tzin1_GY)cG00Q|l{oV)p_RL%=Xu$&< z#u(7+cXwFF@5>rlFIx<udq@K;&@Z55xWU2M@c47&TiB2jDf=I^uBM9aCy(97b@km< ze3K0TKmG%l^12T>5RirTyCbhYg##yQXjU_;rVv!{Lt9#BnYhThr)Py9=XVe-8-3Sm zNsz<3Q&{X&_6SFVa{zNqa(Fiz1-N!b1AeiyCDDUZw#OfSczXBP&O@-XkKml)lw1)Z z4<LzUPvsHtY@F`+bnj%;2(OHr%JRz`kO-$+M+3GiIs$4H`;?}evyW;U>}*pIHi44r z*c~igO1Hoe3gL+Jz?^ksf==0=^Pc_9IA2E-lkq%j+aRZRVvepf)*D6a)h*bxq4Zcu zm?N47Ny&*mu;RYzEO-Bl;CBuONG=BJ3G(8I<;YwWuJajEBI8UHmohrG`SYHiw*gdd z_~o+2glg9Nae)<4l_k|Iv5_PE4gvMpBL$y8h}ov0RNj`ItXg+d2eLb|(f+qNzJ+xZ z`_2)F7(SlJXxqI7@BmW&NqX_Rc#3CbO|Teb<w^1&0mtz)38f5|$>oqQ6`*+T2U9SZ z+5~(wAS+Y@kb|lD&l@E3^NyD@YHS0STr0c~aDFEl0!}LY;=SJvgEuP{xG@wNgaHaW zM1uxK>h(QX^w)SY^6SUuGNuXaEModS16UfHN4g5V6cgyLF44eE6&Pn&joNWxWH*OC z#IsMCsOE_KN6PaqtKixEEGh&VHN!#fZwUaZK8;IWlC!im%CbaS86^wba#Ez38X+Cb z%*-WTdmzJYE3p-s^lilK_<Z3DAeVR*b#`G8*Jx@rI)z$xPl*YBF0is+I>nY}B#wYr ztDT)4ZdE*OxbG+XQNs<ifYkX(ky(bE(q9$JBG|Qp&0un^jT<~|v;hVdse4ORA_rbr z?l$5NrcI^20PfZl@nX;nO&3Y!TR^qvzjgC+ER#RSeez+GMuXSqRS}W+=BP1$s6(y( z`k#&89@(EZJ9^m3AH%wRi@g`XQiY`U>dJ55s2$3?9~kC{t!%TDmJyxhp%lu_`2hu3 zAFC_Isw$Eqk0!6CEG;;$93Z|~iKA(s18}PGC%0cl?WX<xJd4Of!9l;GM|R&zVh!!u z6)Ujq!mhvbXm4S-4jTs!=#2@2JJGUVlrfbUGKgg>e@`k^0_pn{@kiSc3GGdxwaHW@ z$Y=RV<-SdYBbw2SP#9zOi;UY6<Nsa<>-^K`;s-2F2;2`l)1cu!*R>z$T76ABCs&5S zPlpQw!L7_S=UAL41smFzvCaJ*XQP8$cMkf#+N5BVN(WSG5UdgHXUwec%$xcMnN-cI zs*Q~ez>w{v%4Et?#wf)LPiWT*-gHg{ZG>-GKUx7HJ}^g_@##qMV6JK<aI;7J>vo=J za?}lZHPsx(2{1a=JJ<x!l<-L;1;t&wWo#A{aDi(K&&0_^;JS_MxBR2Vo+z6C$%r_B zK&{SQaJ@_C^K#}HfDq!(`u=GsP`b0agfAc6baVD~IZ+tlG3HlxoXYxviYO(p+DcNn z;l2CT6!6+fwbbj1soq<+Zk++_5y|<~-<(w-e1<u_69{K2Okht6%bVRW1yH7#6q>>i z<OES^B&Av50?d#vcTB;jf-!XfXba<Q*NA-h7f-6uZCtL1+%zJN1JsR_if9@%4S@Q{ z-PI`l;K6k7`j0?WR6hwRt(or-ilawnl;283q8HWCC51o0V+=-4(K#&C0IiI(W4U_@ z!Lht(%Xe>D#KjwbJ~9|RWMur92kF@c)CT|-k<wAcWsC-Dt$^I(pOX`-w>WGN22(ov zn^0i$4Thi%*7`S#cmSXfVziZH()sDx-z7Y6g6*pH9nk$}L=9mShS#2g^6h0TebLae z#@N=MDs7k+q(SWS!uK_QxM0XE(d)|{;G>8)Md7djoXnb(&dTru?&g*HSXtO1_gAq} z*<h$bZtd0=E=QY@SdwN}Isr@hVXz^9GZ_R*ZsR4Qnl56kb|cfL6k!wmObPXBCkSi? ziBH%J0OU^2*IsU#6phNx<BsM%*J}SzcZ2!U2}?jFR4z)V$pttzE)2wlZ3Sp#w7^M< z&k^t1N!hA3WXa!5EFA8=q$2IL8tcf8!(`x}pCtL`3)vOuXG#%edEvbGu6Ni-tLpnu z^xxaQ8+*~>{suCN4vl0A;ki?v{~5r1;snIJ5v~9#CmSw9I?@0QT>S6q2ygZ!n9)cM z@oJpY0|%LB&tj%tA9mXxWR>0Xa1gGdz1hI&98WHbv~{NFZ)2+Thr>{A^IavOC_{6W zO{8b^!g5sNq^BZW&U}2K-fv4}OVsClPLlRAL93Z?8>4Ou(Cl5oa7DjCS+m^vCNUVh z>>g?B&7b+~zK99;2iJer@__4FSm!fH{99Jqiuq9>kbt|U^M?VqQJ)=A2#$*@dviB$ zH2khpm!j$BM+j%S-$d}RND1ef*@}$7=XFZ`UY!ik07<IC`cV!r#PgN*`$R=UDMg?D zMI%3T^G)n)m3#cSh`N9kbWPab!bYFUeNo1#a~Q`(a0z6N;4@@kzmttgQKL>hX^U*s zK`N(3Z6+bBD~xBrH-Z$@E#FL^x2Opg0u3QzSq|``8lb_hk0tuGSrao05I5PjkWgY0 zO*+Kru9ro_x+7k2nw!1oo!cAK`#>m!sPfQp7y*#n1n8r36u9@PJzs}X+o>-O@>ZDL zB-+Y?KmwEI+voePvK&soh$2`Ajz1MvTay_e!Z@Qt8<9f@76J*tY563r-9&=%qCc#S zx4;q~nw4#_o;k)$puIgxMge@-z`ltJI-u#+?6wRq{SKMW=)Z0#;SV3v6aRmR0v4Y@ zY~S6i*#rY;0cD#$3+UxQ;Y<;PbY~(@uD^UYipD7Wc}i88^y~57=Y~A;qp{DH*#Gf- z01tc+g&$pEQdl=7V*`7L*8&xE;%BGM*na}`(o@GrHyAlmOnsqG!P~>cwDaI9w&wSX zC6PIwooWP3WY4G1*!92#?5^D<VT1Zjg3LAoY$j{+F|sRGhh|D_ZrkSjV9pE3S*Z7} zUe*DVF450I!$>`ZD2WguWKQmrANfjFp$(IhQ^bk6X4&Zh)Lv%r*PgS^4I*dR$H5im zg9z^u(B9#ok#!u5kBtU%RX;43#Y8d+TsQ=bQBW8MdZgX;z^tASB7T~YhTJ)%4o*tE zU>#W#WG}<_AXNA(UcB$1p$`#TY-Li3&U<M`BIdXv5WK(RW`h^r^Mvqa^4^kOQHV8% zPA>p5GJNADna%Sq(FoLb1k)`F{+$IGsiF!eK>UATmfZ%+gEsD}2qGRjF7)cL*}-#w zEUnP}WS*}YDwUUUmT8%AlQaM9cezl4y;!}dILs#Z>Foi!F*X2&x8Orr@QG~rY}d_M z(JTXd=<m93-95s0FcBw&?yGZ)N2>I5h4<6$H;+LA1jaRk-fl2OWL2d-TIaSUEo2KT zs%uBHY~?}+tS0TKCp3$l;x~U?82=Ph#=x6fU<kc9eC+<>ymqofA6VlDMiiY8+*`V! z1>JfW^=*t0aznBv)z%6l`g%ekT*+O;BY!}P2&74g$Rv0I?9t_gCP!7Uy@wJ~mw<$o zFfZiy@29bz$Un!6Wq2ZSHugX+F9J+yS7tIJte>o<puFZsM`yeonWMW|chbjdYJ>;) zygfZdUz+6Xxq<WpZ&}?*_1?9q4jUud2tSkuQH_Au+J_tyl4xc>@LDJS?*%!(N}h2$ zD=48VhDKE8e`3NhV(kk^;SW!M$oE0hq2`xkUto3{x#HW-R|2n?av|an1Xx1e<1Ne0 zk0a&`>FktUrJkF6gx@h*=RE5}2|2naz#j>OYr)AOWzw7s(DATfZ@|UFo8A}6L$Bb+ zMrO|6MHU)LI0yJHLx@8|iTgsQRee{t@0E_%YTR(~8Z#N^^Uh+lgydu_CUi$sx&lDf zt8E#x>r}ic&62^Uc0=O=>%UG_e(kca2*G2O&ZtIbzbGbgw5Loaq^9;isz8Yr|12G? zd6Qh#N816_9h8J%yL;gyBony6a1r}tCpWG>S(CN%)`HsWJLic&Vl47?P#WmQW@iZs z=&-pbiy+tiZxYCKSX3AwB&}2R#4#|qv=t7v3O<{e4PgIrYhg@HXG$pxF!X9h<G%lm zp_oL2)h`j6-~3h{Fzf;YM==ao?+*Y0=ufvC5!8GuO=z2)k&Zs&P4EuZt3t8Fv=Qd= z8uYISZa#0oKoJe7Sjs%=YyoL7l)L<srHPk{ui3@`wf&FF$@*RM8I_@}Ds>~9kl3(R z1_DUf{$5*=hJ_oM@68(|06yf?M;*vl$KO%-kZesb4M9-|kcl2!)<Dzs45E8AbgTpl zhnbd18mPXqyF{I0$pPppr!=al<io)+F098sPnTSnCmU5_Az1wWGjrUE#TYEM%s9|D z_#<ZTN|wn>L23`r<SjdN?lW3T8k~^geMb@jK)&78BjD%jq@Mf?i<*NmzLs$VGtOc= zFuY9_3!cJ(vXo0ZM_#_cej8*r)t@9gkEe$+H84@0F)*Nt*3S3-0$?|?XGjAVG_R7P z)}M|*!ZiHEyol|hdna52!9jl;#a?u<YN1*(Cj|vPb<`gQ6P??r@Pr9r#cwr;bmtI) z=zSOqw}wBG!|ZIiuliaJU~Ab#gKLy5FWDW9YT&?eAO)`4sqVC~38-OPIPF~YE--~? zWT!P9s;Y@g!DeQj9I+c<{Di=Ed;*54$v%5OFQcx#$d(4f7MdO$=iuLpC}+zY7G-Rb z*Eo2LILPUYOY3`EpYEnd8S}R~btocVyAGgt!$4jlT$Oj8t##-b)OKhzL04J-%5}DW zhrZtH5STJMGMTdmlcO`wF=rq{sKg`0l#3RU)9{wX1_nCfwHMFu9NjV@xeM>e(%*59 zTV{NNP@Xh>V1Jk3tbFI2`V#VGU*F9Lp!3o<2%`Tv{nN`3Jd@ODB93<1RPL{JWk(&p zn~@-WmPV0&i^lU)R8bT7Jp_4hdoz)r<z5?ixxwbirm=48dXv4x$DIA{AudE}%TLPd zawmdO3aG`Mr}K=Hu{}T9vLDUv?sxj-&`SB;=zTs8MD_h}zwN(T<nQVtP)A!dRYmQ# z2in^N39lYi3=RK#L#mPQJqws_-A=zYzxDO~rKF%hLEg|%47_jhBUrA^Ug9sdfF|NR z(w?!Jge@0vE|ON2l{nLM7#{{c&(ULjglVf8J3K)#Y9$nTz~tR6H1YM9RkQBzOxGwp zx|0k`Kc@r&_0rQ#<H?DMA^}g|%{fC^<PgqaCt^<mWXuCvtVWu5us{E-%eqr6+v-+( zvC^@hz{OQMzz~_<0#APdl$qBH|7wow6W-e1LPk43N@@IOqJ+B3{J~cNjpmAKq);i~ zE9S{>%ndF$MIZzWo2NU+4-ix!z@xaY%W3dU1}eq8`HrS}b*oWd^WLMsk~1~U@Y?*W zYL*`0oc*~RwBuW`)n-cS0iZLp&T~y|3u~eSVYmeTC0mkm5CTQzGW8csxkP8uXda<j zGbH2?zMZ1uX6o2cAn(^eE&}1e9Hor|!K|F&$x2db1Ru9^qO29L@!Bq@{T!KC;gx{} z^XgP|$hZ89n}<RTM~n?@Q5(s@rUp{*e;B6wcVyey&}-`)4QhE~RJ5SxpvEU?aN*Kh z`ncdMgT@2u$#)c9jFNI-qJss%+hg?Y@k-JzBuJW*JU!5ZVUK-b{7Nb7KG1Q={d-KO zNvYVwf;Km{qq1#lNt=?iS^0aQv4?iZps2h%no_#Pefd$rPX8B8_vruP6%Bzfl8lM? z%~Bn>VRi}8x$kiK)q*@8(g?gP#zt4g<}5qULkH}?`-y`_l0a2a)euzD1kxrMptgkU z9DOLlMYwOW;#Y0*FCZMGIJ$A(Q>6vY^IAD!m(`j-;F1S&v;Ae{a{^?F32fO3sEZPO z{z-jKrzfWMPKOAJT&C+M-<-N#U3os=yueVTWi9Z)qj5y<<MBlPK5QnfxQTCx_Q89R zNkPrC3dV0R-E6Mz^YE0e6$_7S?j#MnaT*+c29<SKYM{UYtahGN*%mHvDu>($rg<S3 z7Xb`tztq6tkl{?!YxPud)O!t;vg*;@%HW*gb7BVul>{Od36G{x$B#%w0Dlk^F2VhJ zuNMF|Ir9u5ZyoG;FehdG3f_AwRFAk6=VpUt+!l4r`t%9VS(7chzH|r=o+->xr#`}i zi8@ZG+Lcw6Gp^<BDxK!2A9?yDaVDxOrv1_5uJYzi4((QP<Z)@cJTd`9K)j(Cz9Oqz z^V5g$`)vqcs;DRl2^VEc^0}8nAxo8DZg!@{+%%x_puZg*pk8&cM?cD84WvD&S!f$@ zERSNt$h~Z!ff3VS){fOtU7BxfGpv;Z%NIUOZ3_3)`|eBU>f`=R8Q#`%)2zWmrQFT; z$noTETBQY~_?<M*z~l{RIyKajfS6~rRf`);qHWg*M)Y65em(gF>O!8UZ(CSYVG3lZ z-NeL4v6gj-p#mz7s6~}^{^JkU(mW}j2up#kkpJdR!vZ}(^K2hkeYolP7hVwm5Z0!` zcn0=YYiyd4l>41PJ+AiY2uWZGMgbwbEEZ$CmLpLs9lB3;re$&AIGQE1y^&0dVLlEM zUZ?A{7aQuqXD@k-yb%f!a|r)6r=v>e348`LF(Y!M>Pb{owun6ugOqXHs2e*#^z0{_ z{%YBzD!SdpZ}VV58WgP26-Gfby~-$2uu}1~dwd_Ti_6lxEJ=0L#<JBjrCtE7Jf3ne zk7Yq9;d)<_*0@dw9r7x6na=224i+L0FmpB)O*XK~OAkSQ1piXZ=OYLr(cbHh;l#y< zDW5J(^$PF!kHb=&c<}la`x(476bYtYGHP=37~3>Ir-tu-FBsl&8np5UY^U3NMzw|O zgST7{HE`c3=}8u>GoTx4|92<HcZ@#4#199A5AsN_HZJWsWw9Ek1QBj|8u-HA0_C|V z&`EvjJC)DP3y?N<Hi9sKDJE$i&IdAoRHKKbJATrEQf)9W3_g^sUmblR%j5^fe$o<) zB`>W&cVjiOKH4D}2K>S|A_3G!_v?QnKKT_e7EkNr_yo+l|L|*mKz~JdB`zL(ngvKz zull5&es#X!7UPvX5Q0WKN9uIR6jQ99VQc~NJrIFTLvtFy{qPL+3+T0#gHd@oqU0{9 z#if*B&YRb3@-j35Y!kuDo0F)6LICLJA{LBufO~dAWgX;^^y0xclti&QAZ-x;ivB(r zUAJmI!jpTVlxw8S^7M{(ae|)UdW_Hz2f3^pwe|yQYU+Z%r`vvFe!CZ-&t0WP2zsa^ zT=*zt%nR&w|704#=Vs$F<;MNLAnL=5?BcoEfb_UF!trPcLr}G2m++4lL;wz}XW(`U zM$-61KZVyxAvlh}PJhp=?n_DTLS~WoEDmM3^qRQ${S9qL!4=YW`i(W943sX<{M<Uq zrh1)Mn{=oIdeYe8DtNGhROR;C<SU#KI%>(A9V6bsSSH|+oY485njje*E#l<2R+k}7 z2kU+z2=&_$_l*?C1k8NznOUu~QtL;fy*+my6jx!^zg41vLOU2kI~GfvdbB7_yy9JZ z>%?oa-6!*!3zahHZUT>cb5mGjs-_z|q31G_hR$@wf&5<`E43AsaKKm^A6DY6_091U zw#w~e4O<MLyY`G7;!svsSMc!o+u-z7tG~JYec^Wc_dfDXy~6a)`J4B|$?q>>l@`JU z)KZNAT(0w#27feLhAjvv>j|#Usyv6<j~snyMZRg|)P!!cXaH>uL>$V9u||E}CNAFG z&AVGo=5D-u(+eUmi1~LR5EF{n$V4xc$vB#EpUxK3+5i)}t>)md6+eoiTsDozRkq|x zIJx=xsIYJX`v*WrHnj^L5iWAj>q1n3NxXK`&migUpjJt-Yd1&k&mu3!!|kwYU0tHu ztImqvyAMY8an|JH**U0lg(2(oS3zwI<_>opy!S+EEQ~1LWeZi*dh00;q1-G>F}+Ln zvJuDwayl94Mr{hh<(nU49*pdz3!Y7mevoA6CqcK~v17|aZ-{INmt`t?B{0W{O831- z?<>{K<ScuWK!(C<Q4jGJ=E2r&SAb!#{9sNR=qqP3xsT#VqwIu7Obj^P2d=GR4}*bc z?46mOJkLBT-kUF=%m`ljapg9TM<Qx2gApf$V#f){fOj)YCU=HjAHTP}rI&GRKOB5N zWvuM#2j@^s)`ywwfaiM4&QK+|sNBomc`f?$J=RoBMJKVw(J`(b0jrv6t`V_G1jlws zRn+NEIB%Py`6(avViuD~=)?k-vm{|?%`_sZtfOO3?P*?)?9Vc!VyQ?=>F0~YCQ1e6 z?jn8+6R-p!f~w=i#y5W{;MYnO4!O6TEJgc2Y5VSxJ_ajs>$tNo*AGv(D@L(uqQ9bq zE&!8d#K>Q&<qzWWr7gBA{)PTA`z5N=7Z(2=>r`dKYrkT}0Wk-A*39&_XRQgSfU8j` zi@hfGUN7VzAoF+dXT-MCso8$^{;`=evr+5M&Y5)%t&ZIZn$EQLCRjOb7^ph{*PuoY zayx$eV?z+f=mpbLCj#mhtmBeL*RFd%mvf4TT0*WTW;~U!nZk`(m_pp5;aRX!J^7I0 z!aChztWAsshX)nTRlN@W&ub-}Q`ToaD{JeF@-~Yaax$!B-h@)-a%C}d5ik>%hq&Q2 z5X)k}d&=uyb{yAo{B-!~Tep`YENy#hLYb<9?;1-3O@@OeYQXr>JziBt1Y*p1`||q# zSODBAmD!MdLXD^BwrK63^3%}MTiw|0|AQdJ^gTNpH|`VpAl5-|ATCGz&U#m|>!*q% z>>*>q1}-^(f|NPQ1D;G-iGcDGnOyuZv?@d{C=7d8+OFpAE`Uiu^E7?9iPzL4f2HOl zo-DgFXi-~01`?;0(i0w}Ze{;U)Q{`XLf{|jpE-mGj}#^(lCWIT)ox5xRBvyc?=3WX z+CG0~77KVtPav;3H}UN6Hb!zJiIV7=G(J6X+68?nRccey(mw6IN>#c{QB%6f#OMg1 zv#G)h-<21LjU$#c2D@%M>I%mp(=ay1FTj^6?I}Kxz>r9|y?AQJ{>5dV6R>TSl{qLv zU@Q}%RTfWPR8Z(-eA^n%l$Ms*S^QxPF*S$zuHqTo<6B{-2=E0h!8PwS>rVlv9_o8{ zo}5E4Cw%VFWN%_`BF?%^6vMWSDM=QB6@!#WROl&}*XUc>Ey!uI*2w7HspV40d&GAt zyc0twehZj0VE~fShk{U1<3R4CYB3Sa5Vg^-D{GQC5PumBt(t<<$ZfRE<DJ<_-~0+` zpqx*Z92{g%2=Dpyfst<Xmv9J>h?AI0PhJ467io*p+%8VzcSYJeQRzJM;cgLu9h`r+ ze_(4>S&l>=-1--|K4;yXe9ib=|ElIr#y5mDU`yWFYH(7-;b%t=$ATJN<jQpo1MR(J z6CdgxK)f#l<F$nD%_+7bc@0z3A=Rv*Px#a51vWt5{`m08lqh=612jckbFilG#5N`M z%8YcSt@lK0P-vyTPipneFs6T0M;QC%ic>~jffIL)Yar*6_NP?dY*TG2g<wFJQt`R@ z;0Z;D9!<1aVc*%R{$zmlZ@R;VWAeD=G~k(a<p9L17$iXV7Yl4%&FlHSpoTNhI`doI zqL?H^fhg+HZbq+k>&372UxAq~!Pa=mBr~AC$d!JH0E|&YebjSXjEN|9@dqe0Dj$#) zHOm|61*7kU%acn<9CwoO(QbV`HmrWCgl5Cc&`twc4Xt;Rmxh|)S{`^m`L`S=ZHk^% z-OSSrXrbRTn-^y*P~H;~WihAWW{8EXdhavB_4B^?5AO_}oilKq(_K1UoMBq=3TvQc zVS;>Xe~^cumeOfQtf>KsmVFO<EToG|lvv*jO4E}HfQntfg}@9RtBTU-5o1C%Uv283 zHGzkxCpG%!k9nfa+JABTjuaikd2nsfFU540vM?jLhmiQJ!lxk7((^G#47fSv+m@5> zc*obk5n^w0eg?><xPA_l>FA`i)O2vX&){vLEb2-*(evX%s2px$S(#fm-4wo6C*SWp ztoseC%6q^mK9TG#{bv-kU~Q%ZC260>XHJ$ofNz{lS3i8hbVbol>-&+U{*^+nU~HQA zPcrFuXo%`Ier)0mpPd02<7p`gxiSjcEy^F;vkiQ+mjRyn-dDG`{FVKMap5S@c+b7$ zzmabm#0;cke91XEz6#!XRz9XtC6GKe14}31nMm=*5J~Gz<19=kT=;+!JbVuDXX2&J zb<4nw=K9G)Cd+wKOnB23;Sk-0JEhUR(&>hTX=B&kpXIgUcdL6-eS%vQ98yquS|+Tj zIA<RF-{YIUXnrO8$wiZ*=XT$hmP2~K>8NMJJIAm49JQg`SG{iUe9_fuJgXi_gl@*- zLnv^qlXNZY!Z#EbiA96jy<N8Iti!+FAi{fs@0F859tQCX*emZ*4bCh#O(~a_!-<fB zzeZMLT`{6wJ=Ozk_r-N|b)Ee=L>CiHKbNaIcEvnqa)rs=TSyLCpPEw5dBDndE5$k7 z02H39yE?b+KzEuNRH9CVs8PRD=zr94?BLE!3E6f}pb!BytPaKv^k-=URGAd_HyCiF z(&%+%MW!)Qcg~E)h+4ppZKH#|QbcoY)kr+t`L#!G=5xB1eAI0D{fiD1WX0QRKhT}i z!l2Cnq{_XopSZSAR7X4utlB>IC2nuwH>sgU)#HDE!vjc=H<UY58S?Y`*&k>{y#w;+ z@#U&$Tahb?hTB=X*e`ZCWrbMhU!injaa3D`n;X%kQ)g2d7b;V_{ZP)t8>051pnaLi z6jEv}LzFw>>p-=2^r>~%oa4p%HwA{ke^~P$2LW#7==ZhF@HzcR+Rs8}y=D!{g|0f0 z+J4+D)QG@#!Lmc<jgCPy0yJ*h#FdMcY20hz;+yaaxTi6kuKa43W~uaS`g?Ftu$^9g zEz<t;D#!R38KNlYxvh+qA=8qyuL&!Skx5QcbE4DV57o1DtS%a@OU*VF>V45goPG>V zKFqFp^MFh?e`&3l<eG2d<Dr3}bd_QMHWdE~rpQo>D+iKUr5y1?72H1qLc`?h84`Z} z`YzmMbyN>La*d=v&P`Jr%4G42cba5aOm=zfip$+8Tlo0F2<PNPQ=sJTT4URbh|)b! z9_0f)BZdz`wrXL-OQi!0=d1g3@zHE_rrZR+^V1=BX_35f7v<SYR_o(C1dIM3oBw74 ziAA(;8D<(9S;uPAw(0s}YcoDcE&rI*FHo?ii_`I%+ie?xIB<RtAlx$SHhy#{C5N=O z3GO}Rc~ZbO!kgj~tSNlrR!UVask*u)UfzR7B(azdglTI_>PG>+NObdfGk#bXUH170 z$5#H^*|+y+UThoT_)HmkI%4tAoV1}~;-6H0`t*qzxX>Fg60dvAcCjWKkF9kHlt^Rn z8_-m4GPoNc=M0S;1geG^v$ZFEU7UUByl1(;+xq(Yb{%$3K`#8BS}{Xfl59V$x}%yk zw(vf>#c6!#1s$B%62MSixW*aP<2+u+L8I~cXh%_94HRsuENiI!Qfnf1aR;Xmj~#!b z*jWe|1$;<c3!duz7AiZ%OE`Eps(jedx*cVLzrFhGA7yzkw~4il&CuRxPH$7@)xUyq zP_qj)t9Sx&^U<1sf3FHiI?~nPG2BS{WA{VsZ42|fR1dD-Uz&#r&{50OiU6mbs^zG9 zxc1ddjvBe8TpxsgZ`G3hcAck%#X7GgxZ3-7@4b<-8DCe?{V`*g?!?$mc%`^LEUWji z!k~#BE`984voA*^`R}}ZiWj&uY&BZ-#!5k!T_I_f9ottvfn4}J7#VxllR^4HR_ES^ ztie)O2tDCpARcDc1lk~B^PCVm#I08vRm^YG9%--UhU`3jrC=ISllG{4_HS|)7eu4U zE$3Z*oO40{1H=4Gf*EQ`0dG!l`#HykuW>WPUEVV<`2BFFbA%*H;OcB+tS_{x`p)N( zKJ*~X^L~FoB7e|WQrF8D^e0;S@+^Cwi?fslR{V|2V|4)YVS1_urT48ttc0lr$@2D$ z15pMk9@BgO>hYv`zXgN%MWMbpR9syAY{7T=^-N7&zPf_os%*3ZfAEQTH-@rR+t^Wj zyQBIY*M+1Bo7S%)NZ<JAKd>&_$yjevw9kWUKl~2Pa3QKcyN#aL01Hv~MBE3+<V7V? zY4}iM`s=(>eTaMe^MM6%VYJWR3DBJ0`#1;JtgKuhTC5U#1}}lv##&<;e(w>L`FwS@ z<$8UwCOy2xwNnZ1S;G^qF3mebC?d<23m{1-cM+m%vM<O`4}Mqc$@inw+XrQ+uy&r? z_MEjGs;IuY<n>F7xV$I@w?9Wav)2WsrQ0xnecq-TAUCXQ@=r-A{-0Hb;EwD@kzRdP zLi_KZbqzI%h<jNRKup2DaK-)l5vOZWq8jy2PJiB)7;Ge|1+VT2hKzwNKZy**5>1S5 zMva1Pt16tPau{P4cxV}Scj)$wp9q}pO8%@pPm~l9!?)XL!0S@xCN(~NEqUU-E?tap zt>lfbZvb=ebDcZk)px#+ePhwAl7A?6`%`sDZeU*a;&@O6fw7L)j`p3kqj>doDZmNI z1H;AzH=x82K4s2c0fY^*Wk31tr#_U1pm95EJXD`sOo(*sEm@B5k8Nk0i@x1oFy3`- z|5o7m_j6ULOup@Z>{cK6x&*O*C{ap#lZC)w2-Ugk<9Gd1fwCe-O3%j}t-B$pv&t|b z6dF_a>Dr3{z-HTvlV0iA-PRy8&;4Fr%pH2n9;d7!o?91x<TB46xeqROgsmY&^6LO- zfKKW0<8jjp{nG%c#Q6A+UB4=Kr)vrvoSc5JtEG+9)zvk9`eaaH+(-&MR7U{jXAI(Z zoVd$<dFT>S<43n=hnTHBREcc4tTOpRgi*0#as3)=iXV}IO|~xpr_=(q%5sR_|B(qs zKv_U%EkJM#Nl#C5^YF|cmsr*O)&0uV{Oc+CG#PoI_615s&A2$FPe}7e7$f6?|6WU~ z8I^X@f;4Fwnt}c$o*8$0cFC40&2mL%D@dnn?FwPTnPm%q*riXu@dbT9X^u=ISHQO8 zaO_<*ht}^d4p=7V2Gn@IdC8+<&u6>V8tzTeNw+Eh&%+WlLxns3btq`Y%`It)!q-Lr zZd&T{FPsQ{<pGo}N?1sTnS}$>E>jGwUJbun=<-h<lK0TcS)~dN#DNpT`2oqHk{lZi zTaFnYP4j$@#2_c{&YLLIsELP9YxQznT5S!DMn4!8<tF44cm6vK$PYA22TerHyoA5L z5`D{mIM!N;JB1%>1MSPrA3t;`UdnsL(M#&wr=5_>R6h@pq9cs-_VKA#Q&JiQNCB}s zchG=lo*2#RO)xBj+JS1s;@tIq7tzX6ceL$YaQPit<*qki$DVt1a|-;cY2W{^y{rC; zsteZxC?PEp(o#x;bcb{|NQX!_14<1jAu1v*jdTy)DIndAq(~0k&E50e|KhI8TCisE z!<<=j_Sx^dpZAHuEcz5|xNno)J@3Kj@(1nr^%yjMuD6_#xAxig6{t#mRd3gHfn8m< z>R&>(H(A~sqFwvHfp#&J!ubNovi^`drc}-Ddls)`qbl9hUeLFA)cC`J9QP7QnHf2X z+V9@(H83L^q%vYv$gq+f$oDuhXcw`iJ*0hTfI()9pp7@!{6ocXCI3Bh&Gb|UfT4VI z*Y|bLjC#?9=7QAiAlA5BoVbeEi}5SE?@H+qS?RF9%~jjKKSBbnyI-2!B&b(9pT85e zwY6>AOFlEucd3ISXTeZ*bkAbr(AM`%Wxr%EPjz*5pXLciDcRX=jhRs;^Sur+mZE)5 z)Dvm<mvF!)%e#hy1Zs4Keuo}7@sxCl`woOe`$Era&;GSlHD)}nMVjK8-T#YGzuR-X zGDXG+d8}RT3y?ncf|gmK&_XCNCoY9v#bi6oyBnMT;;_e<K~Z^L*^OqB$M90L@Y02@ z*WHD)=V!ENH`PBZzIzgEwXF+i=~`&QzZL{6j&(VXt?bG9;eejm)1e@f&=Qrx=-8_* zmPh$74pIa75&|~lGCZ}17RNLvLt=cV7h9n2C8rYTknzd?Eb=FyKT3}sDlb#qfU4~> zk0+*7tFR)%L(WudC)j{22_gy1R*z}G0DB|FW*Ek_TF9<%_>_#PGu=m2XoC}W**`rT z&w13x3jccZ&Cj=0D^MjQzE}8QZhM~fElMhtNWq(Sij9obo54UYEu*-Kw}J|hEI)q{ zu%IGrdRjtCDCkOCtG&MPN=SHlh=I&_BA314>A$(g0^==0t%!f{kDd40hp$$$#Tq}x zo_)1PrxhDfOXXxndAE}Z3yqUv6dS3O(;<~cd)dYEgcH}{PoO<sDRQgRoF**7`e!$U z*<jxh#|R*PF*iea-h>x=&``x4adKeQRAxm*#W`5o`{3qZm;>X}y36I-uDE1)8wbyB z5RzjS0Y*yc)3dGev;+s>Scp6QW@?e6d5~(k4)4A6hR~LCA5>d7;6l^5`KfQ=CBMt= zPT=YyJZ_^3s(iC_mIn7cnszCnQd>W5=`s4UAIpH585_s_MxAttE^tCGBUiSJ(G7z+ zX5JV+YS>tVIl!=(BB@G&!ccX1RepXr)6N-Q_jki9V?62M$SV0cu1F72P@o<0{zr73 z7^<0<CcBPlzpkeHgl8<NjzN9(H|=6W(yKGS*+|w3+IU<s?RoHvtll}S5e1wKiR}A% zHMpE_7r~u%2|pprPb%9f3ig%AMylv4B3O{JIQgM(TELavFqrJl`+`Af2Lge(AD#<O zUkLIIVbdaz)$1PLmR^_4XM+%m-t0Zx-x48t;%p2UUP8baYHMZa>K2?@Dg(fIm{*$M z08j#yU8K$FxqBX~T@*Rfo5vi~Jvo%h%}(_ky}DL*d(3Axhs}^GH%O7A{?}!W_>Jvx zSIhEdOVq)g@LtOd<M<v%pvr=vNJr7%^emL%KbL-I=P`%(&kapzJSqBXKgO&3A}r?- zwF!e$Lq}2K)931rA{j!i|B|F9ZW}$0mYu(J3LBS8#)K04Nnf`MAdyL7)xMUIjiKCH zR4H=Q{Dj9_&ln-*Cm30#f66S@tZa_FIKTawrVBioxVR!knZKJaEw;}H?az)`v3p0F zRZRl2f))V~^L1`+t{p~kI`rnnJYGb5`A~@$v@aTJOH@gy;!xKk76l_jMo2^gn1Ro$ zX5YU9SD>k(Y{|?;c=BF(r;G_*)>4YV`%gX0XH}$2O;5(8(`N-oJDeo4WAdk$_gD<H zYS61j(?z5=p)j>Xoc#Pw_|VP!d8>$fO}HM9+ZzM|&m33rtH=dYse|0F_NR(z31lhm z5_^$mcSAn<tXedXKsv&dg>@n6i-CB!=ahv0;a=VTeoA0Z{KFQj*UHF(Ibji7bImm- zJRM2#@LAIEbZ8Twt3HU@Y~%5l@L+lgq4fR9;xL&i%eT5+B@_BHLz-ZNgW_dQX69eG zF-t1;M@gFkP&X;a$;U|847l2O2U#;mH*s^UK74Eu$*z%z#`zMCm}toQHS{EC2uB$! zwPIL$i!<VIS{)-097k7?ti`6y%r9dg0OhS$d<_7ZZaa{kr&%S_&f^D=5EwIomXau6 z%Uzd+&`JbE<6pT*2g}bas)&69k55X!t}LsLgF97zcFvZN|LK*9$~(BC>s6oZTO6og zS~Q$9Z2sA)LRNJo8Yw37S~_sjpI~pIe|lQ!dhQ%S_qZIVh`}i%No|*G%y8ttc1}1{ zsi*UsNo-}<5i1edomzRr>6B4(kmT~$jWIqOX;iKp{Dxxj+qLM$)7tj5A8*Ef_rnA3 zZ_g9l3OqS*P@(RI4u?JTk=c&(b>%SdEkXgWGO5KwX>GIa100L0s*d&0^!ibgedDV+ z%b948Q*n#B-qZcH?RmGQ`Aek9^yZdMB<OE|n-UswUBT*X?1Xpm-2B97oxG1$YoZ%I zeYJi)k@7t&H2a}T5pe-N^7RzWA+DcOvgXmbmE7kl(t#Fc-Cp6DL9}mg{PKMDd3S@7 zh}?CcS@JZPeNy-J1;aT`{_9OmqL>!XDX<8=(E_Wgs<I=oo_#~fS5a0Ld9++dkSXP` zKpSlPfPh5$K~5|N7>sR)5a22mFfm&jFcYH_9Qrgz+49<7-3DkY*^!4@*q0DPa;o)4 zZFK+zFAn6WhY+wl4!2Do&ZCd|gbvv_2W==W1T=SGtQTpNp0dG&oX`0C`|pTDc=`CS zHoP|iUOahB9Vw5D71;weFEi?`OPruF95GbRiJdU)S75Mw*KEoh%oVGZrt#t*q4Yb| z@e?Ixf2D#aB~bilGU_=x``~G8Q7YhuRP0V4+LnkJIuul&O-xVwR!x~+yO>_PwE`1< zBwU?Q{cRyu%dK^3%42~A(xa>`61EmBz=Y@9f4?M(0wF!)PyU^fRm9mFS^CL0ZR=58 zRdmVtPbo&beSsvNz`%Se6^~NU0=+Yl{~jQ2DcaE+BIXgU5*%0Nz@~@(hX7ZTU?;%j z^)yI74Ksj0k*mMgJ20fqRZlm42~J$q#w<9fniPN=>jGq~X#M^DHadP*-RA_d@HbTa zTOp<6kDnTblZ-1r7v<#8mZ}RCV8qi@tdM(QokKJwMJHyD>jac_jUVp4dttZJu!RHb znn^0}`KTk~^bPp}CfhBvP`0PV^ih~;<Ys0(R<ibQ4Goh>q-|T5;7z736Npo}+W;6Z z0B~4>Kb>ukb_@V*d2&*cr;ks=OI46Wm%9x>+)bba+yr{tZ7><%0-z&8-2ciJviYYL zjvhESXNU{w>gp;dDK0Jj<}e5_hu^oRhK8SkfFo7sypiX@O#bnxVeO1fLVP^(pB6xk zicB~~nqerYtCIpVmUtjMf4t&q0NjWMK(d&el~ooYURX24FVx}!q{AkVN67iI<h%qn z7G8psdw{-&9@4RLtTImNj!eDDd7|_(Q#Dc*Z-^zjeOALuLmo}pfyaz8o@mhk3?(|M z?$X$>HI)orP4fnRr)patMGojUzih22JLKA68iZt~Hhe7@@xTz{UfyfmU;Gp0@_t-Z z0QZs0RfZoD6^FR)RXl41>s9a$sA`YJIld3oe;!HbNx{-QFf_d%)W#Q!waDMn`}c6_ zLUp&WKFV>OW})Jsn0HwvA)-OSW0`4B=$G!XT$NTw$LU=8v}Xi!$+?1mS0T3qD=Vw- z59O$Q-?EPynZ?BeAUh+*1;7JhkT;>yKYukeG<*S<b?Z1>?QR_#8KDLD5!BL;%>sL0 zR3%u%O6MdW_d4hy+nUkD!x<@B{pdD;R(934oR%n7+6<c>$~LVbT@b}V)-dP6J5i&1 za4rk2BM|094{DKVP5SQdu(e6gDTG2(+qwMpSRf;A#nkDEuNQ{j-}t%(LhaH9=5jjA zp~(Q6DxL`?pP$EfWBQbJrx`U4L9xmbOrPalgOy`G%~wsOnRER(1&OX^$4F1c`$K(+ zr|USJ5r3Zl*K&o0TN^hrt-NzKn<_LRoxe>0XMuxA$7g?;FA}oL%3Kf9D9-d=#1Z62 zmA&=*Y}i$`Ev98d_9(n7E$6{<kk{LDJHlnR_)^DaCXJ$?+;yW@cQ;LuAZL;UkBn<M zW@l%o88F>M?`EtbLxhaOKdE&ARk|25Rdp8^kuVI^3dvE49^9OG9DQc@C6TKr#8-}g z@4xBJ-%dsxvbOj8-`arkFbtF$QRHdgR{qJy+)9d%l4g(nY4*a}V7~_~pEyz1V&O8p z#Z*LN{~%mG>%a5NvM^%ydp1fN_U+EufPd?SuhLHovIsD?9xVcnVTRGk$&Kat`J3h- zzReY^cS7{{VAUaQ(n*l%buMu7Yd3Cl4DYY&Y%*&s3N+X%jnt9232TH%VCO|zZ9R;v z=;6OGjvv$NJB{^9^f)L%=$K8l*mn1KgWed_S2sryVG;FBO;aWZPp*_RVZpEvj8;4E zM^5m`!`YlMYEbW=rtA*jO#Q7_`>ucr&F$Ro5R-U6)igH_46pJ4G^!6WFY@gt@-^E5 zck{(ZQJE8K><6eVKw0V!1JGQgbA!Ey$1ZIiUZPyTN=E0i666;5geX~RE{(S5snFQl zbe@M-;?R94?4pBa(GuIs9|zT65d;#!OxFa?9Am{rY>DD}4hk=%3!EIQ#;{Gi=s>kR zx%z|7wqwQzwAVs_JZ2^iK7kn6K-&8^)L%XwWX!BYI$fd{11|)(fR4q#UHX)2ntgca z1;Hy7LoHE>|4FmiJ10#~W^Sb(qC8FJoGZMwmz-t}$H@uSYNK|UyInH%U*rJ@sU5CS zxx*^+NkV4|7D|Tc)kp{PuN2-!c~q_pxLN!cCHh*xY;ipU;;dRx0Anr#+;h6~D>dD= z5@_<7_Yv?`aVVJebM7@c*M9v&BRu<Us24}R3P~X9I+kig^fDE-lX*K^8}NkBTFVAl z4RqZ)c9up+WpIuHhMNEJ)zE#;OE;oGR1ka8J(L-OrUyc#IfjRZ7TpiKNNG?A-lA~Q zZ94~?Ri<0(>gb4812sx=jY%{8U3M2o#;_i;Idw133-e~8m3~yEt<8N_S2UC<W>po6 zBDsuq=&NE*@8u*K#6*{=21-m1-~&e@2W3m9uCr4@xAg5{D0mpi)?ex0#DmY)s6y32 zkDo6}Mki)6>V59!jw+d{K133UhR7qu&VIl~Gi7U=eA|78=?1Kjz-?6W*p#EW#?+3v znyPHhjuw4@ZSaoDv&NH8tO_Sfzm5IEz#Ay?1ENAII}rS*jR3slyy@M8qoHN0L?V9U zyMG+&bGLmQBqdc)ckQx#vtqK$YwnHD`W4rEt=vr$6(-R&$geWh9beRoEzXuYjq$Gw z`?q>(+ic11)FRAje~}FOhoH&idX|l0$egkC%TECgrBT(>w6&YrCkoQg#I#doZw<oE zN37a$fcKdkNF-?OyE(rBa`#p)Q>Pbce3=aduDGNgrS4dew;sY(o@zhd{8IT$9{6@; zt8P~Iu{u9W85eL^7~P^Vi-|(dP|**?gXFag_eL|1DC56vIjK}da|ZWI+#S$;WZ=M= zxCQK7D2oBtPCLyO>2d6DX41PI16*wVR7Jn787rB9O#`&i)(=ooE`j6|w<tf~pv=wk zlIuKN&#_QvqlYv|fn>&(@Md$!2D9NbMsMm3^85iUKmHoe<MA4HY!G862=n+>k1Sv* z^$q8{KQ%Cc`VDviup^dQ@At8>u_Zt_nV2WA{S28{kf!h$r5nhuCV^dzr|XH|9CRe? z0xL~o+au{$ulMP92eLd8aC`If^96@;CQj84!Oqf<0xC4QRv&g>e?O^nouw6wI9y_V z(l>jE;88d%GBvP#U1Kap?;ML6d28hGjkDg*BqX}}sXCR;qCvo{gWKZQ1LOB=aqvh= zp`#5(#)QNXK|lz*QIwI=VKfRMSkd<XgAC;)<vf4C_G~LekI*5Xtcs6U1#n6OAFH=5 zqi$b`I-=6iZGT=LPIo~yz|OFpJ1F=KY8>Yb@Q=OM39uTjhkOUat9GUO(ipA#0RO3$ zG49ESn6L5)WW4d+JFR7~MEIy|sl`dHzk}U!vnsNDZ?#zL#vwt?Hv^W%hi#7>*#qGu z>Fq(->i%6V?79|B`V&uKk2g?c+-;(@Ref73UpW*<9OhIf3ZPUQ3oby^m%(J+2<ri= zJ2>QSAQPq|cN^T!iCJQA40==&7@ik90wGH#o=}=n9>>qm@XJa70p5SbCDngxZOvZA zX$$=XGCOa4IyzM)ycb3ILz*xQWuKMK@Nz@DJ`<}NOPkQBuYgPZ88iIiP+Fh657b4l zIv1r$e<gZdpA2l06Qb)}opK~G88jy$BBy~n<^y0ii-f;6JlF#ahG`g~i_rU{e?cy| zuWN{0i8E@@B*!AtKg%B&as1e;yaM-&FcA1*(&yZl3bed*kU1UBZmV9XXaD<1-zOu1 zy3cPbUH`0ZVdJ=+3&*jw;R7oUSowBmZK=z{6;_E7{`~H1l>jf6xRPy!F17e4=q<cE zu-__2)%b5U&NuS+|M-HaGjCX6LFy5m*Hu0h)tbyY7@r&~D-Rdlm5<f^dau%8LtOd$ z$mki-TGGm^DjwWo8geyN2oY*SYF71a-I$r0Z)Z#8t-rE38Ee(lC%G(JdwXdvGMP#C zYrf1g8$NSYdYTYh?pT$YJO97A+1|?U(#CqjvY`_@&b@O&{MK-7{&ATvzy1bN2_74E zbrI#AMl^>$O->zR87TO>#G_ZHU48Ugh7}Qh?ETcJHMlaZtGUJT5H@$Kssyg+Cr)z{ zAQ7vT4~KVy-oNZT*S|rQ8=99E(wt)X3db1cqIsc{a&<*n>nyli6eAkXRcTTI%^RHF ze_)BIEi$nRd1C>8Rk*ezRo)H#)uPzFZ#CZ`X}NE~4|l0(9xH3u^@6&rmWbcUo|$`I zN7nuj8@o;PI|QBr!yfUfKo}Y=%AvM$ocimo_jay)&3@)jRppLu|Cu+ewsUx2{F@ZR ztbB@!s^F-X@AHN8#!&fcgW;6Z*PVA98PP81>@7yo-8m{Vrt|4W)y>0Yd0O&gw~a+3 z9*!^<nhm0}!}a(3U+bVC&;%PTNb-cH9@aZNEaAN$dy9|y;=AdMjOgdc_fy@pNFb9D z>ruqz!437k`n({&SYfUrjq|GqiHahdp$p*}XT90Z?>kjVL~YqMqE8qm_I-4oU(PO0 z;BPYwKT3(wuZ;LsInDA`$k`Mgb{inkWXkEh<?Xo7csWWu{cln&vic)}r!c?hqDEn} z>=7g?zCBAD&oEWyd104L88JIGWSsZVTyeEf1Y_!}w$lKKegm`3essf!Umrf80#A|x zaLVuxxVzlg7xy`_1z~gk%`B{}@;Z8Yco(N-eWcINOPiY~hY>-c7%xQP?~ce|w<mhj zUl>vg@$j!Me}-{9rIY(g76e4M#(sxgND&1L1TCB@`!f50etR6S$)j6=ra2mT^8_>k z?7|`4xY^{5<g@bMA(bW*SOsB&{lpl~!ZYrv9!m*W2yb5$?%9gfh4u5}St_2jZ3Qo; zih8v9MQ{7jUMNOjwu7%XR66xkp<u6GB0+rf%{AHc<Iw`*=etg0c+p*Ff68eS)u=bW z4_?EfiX%jLmpAdoW-OBU&!<bFIn`@Rrr*!rh{MKcBOUnJ66=;+tSBVb){-r2Ti^S@ zXYC1iUw>Dm+mj~X{a%~Fi8t?~QIs2B8J*UeZ+-?^R)Gyb5hh~gB0`oO8JlE)zUaeE z7kuyUZmp2p^Xcu9I2W$wiAdtNIF*Q25@XV+e9YYDrg!pv!NYjrDP3kFDef%KXUyK^ z_44^*;Xp>~mT|Y~9v4NvY4Y6gz563ZjW0@#pB>AEgQlfqTVj#KL>GmrGTzzZqMNG2 zMSs>Zq-(oD0ySZl>&JUNMyu|ZrzkQ@_`JI50fgqHc-Z|+%xL8t1Y+!E0eU=~5@Z93 zfH1j*WMFFn&NZ2{Q#<U24w{CB_PqT3x&9X`Vg3MJl&1oEo5E)8bCY1qA^pNj!zPa$ zA>dci`X%bS^0FZwaeGyQvd`2Kdep!Bl<O#x)Z{u3Y47J1i}a_R=fk9+b?pGTzU!dZ zx;skq-NULr6k9uQId6{5&CT5bJYCZ=5K^)gw=@Thd6c?1(V<xRqRH#I`m4^0wAfS= z#$6Rw1~Y+qsrWaE)a)<ATX5w1Ez3*L%RT#{BK!z-X)lcmbN7`S)TpSaAh1-Qv9sd> z;w6}e+n&?gm#pqJ!US-#2D`=5YO*Gzs}^JruWxN8nh?`)`B$&dfIV$!Lxb>6Y7Ja= z-IOg$-2f$H3Uz$U)hTl5C5qwO^19ZsMD(RO%*Ve``}WvK*L=M7%X$LX7wqGsMUn~f z%1qwvp7OkA%6An@n=$S6Dd??`7ArlKI2758Cw*-hlr;5W2rJQR*ECzvZnUMulr4%G zGcw@(Lm04NJib6W`+T)g>qKq=nxs}k!S7xOm^Xoe-qR?B?7H%DH%lw4RqIN*bcJRQ z^T7u)M*B0>f|_bxFCER?*hHf4Dvn(NbcEIxltKCLX7^^t)!GQ2KB?_wi#SBWN_y(m zKYNH$A{35wD)Q#u!;t4ap+D}Ng98IHhKA%|p9m%(6ZU+eGA;v1&0yCzF`?St-gdpY za09@PMSrzXvi2tMrVS8o=VEqMv7>~zlC@bdYvAG+T4dyMutcH?8Xo;_>i``QA5h4j z0*;q604(r_llb~Y$C-W9naT`IP4@uEpo(7tT`wMeKDJM(<$<N*_fYez&Leu1Z2wWj zA-3-8qCH9-o*}V+eOTh6`iZBb(#O$3VA(X**bJvppar!ldfNe6vpqy1Ri8_Orp+4C zf*tbZr+HQ4R?H8+z^Unom`6-oYT|4v488mWgDAly9YK%pyc43lU{RPuY6Ipm0h@?~ z^-y$EXk}D#^7Rr}^Cp6}BN<d6!LJ$+xg$X6goVhzp9>aWIenV%Gi^(Z)+r1>>fS=e z>>V5`YaC}^W)~Mb4gfBUr_}4$vuj51+4xa=^hg@v`#90^`*^g$#I(XVi*(`3gNdoo ziZm~E4hvf+-&axU_C`_cAH|(YJrt{|{Zn^pyoKQ?29*xPPupj?2(e?+oTrS&p1GA! zC5Vn3(DCk^dYFOc(jTc*{e$F`U;=%w6p%1xI#bd%)cX{&y?AjDmynPrPZ!l>&Sfw^ zGUDpSMMf$1lF^{)0uhG2L!>WRD~^MpQRJUa45zSsiKtBRhwlut4fOR%gHW%E%F3w3 z#MvM5@p=-#ApZ)$i%1*k|9($SPS7FpC=)1x&PyL4<m40-AG;%ITpYpNMbvA@0Em-A zKq?Bsqp*%BfabZXs;Xv#N5{~}h(gSBQ=_V&K(QoU!})iE`Jq7SOwdD!6^Ez3Q96Lq zi~+P1%y+@L22%3Gz=m=ylQr68%PV~FYw_*j0C!Y_as}d!u|vb(QolHL=V_g=kMN!S zO|RDv;7r*0r-Kx^bvD{)O-!U<xpn1+|2~Q)-YO)N9gBoZt)R;s>gKFCo!;&`MpQJM zB&4>j$J;OUI8+#S>_uC1GxTx@PO9yZGIPA6HAD~0?(XX;;wg#X?$FSil8v5Ievf^X zSyy+_1DexT0l$j_@BIcu>8g!`#s&?sAPYOYDlYoRF2H)cYzI5V-pytod)i6<W2ZfO zlMW%}m)kBLyHPT~YNp%}VU1^zA``?=>#q8#bm8%#Cp)?@qp@KNjA}zikvy^opDDb4 z{PPg(j;XNP;?x)LIbocIj`L*Ody|!ETiK9~Q7hmarReC{8O_S>4cpnER`X{MR>MRa zy20tc@AI=}bR4pScJL|j@3Ros1l&j+?L^lHxg)HIu`w-8Q&Wz@q9R#0xAOdw5@JAA zi~^!lI!e4R3Ji2A<4+(25pqV9pn62|<Gey^0|c<R?$uF%=mJDIH99(Te0-b_0z|c& z`tIw`smv#dKfYLa-|X{3fEHBlXF#z0W=4u3eHw8JmYoi>^;};Zt1sYA;N<AM<s~0< zw72goEh_2<9DxDQL2dzwAAeF((ggeMw_Wz;3`6M^h~GQy8$3kIr(s`@Q=NJc@=bk? zFEVyL^o-9eRX3g|*Hh<IAU0gn3B4d1H~bZXPg_`<AirdQaVsL-Q25Ln?S+E^Y-<Yt zD0E|OEiMgqcgafQyHoCi?mr~TbuylQS0xWdzbim#1fK&}$G`I#JgkULJFTr2@a$=J zv`l0e<w1PxBF0l^`^}-oiC`>$tDcM!duG}ikvZbj(mMUfxlj&Mq>T-z@oM}40^{<P zoUhOlcunyEQIT35s87E^e|iI8yZvS`Fxmn0C6r_V7jbW3d!NPXGSA0w_Ov90-vX9v zu=`Wbfl269T549hG!?Hnnno#ajbgZyl0`p$rnj!d>4bK~eCdDBG<d3ETpqc)j9Vdv zY)h%H?2+<T3u8?4CxO^Mxp}7wDkq-;+^uh$AqlJUEA&H>WUuh0+Vl5YD+38BsH<A2 z2Y=hzra#{azB^cc2uQxOfWAVoZg?1JbPkR=qX4<RqZ08tDX8<3|EWcGBCQ*rqBG%{ zuYeB2iI5s0!?X?~6}Dec`ay{E30MAuy(e)Qe+DA9a~IZ+S0b{a4(14-Wa!8icqXbY z<~r``9La4&4y$+?mwT;IsnE+PB;#Ud@Pj(O=LfZEzR-E~7ZZn)(+4W~3b<Qp1Ny=* zpp*Xs(Ezz9T9A{(2d{U&a-c{~O-zts;8Vv=PEI0GWlu9U;3c66c9ORsOL}%@#umV< znzu);lE=R=pw>93$TO5?!hSL54?%VGk5c;}7kdm4lPB{4527qL_wAcmXxyupRpgl} zPteFPCB2eX%+-QiBM6!dUSHU^-+=T+bs&B?BLP8^%Of$B4phO~Qwx19$7l-WFyV9G zI%noHc49rMG96~i;bSS<$-AwO!G~a=Naazp_6>;64nP{M))_E&NlHi{WoKiX0NHV) zz<32@D+qPRYRRDlN76_v8tCdymVr_g3J@O}cxh>=i2FYUE=s)g89;dds8z^KhQkl; z1lz>S3|YWmK<R=D<xOcklQCDtU8asMLg8|i_KY_t04Gg=H2&<k({PpqG>%Si1JgjI zy7V$`<&h1ELZ>ykib9DHAL$7WceFjxByUbtYkZ=hOCHdPpE9aN_W*5@<pVv$9zq#M zO=;l6;PI!`FNv|TqCyQ~+jKVPkPHxpLGXaHdKLe#!t1~5{r{i;W8XkS;ype$JLbSi S=2HU*_)(NqlPQ%p|L{LiHQUVq From d253938d85a100156b55a0b132d00ca3d3025b71 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:42:28 +0200 Subject: [PATCH 060/149] final preparation for PR --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 65ade427..7e0acfc1 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,6 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -// import logoCTA from '../../../resources/images/logo_cta.png'; const { Header } = Layout; @@ -47,7 +46,7 @@ const HeaderNavbar = (props) => { <Link to='/'> <img style={{ margin: '0 1rem 0 -1rem', height: '3rem' }} - src={'/logo/logo_cta.png'} + src='/logo/logo_cta.png' alt='ark_automate Icon' /> </Link> @@ -59,7 +58,7 @@ const HeaderNavbar = (props) => { <> {!onOverview && ( <Menu.Item key={bpmnModelerPageKey}> - Modeler! + Modeler <Link to={bpmnModelerLink} /> </Menu.Item> )} From 84390e6d2a8d7aa3df13b022a6d53457539960d5 Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 19:44:51 +0200 Subject: [PATCH 061/149] adjust documentation --- wiki/Documentation-Folder-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index a7f95e46..3786422a 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -29,7 +29,7 @@ Let's focus on the **src/** folder. On the highest level the relevant file is th Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. - **layout/**: Contains our corporate design and customized theme. -- **resources/**: Contains images, fonts and other static files. +- **resources/**: Contains static files like our `empty bpmn`. - **utils/**: Contains the following subfolders: - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - **sessionStorage/**: Contains all the helper files we need to interact with the session storage From 1ad3bac93f47c479ee148383904d552ae6cd09ee Mon Sep 17 00:00:00 2001 From: Lukas Hueller <lukas.hueller@student.hpi.uni-potsdam.de> Date: Tue, 18 May 2021 20:59:57 +0200 Subject: [PATCH 062/149] apply sandros changes to DEV --- .../RobotCodeEditorSyntaxPopup.jsx | 8 +- .../RobotInteractionCockpit.jsx | 2 +- .../RobotInteractionInputSection.jsx | 2 +- .../RobotInteractionParameterInput.jsx | 10 +- .../robotExecution.test.js | 2 +- .../robotInteractionCockpitFunctionality.js | 2 +- .../ModelerSidebar/ModelerSidebar.jsx | 16 +- .../PropertiesPanel/PropertiesPanel.jsx | 16 +- .../PPOutputValueSection.jsx | 12 +- .../PPParameterSection/PPParameterSection.jsx | 8 +- .../subComponents/PPParameterInput.jsx | 37 +- .../modelerSidebarFunctionality.js | 26 +- .../modelerSidebarFunctionality.test.js | 60 +- ...modelerSidebarFunctionalityTestingUtils.js | 2 +- .../pages/RobotOverview/RobotOverview.jsx | 14 +- .../bpmnToSsotParsing/bpmnToSsotParsing.js | 2 +- .../robotCodeToSsotParsing.js | 24 +- .../localSsotController/parameters.js | 14 +- ...ntroller.js => ssotParameterController.js} | 0 server/api/models/rpaTaskModel.js | 6 +- server/api/models/singleSourceOfTruthModel.js | 2 +- .../robots/rpaParameters/rpaParameters.js | 8 +- .../rpaParameters/rpaParameters.test.js | 8 +- server/package-lock.json | 10089 +++++++++++++++- .../openApiDocumentation/openApiComponents.js | 2 +- .../generateCodeForRpaTasks.js | 8 +- .../ssotToRobotParsing/retrieveParameters.js | 4 +- server/utils/testing/databaseLoader.js | 12 +- wiki/Documentation-single-source-of-truth.md | 2 +- 29 files changed, 10227 insertions(+), 171 deletions(-) rename server/api/controllers/{ssotVariableController.js => ssotParameterController.js} (100%) diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx index fc92e2fc..19638042 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditorSyntaxPopup/RobotCodeEditorSyntaxPopup.jsx @@ -18,7 +18,7 @@ const RobotFileSyntaxModal = (props) => { }, { key: '2', - name: 'Empty Variable Field', + name: 'Empty Parameter Field', syntax: '%%parameterName%%', description: 'Highlights a field which has not been configured yet in the ssot', @@ -32,10 +32,10 @@ const RobotFileSyntaxModal = (props) => { }, { key: '4', - name: 'Variable', - syntax: '$(variableName)', + name: 'Parameter', + syntax: '$(parameterName)', description: - 'Used to pass in a variable, which could be the output of a previous activity', + 'Used to pass in a parameter, which could be the output of a previous activity', }, ]; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index dac82c1a..4887bf60 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -44,7 +44,7 @@ const RobotInteractionCockpit = (match) => { ); /** - * @description Ensures that we only update the paramterList when the paramters we fetch form the DB have changed + * @description Ensures that we only update the parameterList when the parameters we fetch form the DB have changed */ useEffect(() => { getActivityAndParameterInformation(robotId, setParameterList, isMounted); diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx index 499e07ef..3056cec1 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx @@ -24,7 +24,7 @@ const RobotInteractionInputSection = ({ {activityInformation.activityParameter.map((params) => ( ( <> - {variableName} + {parameterName} updateParameterValue(parameterId, event.target.value) @@ -38,7 +38,7 @@ const RobotInteractionInputParameter = ({ ); RobotInteractionInputParameter.propTypes = { - variableName: PropTypes.string.isRequired, + parameterName: PropTypes.string.isRequired, dataType: PropTypes.string.isRequired, infoText: PropTypes.string.isRequired, updateParameterValue: PropTypes.func.isRequired, diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js index ac47f58a..676a1b00 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js @@ -30,7 +30,7 @@ describe('Checking robot parameters for Executability', () => { expect(response).toBe(false); }); - it('correctly recognizes a robot as executable if required paramter is empty but is specified later by user input', () => { + it('correctly recognizes a robot as executable if required parameter is empty but is specified later by user input', () => { const listOfParameters = [ paramObject1, paramObjectWithLaterSpecifiedUserInput, diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index de0a6bd0..e18fe21f 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -12,7 +12,7 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { parameter.value === '' ) { console.error( - 'Required parameter not specified in paramter', + 'Required parameter not specified in parameter', parameter ); executability = false; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx index e0c329c2..ce1661e4 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx @@ -10,7 +10,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputVarNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, downloadRobotFile, @@ -27,8 +27,8 @@ const { Sider } = Layout; * @component */ const ModelerSidebar = ({ modeler, robotId }) => { - const [variableList, setvariableList] = useState([]); - const [outputVariableName, setOutputVariableName] = useState(); + const [parameterList, setParameterList] = useState([]); + const [outputValueName, setOutputValueName] = useState(); const [elementState, setElementState] = useState({ selectedElements: [], @@ -39,8 +39,8 @@ const ModelerSidebar = ({ modeler, robotId }) => { useState(['']); const [disableTaskSelection, setDisableTaskSelection] = useState(true); const stateSetters = { - setvariableList, - setOutputVariableName, + setParameterList, + setOutputValueName, setElementState, setSelectedApplication, setTasksForSelectedApplication, @@ -102,16 +102,16 @@ const ModelerSidebar = ({ modeler, robotId }) => { disableTaskSelection={disableTaskSelection} element={elementState.currentElement} robotId={robotId} - variableList={variableList} + parameterList={parameterList} parameterSelectionUpdated={(newValue) => { inputParameterChangeHandler( elementState.currentElement.id, newValue ); }} - outputVariableName={outputVariableName} + outputValueName={outputValueName} outputNameUpdated={(newValue) => { - outputVarNameChangeHandler( + outputValueNameChangeHandler( elementState.currentElement.id, newValue ); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index 5e835f4a..7e109e9f 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -24,9 +24,9 @@ const PropertiesPanel = ({ taskSelectionUpdated, disableTaskSelection, robotId, - variableList, + parameterList, parameterSelectionUpdated, - outputVariableName, + outputValueName, outputNameUpdated, }) => (
@@ -45,17 +45,17 @@ const PropertiesPanel = ({ disableTaskSelection={disableTaskSelection} selectedActivity={selectedActivity} /> - {variableList.length > 0 && ( + {parameterList.length > 0 && ( )} - {outputVariableName && ( + {outputValueName && ( )} @@ -73,9 +73,9 @@ PropertiesPanel.propTypes = { taskSelectionUpdated: PropTypes.func.isRequired, selectedActivity: PropTypes.string.isRequired, disableTaskSelection: PropTypes.bool.isRequired, - variableList: PropTypes.arrayOf(PropTypes.shape).isRequired, + parameterList: PropTypes.arrayOf(PropTypes.shape).isRequired, parameterSelectionUpdated: PropTypes.func.isRequired, - outputVariableName: PropTypes.string.isRequired, + outputValueName: PropTypes.string.isRequired, outputNameUpdated: PropTypes.func.isRequired, robotId: PropTypes.string.isRequired, }; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx index dd04fb6b..a9ec6d6b 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection.jsx @@ -11,8 +11,8 @@ const { Text } = Typography; * @category Frontend * @component */ -const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { - const handleOutputVariableChange = (event) => { +const PPOutputValueSection = ({ outputValueText, onNameChange }) => { + const handleOutputValueChange = (event) => { const outputValueName = event.target.value.replace(/\$/g, ''); onNameChange(outputValueName); }; @@ -33,22 +33,22 @@ const PPOutputValueSection = ({ outputVariableText, onNameChange }) => { + } - onPressEnter={handleOutputVariableChange} + onPressEnter={handleOutputValueChange} /> ); }; PPOutputValueSection.propTypes = { - outputVariableText: PropTypes.string.isRequired, + outputValueText: PropTypes.string.isRequired, onNameChange: PropTypes.func.isRequired, }; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx index 32f2495f..51e40422 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/PPParameterSection.jsx @@ -12,7 +12,7 @@ const { Text } = Typography; */ const PPParameterSection = ({ selectedActivity, - variableList, + parameterList, onValueChange, robotId, }) => ( @@ -20,11 +20,11 @@ const PPParameterSection = ({ Parameter: - {variableList.map((singleInput) => ( + {parameterList.map((singleInput) => ( <> { + const changeUserInputRequirement = (currentParameterName) => { setParameterValue(''); setPropertyForParameter( selectedActivity, @@ -53,19 +53,24 @@ const PPParameterInput = ({ 'requireUserInput', !userInputRequired ); - setPropertyForParameter(selectedActivity, parameterName, 'value', ''); + setPropertyForParameter( + selectedActivity, + currentParameterName, + 'value', + '' + ); setUserInputRequired(!userInputRequired); }; /** * @description changes the parameter value * @param {Object} event from the input field - * @param {String} parameterName Name of the currently handled parameter + * @param {String} currentParameterName Name of the currently handled parameter */ - const changeParameterValue = (event, parameterName) => { + const changeParameterValue = (event, currentParameterName) => { setPropertyForParameter( selectedActivity, - parameterName, + currentParameterName, 'value', event.target.value ); @@ -84,7 +89,9 @@ const PPParameterInput = ({ return ( <> - {variableName} + + {parameterName} + {isRequired && (  * @@ -96,13 +103,13 @@ const PPParameterInput = ({ placeholder='Please type in value' defaultValue={value} value={parameterValue} - onChange={(event) => changeParameterValue(event, variableName)} + onChange={(event) => changeParameterValue(event, parameterName)} suffix={ } - addonAfter={returnLockIcon(variableName)} + addonAfter={returnLockIcon(parameterName)} disabled={userInputRequired} /> )} @@ -112,7 +119,7 @@ const PPParameterInput = ({ style={{ width: '100%' }} type='primary' className={styles.parameterButton} - onClick={() => changeUserInputRequirement(variableName)} + onClick={() => changeUserInputRequirement(parameterName)} > Parameter will be set at execution @@ -122,7 +129,7 @@ const PPParameterInput = ({ }; PPParameterInput.propTypes = { - variableName: PropTypes.string.isRequired, + parameterName: PropTypes.string.isRequired, isRequired: PropTypes.bool.isRequired, dataType: PropTypes.string.isRequired, value: PropTypes.string.isRequired, diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 0a5e8384..997f1af1 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -121,15 +121,15 @@ const checkForApplicationTask = (activityId, setterObject) => { * @param {Object} setterObject object containing the functions for setting the state in the React component */ const updateParamSection = (activityId, robotId, setterObject) => { - setterObject.setOutputVariableName(undefined); + setterObject.setOutputValueName(undefined); const paramObj = getParameterObject(robotId, activityId); if (paramObj) { const paramsInOrder = paramObj.rpaParameters.sort( (a, b) => a.index - b.index ); - setterObject.setvariableList(paramsInOrder); - if (paramObj.outputVariable) - setterObject.setOutputVariableName(paramObj.outputVariable); + setterObject.setParameterList(paramsInOrder); + if (paramObj.outputValue) + setterObject.setOutputValueName(paramObj.outputValue); } }; @@ -150,8 +150,8 @@ const modelerSelectionChangeHandler = ( selectedElements: event.newSelection, currentElement: event.newSelection[0], }); - setterObject.setOutputVariableName(undefined); - setterObject.setvariableList([]); + setterObject.setOutputValueName(undefined); + setterObject.setParameterList([]); // INFO: the updated elementState isn't automatically used in useEffect() therefore we need the following workaround elementState.selectedElements = event.newSelection; @@ -215,8 +215,8 @@ const applicationChangedHandler = ( setRpaApplication(robotId, elementState.currentElement.id, value); getTasksForApplication(value, setterObject); - setterObject.setOutputVariableName(undefined); - setterObject.setvariableList([]); + setterObject.setOutputValueName(undefined); + setterObject.setParameterList([]); }; /** @@ -250,12 +250,12 @@ const inputParameterChangeHandler = (activityId, value) => { }; /** - * @description Gets called when the name of the output variable has been changed and updates - * the output variables name in the ssot + * @description Gets called when the name of the output value has been changed and updates + * the output value name in the ssot * @param {String} activityId id of the activity selected - * @param {Object} newValue new value of the output variables name + * @param {Object} newValue new value of the output value name */ -const outputVarNameChangeHandler = (activityId, newValue) => { +const outputValueNameChangeHandler = (activityId, newValue) => { setOutputValueName(activityId, newValue); }; @@ -264,7 +264,7 @@ export { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputVarNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, downloadRobotFile, diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index b0c0251a..bd4d3d18 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -17,7 +17,7 @@ import { applicationChangedHandler, taskChangedHandler, inputParameterChangeHandler, - outputVarNameChangeHandler, + outputValueNameChangeHandler, modelerSelectionChangeHandler, modelerElementChangeHandler, downloadRobotFile, @@ -113,13 +113,13 @@ describe('Sidebar Functionality: Small Utilities', () => { expect(setElementStateCallCounter).toEqual(1); }); - it('handles output variable name change', async () => { + it('handle output value name change', async () => { setOutputValueName.mockImplementation((activityId, newValue) => { expect(activityId).toEqual(constants.MOCK_ACTIVITY_ID); expect(newValue).toEqual(constants.MOCK_NEW_VALUE); }); - outputVarNameChangeHandler( + outputValueNameChangeHandler( constants.MOCK_ACTIVITY_ID, constants.MOCK_NEW_VALUE ); @@ -179,11 +179,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: MOCK_CURRENT_ELEMENT, }); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, }; @@ -203,11 +203,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { currentElement: constants.MOCK_CURRENT_ELEMENT, }); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setDisableTaskSelection: (disabled) => { expect(disabled).toBeTruthy(); @@ -246,11 +246,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -299,11 +299,11 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_APPLICATION); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -349,18 +349,18 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { describe('Sidebar Functionality: Task Change', () => { it('handles task change WITH parameter update', async () => { - let setOutputVariableNameCallCounter = 0; - let setvariableListCallCounter = 0; + let setOutputValueNameCallCounter = 0; + let setParameterListCallCounter = 0; const MOCK_SETTER_OBJECT = { - setOutputVariableName: (newName) => { - expect(newName === undefined || newName === 'OutputVariableName').toBe( + setOutputValueName: (newName) => { + expect(newName === undefined || newName === 'setOutputValueName').toBe( true ); - setOutputVariableNameCallCounter += 1; + setOutputValueNameCallCounter += 1; }, - setvariableList: (parametersInOrder) => { + setParameterList: (parametersInOrder) => { expect(parametersInOrder).toEqual(constants.MOCK_INPUTS_RIGHT_ORDER); - setvariableListCallCounter += 1; + setParameterListCallCounter += 1; }, }; @@ -391,8 +391,8 @@ describe('Sidebar Functionality: Task Change', () => { expect(setRpaTask).toHaveBeenCalledTimes(1); expect(getParameterObject).toHaveBeenCalledTimes(1); - expect(setOutputVariableNameCallCounter).toEqual(2); - expect(setvariableListCallCounter).toEqual(1); + expect(setOutputValueNameCallCounter).toEqual(2); + expect(setParameterListCallCounter).toEqual(1); }); it('handles task change WITHOUT parameter update', async () => { @@ -430,11 +430,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['TestTask']); @@ -487,11 +487,11 @@ describe('Sidebar Functionality: Application Change', () => { setSelectedApplication: (value) => { expect(value).toEqual(constants.MOCK_VALUE); }, - setOutputVariableName: (newName) => { + setOutputValueName: (newName) => { expect(newName).toBeUndefined(); }, - setvariableList: (newVariableList) => { - expect(newVariableList).toEqual([]); + setParameterList: (newParameterList) => { + expect(newParameterList).toEqual([]); }, setTasksForSelectedApplication: (availableTasks) => { expect(availableTasks).toEqual(['lookupRecipe']); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index 0cdf6502..3259ddd3 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -24,7 +24,7 @@ const MOCK_PARAMETER_OBJECT = { value: 'true', }, ], - outputVariable: 'OutputVariableName', + outputValue: 'OutputValueName', }; const MOCK_INPUTS_RIGHT_ORDER = [ { diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 84e1b06e..2364a345 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -104,20 +104,20 @@ const RobotOverview = () => { * @param {String} currentSearchValue Currently stored value of the search bar, by which the boxes to be displayed are selected */ const createRobotBoxes = (currentSearchValue) => { - const filteredBotList = Object.values(robotList) - .filter((val) => val.robotName !== undefined) - .filter((val) => - val.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) + const filteredRobotList = Object.values(robotList) + .filter((robot) => robot.robotName !== undefined) + .filter((robot) => + robot.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) ); return ( <> - {filteredBotList.map((val) => ( + {filteredRobotList.map((robot) => ( retrieveBotList(userId)} /> ))} diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index cd0a7e2f..746d640d 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -110,7 +110,7 @@ const enrichInstructionElements = (elementsArray, bpmnActivities) => { ); if (instructionElement) { instructionElement.type = 'INSTRUCTION'; - instructionElement.outputVariable = ''; + instructionElement.outputValue = ''; } if (activity.$['arkRPA:application']) { diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index c08f6570..e792e11d 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -103,9 +103,9 @@ const getApplicationArray = (robotCodeSettingsSection) => { }; /** - * @description retrieves the outputVariable name from the current code line + * @description retrieves the outputValue name from the current code line * @param {String} currentLine current line of RPAf code - * @returns outputVariable as string + * @returns outputValue as string */ const getOutputName = (currentLine) => { const indexOfEqualsSign = currentLine.indexOf('='); @@ -149,12 +149,9 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { * @description deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format * @param {String} currentLine current line of RPAf code * @param {String} splitPlaceholder placeholder to split the string - * @returns the current line without the outputVariableName prefix as string + * @returns the current line without the outputValueName prefix as string */ -const currentLineWithoutOutputVariableName = ( - completeLine, - splitPlaceholder -) => { +const currentLineWithoutOutputValueName = (completeLine, splitPlaceholder) => { const indexOfEqualsSign = completeLine.indexOf('='); let currentLine = completeLine.slice(indexOfEqualsSign + 1); if (currentLine.startsWith(splitPlaceholder)) { @@ -228,7 +225,7 @@ const getInstructionBlocksFromTaskSection = ( ) => { let errorWasThrown; const instructionBlocks = []; - const regexForOutputVariable = /\${(.)+} =/; + const regexForOutputValue = /\${(.)+} =/; const splitPlaceholder = '§&§'; robotCodeTaskSection.slice(1).forEach((line) => { @@ -236,8 +233,7 @@ const getInstructionBlocksFromTaskSection = ( let currentLine = line; const currentLineIncludesSplitPlaceholder = currentLine.includes(splitPlaceholder); - const currentLineDefinesOutputValue = - regexForOutputVariable.test(currentLine); + const currentLineDefinesOutputValue = regexForOutputValue.test(currentLine); const currentLineStartsWithFourspace = currentLine.startsWith(FOURSPACE); if (!currentLineStartsWithFourspace) { @@ -261,7 +257,7 @@ const getInstructionBlocksFromTaskSection = ( instructionBlocks[instructionBlocks.length - 1].outputName = outputValueName; - currentLine = currentLineWithoutOutputVariableName( + currentLine = currentLineWithoutOutputValueName( currentLine, splitPlaceholder ); @@ -378,7 +374,7 @@ const buildSingleParameterObject = ( )[0]; const parameterArray = combinationObject.inputVars.map( - (singleInputVariable, index) => { + (singleParameter, index) => { const currentParameterIsEmpty = singleParamArray[index].startsWith('%%') && singleParamArray[index].endsWith('%%'); @@ -388,7 +384,7 @@ const buildSingleParameterObject = ( const currentParameterTakesOutputValue = singleParamArray[index].startsWith('${') && singleParamArray[index].endsWith('}'); - const singleParameterObject = { ...singleInputVariable }; + const singleParameterObject = { ...singleParameter }; singleParameterObject.requireUserInput = currentParameterRequiresUserInput; @@ -412,7 +408,7 @@ const buildSingleParameterObject = ( activityId, rpaParameters: parameterArray, robotId, - outputVariable: singleElementFromTasksSection.outputName, + outputValue: singleElementFromTasksSection.outputName, }; }; diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index 920d53f6..77112356 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -42,7 +42,7 @@ const createParameterObject = ( newParameterObject = { activityId, robotId, - outputVariable: `${activityId}_output`, + outputValue: `${activityId}_output`, rpaParameters, }; } else { @@ -119,8 +119,8 @@ const checkIfParameterObjectCorrect = ( }; /** - * @description Gets the parameter object for the activity from the session storage and checks if the paramter object is correctly filled. - * If no paramter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. + * @description Gets the parameter object for the activity from the session storage and checks if the parameter object is correctly filled. + * If no parameter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. * If no parameter object and no attributes object exists for the activity it will return undefined. * @param {String} robotId Id of the robot/ssot for which to retrieve the parameter object * @param {String} activityId Id of the activity for which to retrieve the parameter object for @@ -263,9 +263,9 @@ const parameterPropertyStatus = ( }; /** - * @description Sets the new value as the name of the output variable in the session storage - * @param {String} activityId Id of the activity for which to change the value of the output variable for - * @param {String} value The new value for the name of the output variable + * @description Sets the new value as the name of the output value in the session storage + * @param {String} activityId Id of the activity for which to change the value of the output value for + * @param {String} value The new value for the name of the output value */ const setOutputValueName = (activityId, value) => { const localParameterStorage = getParameterStorage(); @@ -277,7 +277,7 @@ const setOutputValueName = (activityId, value) => { ); const editedParameterObject = matchingParameterObject; - editedParameterObject.outputVariable = value; + editedParameterObject.outputValue = value; newLocalParameterStorage.push(editedParameterObject); sessionStorage.setItem( diff --git a/server/api/controllers/ssotVariableController.js b/server/api/controllers/ssotParameterController.js similarity index 100% rename from server/api/controllers/ssotVariableController.js rename to server/api/controllers/ssotParameterController.js diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index 54665386..e6d72abf 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; -const rpaVariableSchema = new Schema({ +const rpaParameterSchema = new Schema({ name: String, type: String, required: Boolean, @@ -15,8 +15,8 @@ const rpaTaskSchema = new Schema({ Task: { type: String, required: [true, 'Task required'] }, Code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, - inputVars: [rpaVariableSchema], - Output: rpaVariableSchema, + inputVars: [rpaParameterSchema], + Output: rpaParameterSchema, }); mongoose.model('rpa-task', rpaTaskSchema); diff --git a/server/api/models/singleSourceOfTruthModel.js b/server/api/models/singleSourceOfTruthModel.js index 9ba3c7b1..1c171c80 100644 --- a/server/api/models/singleSourceOfTruthModel.js +++ b/server/api/models/singleSourceOfTruthModel.js @@ -15,7 +15,7 @@ const singleParameterSchema = new Schema({ const parameterObjectSchema = new Schema({ robotId: mongoose.Types.ObjectId, activityId: String, - outputVariable: String, + outputValue: String, rpaParameters: [singleParameterSchema], }); diff --git a/server/api/routes/robots/rpaParameters/rpaParameters.js b/server/api/routes/robots/rpaParameters/rpaParameters.js index 0fdf96e1..e0e30815 100644 --- a/server/api/routes/robots/rpaParameters/rpaParameters.js +++ b/server/api/routes/robots/rpaParameters/rpaParameters.js @@ -1,10 +1,10 @@ const express = require('express'); -const variableController = require('../../../controllers/ssotVariableController'); +const parameterController = require('../../../controllers/ssotParameterController'); const router = express.Router(); -router.put('/', variableController.updateMany); -router.delete('/:robotId', variableController.deleteForActivities); -router.get('/:robotId', variableController.retrieveParametersForRobot); +router.put('/', parameterController.updateMany); +router.delete('/:robotId', parameterController.deleteForActivities); +router.get('/:robotId', parameterController.retrieveParametersForRobot); module.exports = router; diff --git a/server/api/routes/robots/rpaParameters/rpaParameters.test.js b/server/api/routes/robots/rpaParameters/rpaParameters.test.js index 14261d6c..8655a8f3 100644 --- a/server/api/routes/robots/rpaParameters/rpaParameters.test.js +++ b/server/api/routes/robots/rpaParameters/rpaParameters.test.js @@ -4,7 +4,7 @@ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); const dbHandler = require('../../../../utils/testing/testDatabaseHandler'); const dbLoader = require('../../../../utils/testing/databaseLoader'); -const ssotVariableController = require('../../../controllers/ssotVariableController'); +const ssotParameterController = require('../../../controllers/ssotParameterController'); // eslint-disable-next-line no-unused-vars const rpaTaskModel = require('../../../models/rpaTaskModel'); @@ -46,7 +46,7 @@ describe('PUT /robots/parameters', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.updateMany(request, response); + await ssotParameterController.updateMany(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.modifiedCount).toBe(1); @@ -75,7 +75,7 @@ describe('GET /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.retrieveParametersForRobot(request, response); + await ssotParameterController.retrieveParametersForRobot(request, response); expect(response.statusCode).toBe(200); const data = await response._getData(); expect(data.length).toBe(3); @@ -109,7 +109,7 @@ describe('DELETE /robots/parameters/{robotId}', () => { }); const response = httpMocks.createResponse(); - await ssotVariableController.deleteForActivities(request, response); + await ssotParameterController.deleteForActivities(request, response); const foundParameters = await mongoose.model('parameter').find().exec(); expect(foundParameters.length).toBe(1); diff --git a/server/package-lock.json b/server/package-lock.json index 9dff46a1..8608198a 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,8 +1,10061 @@ { "name": "ark-automate", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "ark-automate", + "version": "1.0.0", + "dependencies": { + "chai": "^4.3.4", + "express": "^4.16.4", + "mongodb": "^3.6.5", + "mongoose": "^5.12.1", + "nodemon": "^2.0.7", + "socket.io": "^4.0.0", + "swagger-jsdoc": "5.0.1", + "swagger-ui-express": "^4.1.6" + }, + "devDependencies": { + "eslint": "^7.17.0", + "eslint-config-airbnb": "^18.2.1", + "eslint-config-prettier": "^7.1.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-only-warn": "^1.0.2", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "jest": "^26.6.3", + "mongodb-memory-server": "^6.9.6", + "node-mocks-http": "^1.10.1", + "supertest": "^6.1.1" + }, + "engines": { + "node": "12.13.x" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", + "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz", + "integrity": "sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^4.2.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz", + "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", + "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", + "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", + "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", + "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", + "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.13.tgz", + "integrity": "sha512-8fSpqYRETHATtNitsCXq8QQbKJP31/KnDl2Wz2Vtui9nKzjss2ysuZtyVsWjBtvkeEFo346gkwjYPab1hvrXkQ==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/traverse": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", + "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", + "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.13", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.13.tgz", + "integrity": "sha512-CC6amBNND16pTk4K3ZqKIaba6VGKAQs3gMjEY17FVd56oI/ZWt9OhS6riYiWv9s8ENbYUi7p8lgqb0QHQvUKQQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" + }, + "node_modules/@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/mongodb": { + "version": "3.6.10", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.10.tgz", + "integrity": "sha512-BkwAHFiZSSWdTIqbUVGmgvIsiXXjqAketeK7Izy7oSs6G3N8Bn993tK9eq6QEovQDx6OQ2FGP2KWDDxBzdlJ6Q==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "14.14.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", + "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@types/tmp": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.0.tgz", + "integrity": "sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.2.tgz", + "integrity": "sha512-V+Nq70NxKhYt89ArVcaNL9FDryB3vQOd+BFXZIfO3RP6rwtj+2yqqqdHEkacutglPaZLkJeuXKCjCJDMGPtPqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001202", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz", + "integrity": "sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-pure": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.3.tgz", + "integrity": "sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA==", + "dev": true, + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.689", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.689.tgz", + "integrity": "sha512-WCn+ZaU3V8WttlLNSOGOAlR2XpxibGre7slwGrYBB6oTjYPgP29LNDGG6wLvLTMseLdE+G1vno7PfY7JyDV48g==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz", + "integrity": "sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dependencies": { + "base64-arraybuffer": "0.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", + "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.1.tgz", + "integrity": "sha512-117l1H6U4X3Krn+MrzYrL57d5H7siRHWraBs7s+LjRuFK7Fe7hJqnJ0skWlinqsycVLU5YAo6L8CsEYQ0V5prg==", + "dev": true + }, + "node_modules/eslint-plugin-only-warn": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.0.2.tgz", + "integrity": "sha512-DCG8vuUynDnyfkm0POT50JoE9VJfbtKf+COHn3q79+ExW4dg9ZWM/hsMWX1mjZqxMjQledL/9TmGipon/vwWmw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz", + "integrity": "sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", + "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==", + "dev": true + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-resolve/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-resolve/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz", + "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.0.5", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.4.4", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", + "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "dev": true, + "dependencies": { + "signal-exit": "^3.0.2" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", + "dev": true, + "bin": { + "md5-file": "cli.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.5.tgz", + "integrity": "sha512-mQlYKw1iGbvJJejcPuyTaytq0xxlYbIoVDm2FODR+OHxyEiMR021vc32bTvamgBjCswsD54XIRwhg3yBaWqJjg==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + } + }, + "node_modules/mongodb-memory-server": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-6.9.6.tgz", + "integrity": "sha512-BjGPPh5f61lMueG7px9DneBIrRR/GoWUHDvLWVAXhQhKVcwMMXxgeEba6zdDolZHfYAu6aYGPzhOuYKIKPgpBQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "mongodb-memory-server-core": "6.9.6" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-6.9.6.tgz", + "integrity": "sha512-ZcXHTI2TccH3L5N9JyAMGm8bbAsfLn8SUWOeYGHx/vDx7vu4qshyaNXTIxeHjpUQA29N+Z1LtTXA6vXjl1eg6w==", + "dev": true, + "dependencies": { + "@types/tmp": "^0.2.0", + "camelcase": "^6.0.0", + "cross-spawn": "^7.0.3", + "debug": "^4.2.0", + "find-cache-dir": "^3.3.1", + "find-package-json": "^1.2.0", + "get-port": "^5.1.1", + "https-proxy-agent": "^5.0.0", + "lockfile": "^1.0.4", + "md5-file": "^5.0.0", + "mkdirp": "^1.0.4", + "mongodb": "^3.6.2", + "semver": "^7.3.2", + "tar-stream": "^2.1.4", + "tmp": "^0.2.1", + "uuid": "^8.3.0", + "yauzl": "^2.10.0" + }, + "engines": { + "node": ">=10.15.0" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mongodb-memory-server-core/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongoose": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.1.tgz", + "integrity": "sha512-g/oIEvQQrK1XcICS/PfzU1Gu1s6Uw1rgJP7/SfC3Ru6pTLa1dH2Lb+iJipNWqChbrykE78j/wwBVSsbyCZRl5Q==", + "dependencies": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.5", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.4", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mongoose/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.4.tgz", + "integrity": "sha512-uOLpp7iRX0BV1Uu6YpsqJ5b42LwYnmu0WeF/f8qgD/On3g0XDaQM6pfn0m6UxO6SM8DioZ9Bk6xxbWIGHm2zHg==", + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-mocks-http": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.10.1.tgz", + "integrity": "sha512-/Nz83kiJ3z+vGqxmlDyv8+L1CJno+gH23DzG3oPH9dBSfMYa5IFVwPgZpXCB2kdiiIu/HoDpZ2BuLqQs7qjFLQ==", + "dev": true, + "dependencies": { + "accepts": "^1.3.7", + "depd": "^1.1.0", + "fresh": "^0.5.2", + "merge-descriptors": "^1.0.1", + "methods": "^1.1.2", + "mime": "^1.3.4", + "parseurl": "^1.3.3", + "range-parser": "^1.2.0", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", + "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/socket.io": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.0.0.tgz", + "integrity": "sha512-/c1riZMV/4yz7KEpaMhDQbwhJDIoO55whXaRKgyEBQrLU9zUHXo9rzeTMvTOqwL9mbKfHKdrXcMoCeQ/1YtMsg==", + "dependencies": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~5.0.0", + "socket.io-adapter": "~2.2.0", + "socket.io-parser": "~4.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz", + "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg==" + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz", + "integrity": "sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", + "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger-jsdoc": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-5.0.1.tgz", + "integrity": "sha512-Yxrulj5E2dY9HUHjryckFPG66YTwi8pih80pocNacGAojE8J7eN99Cx7NLQx+8sV2C3cnFVbrYVISCLpgmb6aA==", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "js-yaml": "3.14.0", + "swagger-parser": "10.0.2" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-jsdoc/node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.2.tgz", + "integrity": "sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw==", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-ui-dist": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.48.0.tgz", + "integrity": "sha512-UgpKIQW5RAb4nYRG8B615blmQzct0DNuvtX4904Fe2aMWAVfWeKHKl4kwzFXuBJgr2WYWTwM1PnhZ+qqkLrpPg==" + }, + "node_modules/swagger-ui-express": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz", + "integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==", + "dependencies": { + "swagger-ui-dist": "^3.18.1" + }, + "engines": { + "node": ">= v0.10.32" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "dependencies": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/z-schema": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", + "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^12.0.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=6.0.0" + }, + "optionalDependencies": { + "commander": "^2.7.1" + } + } + }, "dependencies": { "@apidevtools/json-schema-ref-parser": { "version": "9.0.7", @@ -6348,6 +16401,15 @@ } } }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6366,15 +16428,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -7139,6 +17192,14 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -7194,14 +17255,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", diff --git a/server/utils/openApiDocumentation/openApiComponents.js b/server/utils/openApiDocumentation/openApiComponents.js index a16ebd15..18a69265 100644 --- a/server/utils/openApiDocumentation/openApiComponents.js +++ b/server/utils/openApiDocumentation/openApiComponents.js @@ -81,7 +81,7 @@ * $ref: '#/components/schemas/ActivityIds' * robotId: * $ref: '#/components/schemas/RobotIds' - * outputVariable: + * outputValue: * type: string * example: Activity_0n140xq_output * rpaParameters: diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 9bf5064d..4a2ca54e 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -20,15 +20,15 @@ const isAnRpaInstruction = (currentElement) => currentElement.type === ACTIVITY_IDENTIFIER; /** - * @description Will create a prefix to catch the output variable of an activity, if one is present + * @description Will create a prefix to catch the output value of an activity, if one is present * @param {Object} paramObject The parameter object to check and loop through - * @returns {String} String specifying the output variables name + * @returns {String} String specifying the output value name */ const setOutputVar = (paramObject) => { let newCodeLine = FOURSPACE; - if (paramObject.outputVariable) { - newCodeLine += `\${${paramObject.outputVariable}} = `; + if (paramObject.outputValue) { + newCodeLine += `\${${paramObject.outputValue}} = `; } return newCodeLine; }; diff --git a/server/utils/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js index 2e90220a..94916dff 100644 --- a/server/utils/ssotToRobotParsing/retrieveParameters.js +++ b/server/utils/ssotToRobotParsing/retrieveParameters.js @@ -35,7 +35,7 @@ const retrieveParameters = async (ssot) => { { activityId: 1, rpaParameters: 1, - outputVariable: 1, + outputValue: 1, } ) .exec(); @@ -83,7 +83,7 @@ const getAllParametersForJob = async (jobId) => { /** * @description For all activities in the ssot this method will retrieve the associated parameter objects * @param {Object} ssot The ssot for which the parameters should be retrieved - * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters + * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional parameters * @returns {Array} Array of parameter objects */ const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { diff --git a/server/utils/testing/databaseLoader.js b/server/utils/testing/databaseLoader.js index ac4efc43..bc090dd0 100644 --- a/server/utils/testing/databaseLoader.js +++ b/server/utils/testing/databaseLoader.js @@ -35,12 +35,12 @@ const loadAttributesInDb = async () => { const loadParametersInDb = async () => { const RpaParam = mongoose.model('parameter'); - const rpaParamter = new RpaParam(testData.testParameter1); - await rpaParamter.save(); - const rpaParamter2 = new RpaParam(testData.testParameter2); - await rpaParamter2.save(); - const rpaParamter3 = new RpaParam(testData.testParameter3); - await rpaParamter3.save(); + const rpaParameter = new RpaParam(testData.testParameter1); + await rpaParameter.save(); + const rpaParameter2 = new RpaParam(testData.testParameter2); + await rpaParameter2.save(); + const rpaParameter3 = new RpaParam(testData.testParameter3); + await rpaParameter3.save(); }; const loadTasksInDb = async () => { diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-single-source-of-truth.md index 6bdf1bd6..dea7251f 100644 --- a/wiki/Documentation-single-source-of-truth.md +++ b/wiki/Documentation-single-source-of-truth.md @@ -120,7 +120,7 @@ User information about a robot (creator, released for etc.) is stored in an addi { "robotId": "604f537ed699a2eb47274184", "activityId": "Activity_47II", - "outputVariable": "exampleId", + "outputValue": "exampleId", "rpaParameters": [ { "name": "Filename", From 71491673ba30f1ceb869b98902239709141466a3 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 19 May 2021 07:07:56 +0200 Subject: [PATCH 063/149] fix FE tests --- .../modelerSidebarFunctionality.test.js | 2 +- server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index bd4d3d18..93fb869a 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -353,7 +353,7 @@ describe('Sidebar Functionality: Task Change', () => { let setParameterListCallCounter = 0; const MOCK_SETTER_OBJECT = { setOutputValueName: (newName) => { - expect(newName === undefined || newName === 'setOutputValueName').toBe( + expect(newName === undefined || newName === 'OutputValueName').toBe( true ); setOutputValueNameCallCounter += 1; diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 4a2ca54e..6ed8b5e7 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -24,7 +24,7 @@ const isAnRpaInstruction = (currentElement) => * @param {Object} paramObject The parameter object to check and loop through * @returns {String} String specifying the output value name */ -const setOutputVar = (paramObject) => { +const setOutputValue = (paramObject) => { let newCodeLine = FOURSPACE; if (paramObject.outputValue) { @@ -105,7 +105,7 @@ const writeCodeForElement = ( (parameter) => parameter.activityId === id ); if (currentParameterObject) { - newCodeLine += setOutputVar(currentParameterObject); + newCodeLine += setOutputValue(currentParameterObject); } if (duplicateTasks.includes(currentAttributeObject.rpaTask)) { newCodeLine += `RPA.${currentAttributeObject.rpaApplication}.${currentAttributeObject.rpaTask}`; From 4413c6da5a5ad3e2c99941a5a7844380007bc9c1 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 19 May 2021 11:25:36 +0200 Subject: [PATCH 064/149] polished documentation in frontend --- .../routes/functionalities/functionalities.js | 2 +- frontend/src/api/routes/robots/robots.js | 19 ++-- .../src/api/routes/robots/rpaAttributes.js | 6 +- .../src/api/routes/robots/rpaParameter.js | 10 +- frontend/src/api/routes/users/users.js | 5 +- .../src/api/socketHandler/socketEmitter.js | 6 +- .../src/api/socketHandler/socketListeners.js | 14 +-- frontend/src/components/App.jsx | 2 +- .../pages/RobotCodeEditor/RobotCodeEditor.jsx | 5 +- .../RobotInteractionCockpit.jsx | 6 +- .../RobotInteractionExecutionSection.jsx | 2 +- .../subComponents/RobotLogEntryCard.jsx | 5 + .../RobotInteractionInputSection.jsx | 2 +- .../robotInteractionCockpitFunctionality.js | 23 ++-- .../RobotModeler/BpmnModeler/BpmnModeler.jsx | 4 +- .../RemoveUnsupportedBpmnFunctions.js | 4 + .../ModelerSidebar/ModelerSidebar.jsx | 2 +- .../PropertiesPanel/PropertiesPanel.jsx | 2 +- .../PPIdSection/PPIdSection.jsx | 2 +- .../downloadStringAsFile.js | 1 - .../modelerSidebarFunctionality.js | 96 ++++++++-------- .../pages/RobotOverview/RobotOverview.jsx | 4 +- frontend/src/layout/corporateDesign.js | 2 +- .../notificationUtils.jsx | 8 +- .../bpmnToSsotParsing/bpmnToSsotParsing.js | 4 +- .../robotCodeToSsotParsing.js | 106 +++++++++--------- .../ssotToBpmnParsing/ssotToBpmnParsing.js | 20 ++-- .../functionalities.js | 2 +- .../localSsotController/attributes.js | 14 +-- .../localSsotController/parameters.js | 26 ++--- .../localSsotController/ssot.js | 4 +- .../sessionStorage/sessionStorageUtils.js | 6 +- 32 files changed, 212 insertions(+), 202 deletions(-) diff --git a/frontend/src/api/routes/functionalities/functionalities.js b/frontend/src/api/routes/functionalities/functionalities.js index 2b5d6b78..179aba85 100644 --- a/frontend/src/api/routes/functionalities/functionalities.js +++ b/frontend/src/api/routes/functionalities/functionalities.js @@ -21,7 +21,7 @@ const getAvailableApplications = async () => { }; /** - * @description Will send a backend call to retrieve all rpa-task objects for the purpose of retrieving the related parameter and possibly output value + * @description Will send a backend call to retrieve all rpa-task objects for the purpose of retrieving the related parameter and possible output value * @returns {Array} Array of all rpa-task objects */ const getAllRpaFunctionalities = async () => { diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index 3fcd3927..5e54cbd5 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -4,14 +4,15 @@ */ /** - * @description triggers parsing of the SSoT to .robot file and returns .robot file code - */ + * @description Triggers parsing of the Ssot to .robot file + * @returns returns .robot file code + * */ const getParsedRobotFile = async (robotId) => fetch(`/robots/${robotId}/robotCode`); /** * @description Fetch the ssot correlating to the specified Id - * @param { String } robotId - String including the Id of the robot to be retrieved + * @param { String } robotId - Id of the robot that will be retrieved */ const getSsot = async (robotId) => { const requestString = `/robots/${robotId}`; @@ -20,8 +21,8 @@ const getSsot = async (robotId) => { }; /** - * @description This function renames the robot in the ssot - * @param { String } robotId - String including the robotId + * @description Rename the robot in the ssot + * @param { String } robotId - RobotId of the robot that will be renamed * @param { String } newRobotName - String with the new RobotName */ const changeSsotName = async (robotId, newRobotName) => { @@ -41,8 +42,8 @@ const changeSsotName = async (robotId, newRobotName) => { }; /** - * @description Will send a backend call to delete a robot - * @param {String} robotId Id of the robot that is deleted + * @description Delete a robot by sending a call to the backend + * @param {String} robotId Id of the robot that will be deleted */ const deleteRobotFromDB = async (robotId) => { const requestStringParameters = `/robots/${robotId}`; @@ -53,8 +54,8 @@ const deleteRobotFromDB = async (robotId) => { /** * @description Overwrites an existing sssot in the backend with a new one - * @param {String} robotId Id of the robot that is being overwritten - * @param {String} ssot New ssot to be written to the database + * @param {String} robotId Id of the robot that will be overwritten + * @param {String} ssot New ssot that will be written to the database * @returns {Object} Updated ssot object */ const updateRobot = async (robotId, ssot) => { diff --git a/frontend/src/api/routes/robots/rpaAttributes.js b/frontend/src/api/routes/robots/rpaAttributes.js index 7c99ea98..8e9daf84 100644 --- a/frontend/src/api/routes/robots/rpaAttributes.js +++ b/frontend/src/api/routes/robots/rpaAttributes.js @@ -14,7 +14,7 @@ const getAllAttributes = async (robotId) => { }; /** - * @description Will send a backend call to update all given attribute objects with the new one's + * @description Will send a backend call to update all given attribute objects with the new ones * @param {Array} attributeObjectList All updated attribute objects to overwrite the old attribute objects with * @returns {Array} Array of all updated attribute objects */ @@ -32,9 +32,9 @@ const updateManyAttributes = async (attributeObjectList) => { }; /** - * @description Sends a callout to the backend to delete attributes for the given activities + * @description Delete attributes for the given activities by sending a call to the backend * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids + * @param {String} unusedActivityListString Stringified List of activityIds */ const deleteAttributesForActivities = (robotId, activityIdList) => { const requestStringParameters = `/robots/parameters/${robotId}`; diff --git a/frontend/src/api/routes/robots/rpaParameter.js b/frontend/src/api/routes/robots/rpaParameter.js index 916f1190..f576642e 100644 --- a/frontend/src/api/routes/robots/rpaParameter.js +++ b/frontend/src/api/routes/robots/rpaParameter.js @@ -5,7 +5,7 @@ /** * @description Fetch all parameter objects for a specifc robot - * @param { String } robotId Id of the robot we want to get all the parameters for + * @param { String } robotId Id of the robot to get all the parameters for */ const getAllParametersForRobot = async (robotId) => { const requestString = `/robots/parameters/${robotId}`; @@ -14,7 +14,7 @@ const getAllParametersForRobot = async (robotId) => { }; /** - * @description Will send a backend call to update all given parameter objects with the new one's + * @description Will send a backend call to update all given parameter objects with the new ones * @param {Array} parameterObjectsList All updated parameters objects to overwrite the old attribute objects with * @returns {Array} Array of all updated parameter objects */ @@ -32,9 +32,9 @@ const updateManyParameters = async (parameterObjectsList) => { }; /** - * @description Sends a callout to the backend to delete parameters for the given activities - * @param {String} robotId Id of the robot that is being used - * @param {String} unusedActivityListString Stringified List of Activity Ids + * @description Delete parameters for the given activities by sending a call to the backend + * @param {String} robotId Id of the robot that will be used + * @param {String} unusedActivityListString Stringified List of activityIds */ const deleteParametersForActivities = (robotId, activityIdList) => { const requestStringParameters = `/robots/parameters/${robotId}`; diff --git a/frontend/src/api/routes/users/users.js b/frontend/src/api/routes/users/users.js index 8d1f4b0a..b60c9f26 100644 --- a/frontend/src/api/routes/users/users.js +++ b/frontend/src/api/routes/users/users.js @@ -5,7 +5,7 @@ /** * @description Fetch all those ssot names and ids, which are available for the current user - * @param { String } userId - String including the user id + * @param { String } userId - UserId for which the ssots will be fetched */ const fetchSsotsForUser = async (userId) => { const requestString = `/users/${userId}/robots`; @@ -15,7 +15,8 @@ const fetchSsotsForUser = async (userId) => { /** * @description Create a new robot with the specified name for the specified user - * @param {String} newName - String including the userId + * @param {String} userId - The user for which the robot will be created + * @param {String} robotName - The Name of the new robot */ const createNewRobot = async (userId, robotName) => { const body = { diff --git a/frontend/src/api/socketHandler/socketEmitter.js b/frontend/src/api/socketHandler/socketEmitter.js index d20c8f20..3cb1fcf3 100644 --- a/frontend/src/api/socketHandler/socketEmitter.js +++ b/frontend/src/api/socketHandler/socketEmitter.js @@ -6,7 +6,7 @@ import socket from '../../utils/socket/socketConnections'; /** * @description Emits a new event that a user joined its room - * @param {String} userId Id of the user for which room should be joined + * @param {String} userId Id of the user for which the room will be joined */ const joinRoomForUser = (userId) => { socket.emit('joinUserRoom', userId, 'webApplication'); @@ -14,8 +14,8 @@ const joinRoomForUser = (userId) => { /** * @description Emits a new event that a user wants to enqueue a robot instace for execution - * @param {String} userId Id of the user for which to start a robot for - * @param {String} robotId Id of the robot which should be started + * @param {String} userId Id of the user for which the robot will be started + * @param {String} robotId Id of the robot which will be started */ const startRobotForUser = (userId, robotId, parameters) => { socket.emit('robotExecutionJobs', { robotId, userId, parameters }); diff --git a/frontend/src/api/socketHandler/socketListeners.js b/frontend/src/api/socketHandler/socketListeners.js index 735034a1..a823972e 100644 --- a/frontend/src/api/socketHandler/socketListeners.js +++ b/frontend/src/api/socketHandler/socketListeners.js @@ -5,30 +5,29 @@ import socket from '../../utils/socket/socketConnections'; /** - * @description Register listener on successful connection to a user room + * @description Registers listener on successful connection to a user room */ const successRoomConnection = () => { socket.on('successUserRoomConnection', (message) => message); }; /** - * @description Register listener on faulty connection to a user room + * @description Registers listener on faulty connection to a user room */ const errorRoomConnection = () => { socket.on('errorUserRoomConnection', (message) => message); }; /** - * @description Register listener on when a new client joins the room + * @description Registers listener when a new client joins the room */ const newClientJoined = () => { socket.on('newClientJoinedUserRoom', (message) => message); }; /** - * @description Register listener on when a new robot log update has been send - * @param {function} logSetterMethod Method reference to update the state of log in the robotInteractionCockpit - + * @description Register listener when a new robot log update has been send + * @param {function} logSetterMethod Method reference to update the state of the log in the robotInteractionCockpit */ const newRobotMonitorUpdate = (logSetterMethod) => { socket.on('changedRobotRunLogs', (robotLogs) => { @@ -38,8 +37,7 @@ const newRobotMonitorUpdate = (logSetterMethod) => { /** * @description Register listener on when a new robot status has been set - * * @param {function} logSetterMethod Method reference to update the status of log in the robotInteractionCockpit - + * @param {function} logSetterMethod Method reference to update the status of the log in the robotInteractionCockpit */ const newRobotStatusUpdate = (statusSetterMethod) => { socket.on('changedRobotStatus', (status) => statusSetterMethod(status)); diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index b0d58dd3..d61ea646 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -8,7 +8,7 @@ import RobotOverview from './pages/RobotOverview/RobotOverview'; import RobotInteractionCockpit from './pages/RobotInteractionCockpit/RobotInteractionCockpit'; /** - * @description route component of the application + * @description Route component of the application * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index f75d264f..8c7f96a6 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -48,9 +48,8 @@ const RobotFile = () => { }, []); /** - * @description Gets called when the the button is pressed to save to the cloud. - * This function will retrieve the code from the editor, parse it to a ssot and write the - * resulting ssot into the sessionStorage. + * @description Will retrieve the code from the editor, parse it to a ssot and write the + * resulting ssot into the sessionStorage. Gets called when the the button is pressed to save to the cloud. */ const onSaveToCloud = () => { const ssot = parseRobotCodeToSsot(code); diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx index dac82c1a..f6efe0d1 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionCockpit.jsx @@ -19,7 +19,7 @@ const { Step } = Steps; const { Title } = Typography; /** - * @description Page, where you can interact with a robot and for example enter input + * @description View where you can interact with a robot and enter parameters * @category Frontend * @component */ @@ -75,9 +75,9 @@ const RobotInteractionCockpit = (match) => { }; /** - * @description Will update the value of a parameter in the component state + * @description Updates the value of a parameter in the component state * @param {string} parameterId Id of the parameter which value will be changed - * @param {string} value new value of the parameter + * @param {string} value New value of the parameter */ const updateParameterValue = (parameterId, value) => { const currentParameters = [...parameters]; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 759e4735..e37d045e 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -12,7 +12,7 @@ import styles from '../../RobotInteractionCockpit.module.css'; const { Title } = Typography; /** - * @description Renders the robot logs and robot status while execution + * @description Renders the robot logs and robot status while executing * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx index 511ab3f3..fc88c3e7 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx @@ -2,6 +2,11 @@ import React from 'react'; import { Card, Row, Col } from 'antd'; import PropTypes from 'prop-types'; +/** + * @description Renders the status of an individual robot log + * @category Frontend + * @component + */ const RobotLogCard = (props) => { const { log } = props; const { displayStatusIcon } = props; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx index 499e07ef..05243ef9 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx @@ -6,7 +6,7 @@ import RobotInteractionInputParameter from './subComponents/RobotInteractionPara const { Title } = Typography; /** - * @description Renders all necessary input fields for inserting the missing parameters before execution + * @description Renders all necessary input fields for inserting the missing parameters before executing a robot * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index 67a3c3ef..dec75b55 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -1,11 +1,16 @@ +/** + * @category Frontend + * @module + */ + import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameter'; import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributes'; /** * @description Will return a boolean regarding the correct configuration of the given parameterObejcts belonging to a robot. - * If a paramter has is required and not value is given and th evalue will not be specified later by the user, the paramter is not correctly configured. - * @param {Object[]} parameterObjects array of parameterObjects that are to be checked - * @returns {boolean} a boolean value regarding the correctness of the parameter configuration + * If a paramter is required and no value is passed and the value will not be specified later by the user, the paramter is not correctly configured. + * @param {Object[]} parameterObjects Array of parameterObjects that will be checked + * @returns {boolean} Boolean value regarding the correctness of the parameter configuration */ const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; @@ -31,8 +36,8 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { /** * @description Will return a boolean regarding the correct configuration regarding the given attributeObjects of a robot. * If an attribute has no specified application or task, the attribute is not correctly configured. - * @param {Object[]} attributeObjects array of attributeObjects that are to be checked - * @returns {boolean} a boolean value regarding the correctness of the attribute configuration + * @param {Object[]} attributeObjects Array of attributeObjects that will be checked + * @returns {boolean} A boolean value regarding the correctness of the attribute configuration */ const configuredRobotActivitesCorrectly = (attributeObjects) => { let executability = true; @@ -58,8 +63,8 @@ const configuredRobotActivitesCorrectly = (attributeObjects) => { /** * @description Will return a boolean regarding the correct configuration of a robot. * If a robot has incorrectly configured attributes or parameters, then the robot is not correctly configured. - * @param {String} robotId RobotId of the robot that is to be checked - * @returns {boolean} a boolean value regarding the executability of the robot + * @param {String} robotId RobotId of the robot that will be checked + * @returns {boolean} Boolean value regarding the executability of the robot */ const isRobotExecutable = async (robotId) => { const attributes = await getAllAttributes(robotId); @@ -79,8 +84,8 @@ const isRobotExecutable = async (robotId) => { }; /** - * @description For each activity of the current robot get the id, the name and all the parameters that require a user input - * @param {String} robotId Id of the robot for which we want to get all parameters + * @description Get the id, the name and all the parameters for each activity of the current robot that require a user input + * @param {String} robotId Id of the robot for which all parameters will be retrieved * @param {Function} setParameterList Setter function for the component state parameterList * @param {Object} isMounted Describes if the component is currently mounted or not */ diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx index 12c0b508..e9761221 100644 --- a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx @@ -13,7 +13,7 @@ import 'bpmn-font/dist/css/bpmn-embedded.css'; const { Content } = Layout; /** - * @description This component renders the modeling interface as well as the sidebar. + * @description This component renders the BPMN modeling interface as well as the sidebar. * @category Frontend * @component */ @@ -21,7 +21,7 @@ const BpmnModeler = (props) => { let newModeler; /** - * @description while the components were mounted, the BPMN-Modeler get's initialized + * @description While the components were mounted, the BPMN-Modeler is initialized */ useEffect(() => { newModeler = new CamundaBpmnModeler({ diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js index 5e223415..06115556 100644 --- a/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js +++ b/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js @@ -1,5 +1,9 @@ import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider'; +/** + * @description Removes unsopported BPMN artifacts from the modeler + * @category Frontend + */ const removeUnsupportedBpmnFunctions = () => { const { getPaletteEntries } = PaletteProvider.prototype; // eslint-disable-next-line func-names diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx index e0c329c2..ecfa007d 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx @@ -57,7 +57,7 @@ const ModelerSidebar = ({ modeler, robotId }) => { }, []); /** - * @description Get's called whenever the modeler changed. Either a new element was selected or an element changed or both. + * @description Called whenever the modeler changes. Either a new element was selected or an element changed or both. */ useEffect(() => { modeler.on('selection.changed', (event) => { diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx index 5e835f4a..8fa87067 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanel.jsx @@ -11,7 +11,7 @@ import PPRpaSection from './PropertiesPanelSections/PPRpaSection/PPRpaSection'; import PPOutputValueSection from './PropertiesPanelSections/PPOutputValueSection/PPOutputValueSection'; /** - * @description Shows PropertiesPanel for one selected BPMN-Element. + * @description Displays the PropertiesPanel for one selected BPMN-Element. * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx index 5e8b6479..339ce9ce 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPIdSection/PPIdSection.jsx @@ -4,7 +4,7 @@ import { Space, Typography } from 'antd'; const { Text } = Typography; /** - * @description Renders the task-dropdown based on passed list of task. + * @description Renders the task-dropdown based on the passed list of tasks. * @category Frontend * @component */ diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js index 13d988b5..a639d515 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/downloadStringAsFile.js @@ -8,7 +8,6 @@ * @param {string} text String that will be the content of the downloaded file * @param {string} fileType String that sets the file type of the downloaded file; Use form text/filetype * @param {string} fileName String that sets the name of the downloaded file; Use the same filetype as given in the fileType parameter e.g. name.filetype - * @returns {undefined} The return is not defined */ const downloadString = (text, fileType, fileName) => { const blob = new Blob([text], { type: fileType }); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 0a5e8384..92bbe8fb 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -21,11 +21,11 @@ import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; /** - * @description Gets called when the the button is pressed to save to the cloud. + * @description Called when the the button is pressed to save to the cloud. * This function will retrieve the xml from the parser, parse that xml to a ssot and write the * resulting ssot into the sessionStorage. - * @param {Object} modeler the modeling object - * @param {String} robotId id of the robot + * @param {Object} modeler The modeling object + * @param {String} robotId Id of the robot */ const onSaveToCloud = async (modeler, robotId) => { const xml = await modeler.saveXML({ format: true }); @@ -36,8 +36,8 @@ const onSaveToCloud = async (modeler, robotId) => { }; /** - * @description Will parse the ssot which can be found in the database correlating to the specified id - * @param {String} robotId id of the robot + * @description Parses the ssot which can be found in the database correlating to the specified id + * @param {String} robotId Id of the robot */ const downloadRobotFile = async (robotId) => { const response = await (await getParsedRobotFile(robotId)).text(); @@ -46,10 +46,10 @@ const downloadRobotFile = async (robotId) => { }; /** - * @description Will update the element state upon selection od a new element. - * @param {Object} event event containing the information about the new element selected + * @description Updates the element state upon selection of a new element. + * @param {Object} event Event containing the information about the new element selected * @param {Object} elementState State of the element - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const modelerElementChangeHandler = (event, elementState, setterObject) => { if (!elementState.currentElement) { @@ -66,8 +66,8 @@ const modelerElementChangeHandler = (event, elementState, setterObject) => { /** * @description Checks if tasks for selected application are already stored in session storage. * Otherwise, fetch tasklist from MongoDB. - * @param {String} application Application for which to get the tasks for. - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @param {String} application Application for the tasks will be retrieved + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const getTasksForApplication = async (application, setterObject) => { const currentSavedTasksObject = JSON.parse( @@ -92,10 +92,10 @@ const getTasksForApplication = async (application, setterObject) => { }; /** - * @description Will check for the given activity, if it has been configured with an application and/or task. + * @description Checks if a given activity has been configured with an application and/or task. * This can be used to trigger the disablement of the task dropdown. - * @param {String} activityId Id of the activity to check for - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @param {String} activityId Id of the activity that will be checked + * @param {Object} setterObject Object containing the functions for setting the state in the React component * @returns {Boolean} Boolean if there is an object found and an application has been previously configured */ const checkForApplicationTask = (activityId, setterObject) => { @@ -114,11 +114,11 @@ const checkForApplicationTask = (activityId, setterObject) => { }; /** - * @description Gets called when a new application was selected in the dropwdown in the sidebar. - * Updates the state of the component and gets the tasks of the application for the TaskDropdown and clears the TaskDropdown. - * @param {String} activityId id of the activity for which the change is supposed to happen - * @param {String} robotId id of the robot to update - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @description Updates the state of the component and retrieves the tasks of the application for the TaskDropdown and clears the TaskDropdown. + * Called when a new application was selected in the dropwdown in the sidebar. + * @param {String} activityId Id of the activity for which will be changed + * @param {String} robotId Id of the that will be updated + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const updateParamSection = (activityId, robotId, setterObject) => { setterObject.setOutputVariableName(undefined); @@ -134,11 +134,11 @@ const updateParamSection = (activityId, robotId, setterObject) => { }; /** - * @description Gets called upon a change in the modeler, will update the state with attributes matching the new selection - * @param {Object} event event telling the newly happened change - * @param {Object} elementState state of the selected element - * @param {String} robotId id of the robot which was opened - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @description Updates the state with attributes matching the new selection. Called upon a change in the modeler. + * @param {Object} event Event describing the newly happened change + * @param {Object} elementState State of the selected element + * @param {String} robotId Id of the robot which was opened + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const modelerSelectionChangeHandler = ( event, @@ -175,11 +175,11 @@ const modelerSelectionChangeHandler = ( }; /** - * @description Gets called when the name of the selected element got updated in the sidebar. Updates the state of the component. - * @param {Object} event changed value in input field - * @param {Object} modeler the modeling object - * @param {Object} elementState state of the selected element - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @description Updates the state of the component. Called when the name of the selected element got updated in the sidebar. + * @param {Object} event Changed value in input field + * @param {Object} modeler The modeling object + * @param {Object} elementState State of the selected element + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const nameChangedHandler = (event, modeler, elementState, setterObject) => { const { currentElement } = elementState; @@ -193,12 +193,12 @@ const nameChangedHandler = (event, modeler, elementState, setterObject) => { }; /** - * @description Gets called when a new application was selected in the dropwdown in the sidebar. - * Updates the state of the component and gets the tasks of the application for the TaskDropdown and clears the TaskDropdown. - * @param {Object} value new value of the ApplicationDropdown - * @param {String} robotId id of the robot - * @param {Object} elementState state of the selected element - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @description Updates the state of the component and retrieves the tasks of the application for the TaskDropdown and clears the TaskDropdown. + * Called when a new application was selected in the dropwdown in the sidebar. + * @param {Object} value New value of the ApplicationDropdown + * @param {String} robotId Id of the robot + * @param {Object} elementState State of the selected element + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const applicationChangedHandler = ( value, @@ -220,13 +220,13 @@ const applicationChangedHandler = ( }; /** - * @description Gets called when a new task was selected in the dropwdown in the sidebar. Updates the state of the component - * and gets the parameters of the task and updates the XML RPA properties (adds the application and the task). - * @param {Object} value new value of the TaskDropdown - * @param {String} activityId id of the activity selected - * @param {String} robotId id of the robot - * @param {String} selectedApplication application selected - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @description Updates the state of the component and gets the parameters of the task and updates the XML RPA properties (adds the application and the task). + * Called when a new task was selected in the dropwdown in the sidebar. + * @param {Object} value New value of the TaskDropdown + * @param {String} activityId Id of the activity selected + * @param {String} robotId Id of the robot + * @param {String} selectedApplication Application selected + * @param {Object} setterObject Object containing the functions for setting the state in the React component */ const taskChangedHandler = ( value, @@ -240,20 +240,18 @@ const taskChangedHandler = ( }; /** - * @description Gets called when the value in a single input field for the parameters has been changed and updates - * the values in the ssot - * @param {String} activityId id of the activity selected - * @param {Object} value new value of input field + * @description Updates the values in the ssot. Called when the value in a single input field for the parameters has been changed + * @param {String} activityId Id of the activity selected + * @param {Object} value New value of input field */ const inputParameterChangeHandler = (activityId, value) => { setSingleParameter(activityId, value); }; /** - * @description Gets called when the name of the output variable has been changed and updates - * the output variables name in the ssot - * @param {String} activityId id of the activity selected - * @param {Object} newValue new value of the output variables name + * @description Updates the output variables name in the ssot. Called when the name of the output variable has been changed + * @param {String} activityId Id of the activity selected + * @param {Object} newValue New value of the output variables name */ const outputVarNameChangeHandler = (activityId, newValue) => { setOutputValueName(activityId, newValue); diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 84e1b06e..51aa2fff 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -30,7 +30,7 @@ const RobotOverview = () => { /** * @description Fetches Bots for the specified user and will trigger a rerender so that it will be displayed - * @param {String} userIdToFetch The userId to fetch Bots for + * @param {String} userIdToFetch The userId for which the bots will be fetched */ const retrieveBotList = (userIdToFetch) => { fetchSsotsForUser(userIdToFetch) @@ -64,7 +64,7 @@ const RobotOverview = () => { /** * @description Updates the current user id in the session storage and sets the state variable userId to the new value - * @param {Integer} value the value of the number input field used for setting the user id + * @param {Integer} value The value of the number input field used for setting the user id */ const changeUserId = (value) => { sessionStorage.setItem('CurrentUserId', value); diff --git a/frontend/src/layout/corporateDesign.js b/frontend/src/layout/corporateDesign.js index 187502ea..84bd607a 100644 --- a/frontend/src/layout/corporateDesign.js +++ b/frontend/src/layout/corporateDesign.js @@ -1,4 +1,4 @@ -// changes to the variables here also have to be made in corporateDesign.css! +// Changes to the variables here also have to be made in corporateDesign.css! const colorPrimary = '#00C2FF'; const colorPrimaryInverted = '#1C272B'; diff --git a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx index 26423f30..ae96b8c0 100644 --- a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx +++ b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx @@ -10,10 +10,10 @@ import corporateDesign from '../../layout/corporateDesign'; /** * @description Will first consider if a special icon is requested and otherwise return the corresponding icon for the notification type. - * @param {String} type one from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box + * @param {String} type One from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box * @param {String} icon The icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) * @param {String} colorName Returns the css selector for the matching notification type - * @returns the icon component of the notification + * @returns The icon component of the notification */ // eslint-disable-next-line consistent-return const getIconForType = (type, icon, colorName) => { @@ -50,8 +50,8 @@ const getIconForType = (type, icon, colorName) => { }; /** - * @description Throws a notification at the upper right edge of the screen, which disappears again automatically - * @param {String} type one from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box + * @description Throws a notification at the upper right edge of the screen, which disappears automatically + * @param {String} type One from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box * @param {String} message The message that is displayed in the notification * @param {String} icon The icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) */ diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index cd0a7e2f..e08e91a3 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -35,8 +35,8 @@ const isElementTracked = (elementsArray, id) => { /** * - * @param {Array} bpmnShapes all shapes of the BPMN diagram - * @param {Array} localElementsArray current version of the localElementsArray with all elements + * @param {Array} bpmnShapes All shapes of the BPMN diagram + * @param {Array} localElementsArray Current version of the localElementsArray with all elements * @returns {Array} Array of elements with their id, successors, predecessors and name */ const returnElementsArrayWithNameLabel = (bpmnShapes, localElementsArray) => { diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index c08f6570..353cb78a 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -45,8 +45,8 @@ const getRobotCodeAsArray = (robotCode) => { }; /** - * @description checks all lines of the settings section for the right syntax and returns all declared applications as an array - * @param {Array} robotCodeSettingsSection all lines from the settings section as an array-entry (typeof string) + * @description Checks all lines of the settings section for the right syntax and returns all declared applications as an array + * @param {Array} robotCodeSettingsSection All lines from the settings section as an array-entry (typeof string) * @returns Array of all declared applications or undefined if an error occures */ const getApplicationArray = (robotCodeSettingsSection) => { @@ -103,9 +103,9 @@ const getApplicationArray = (robotCodeSettingsSection) => { }; /** - * @description retrieves the outputVariable name from the current code line - * @param {String} currentLine current line of RPAf code - * @returns outputVariable as string + * @description Retrieves the outputVariable name from the current code line + * @param {String} currentLine Current line of RPAf code + * @returns OutputVariable as string */ const getOutputName = (currentLine) => { const indexOfEqualsSign = currentLine.indexOf('='); @@ -117,11 +117,11 @@ const getOutputName = (currentLine) => { }; /** - * @description retrieves the rpa task from the current code line; if there are no parameters, + * @description Retrieves the rpa task from the current code line; if there are no parameters, * the indexOfFirstSplitPlaceholder returns -1 and therefore the function returns the whole line - * @param {String} currentLine current line of RPAf code - * @param {String} splitPlaceholder placeholder to split the string - * @returns rpaTask as string + * @param {String} currentLine Current line of RPAf code + * @param {String} splitPlaceholder Placeholder to split the string + * @returns RpaTask as string */ const getRpaTask = (currentLine, splitPlaceholder) => { const indexOfFirstSplitPlaceholder = currentLine.indexOf(splitPlaceholder); @@ -131,11 +131,11 @@ const getRpaTask = (currentLine, splitPlaceholder) => { }; /** - * @description retrieves the rpa parameters from the current code line - * @param {String} currentLine current line of RPAf code - * @param {String} splitPlaceholder placeholder to split the string - * @param {String} instructionBlocks current intruction block to get the rpaTask - * @returns rpaParameters as array + * @description Retrieves the rpa parameters from the current code line + * @param {String} currentLine Current line of RPAf code + * @param {String} splitPlaceholder Placeholder to split the string + * @param {String} instructionBlocks Current intruction block to get the rpaTask + * @returns RpaParameters as array */ const getRpaParameters = (currentLine, splitPlaceholder) => { const indexOfFirstSplitPlaceholder = currentLine.indexOf(splitPlaceholder); @@ -146,10 +146,10 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { }; /** - * @description deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format - * @param {String} currentLine current line of RPAf code - * @param {String} splitPlaceholder placeholder to split the string - * @returns the current line without the outputVariableName prefix as string + * @description Deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format + * @param {String} currentLine Current line of RPAf code + * @param {String} splitPlaceholder Placeholder to split the string + * @returns The current line without the outputVariableName prefix as string */ const currentLineWithoutOutputVariableName = ( completeLine, @@ -166,11 +166,11 @@ const currentLineWithoutOutputVariableName = ( }; /** - * @description counts the number of occurences of the current task in the subset + * @description Counts the number of occurences of the current task in the subset * of all Task/Application combinations for the current robot code - * @param {Array} allMatchingCombinations all combinations from database that match the rpaTask - * @param {*} rpaTask paTask from current robotCode line - * @returns number of occurrences of the rpaTask in allMatchingCombinations + * @param {Array} allMatchingCombinations All combinations from database that match the rpaTask + * @param {*} rpaTask RpaTask from current robotCode line + * @returns Number of occurrences of the rpaTask in allMatchingCombinations */ const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { let numberOfOccurrences = 0; @@ -183,10 +183,10 @@ const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { }; /** - * @description this function returns the matching task object for the rpaTask or throws a notification - * @param {String} rpaTask rpaTask from current robotCode line - * @param {Array} allMatchingCombinations all combinations from database that match the rpaTask - * @returns the matching task object for the rpaTask or undefined if an error occurs + * @description Returns the matching task object for the rpaTask or throws a notification + * @param {String} rpaTask RpaTask from current robotCode line + * @param {Array} allMatchingCombinations All combinations from database that match the rpaTask + * @returns The matching task object for the rpaTask or undefined if an error occurs */ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { const numberOfOccurrences = numberOfOccurrencesOfTask( @@ -216,9 +216,9 @@ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { }; /** - * @description "preprocesses" the code in a usable data format - * @param {Array} robotCodeTaskSection robot code w/o empty lines as an array of Strings - * @param {Array} taskAndApplicationCombinations all declared tasks and applications from database + * @description "Preprocesses" the code in a usable data format + * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of Strings + * @param {Array} taskAndApplicationCombinations All declared tasks and applications from database * @returns Array of Objects with the following schema: * instructionBlocks = [rpaApplication:String, rpaTask:String, name:String, paramArray:Array] */ @@ -307,7 +307,7 @@ const getInstructionBlocksFromTaskSection = ( /** * @description Builds a dummy startMarker element and returns them - * @returns dummy startMarker as JSON => currently MARKERS aren't defined + * @returns Dummy startMarker as JSON => currently MARKERS aren't defined * in our RPAf-Syntax and therefore there aren't implemented */ const buildStartMarker = () => ({ @@ -320,8 +320,8 @@ const buildStartMarker = () => ({ /** * @description Builds a dummy endMarker element and returns them - * @param {Object} predecessor as an Object to get the predecessorId - * @returns dummy endMarker as JSON => currently MARKERS aren't defined + * @param {Object} predecessor As an Object to get the predecessorId + * @returns Dummy endMarker as JSON => currently MARKERS aren't defined * in our RPAf-Syntax and therefore there aren't implemented */ const buildEndMarker = (predecessor) => ({ @@ -333,11 +333,11 @@ const buildEndMarker = (predecessor) => ({ }); /** - * @description builds the attributeObject for a single element - * @param {Object} currentElement current instruction element - * @param {Object} singleElementFromTasksSection the parsed Object from the RPAf Code - * @param {String} robotId the id of the current robot / ssot - * @returns attributeObject for a single attribute + * @description Builds the attributeObject for a single element + * @param {Object} currentElement Current instruction element + * @param {Object} singleElementFromTasksSection The parsed Object from the RPAf Code + * @param {String} robotId The id of the current robot / ssot + * @returns AttributeObject for a single attribute */ const buildSingleAttributeObject = ( currentElement, @@ -356,11 +356,11 @@ const buildSingleAttributeObject = ( }; /** - * @description builds the parameterObject for a single element - * @param {Object} singleAtrributeObject the attribute Object of the current activity - * @param {Object} singleElementFromTasksSection the parsed Object from the RPAf Code - * @param {Array} taskAndApplicationCombinations all combinations of applications and tasks - * @returns parameterObject for a single attribute + * @description Builds the parameterObject for a single element + * @param {Object} singleAtrributeObject The attribute Object of the current activity + * @param {Object} singleElementFromTasksSection The parsed Object from the RPAf Code + * @param {Array} taskAndApplicationCombinations All combinations of applications and tasks + * @returns {Object} ParameterObject for a single attribute */ const buildSingleParameterObject = ( singleAtrributeObject, @@ -417,11 +417,11 @@ const buildSingleParameterObject = ( }; /** - * @description build the elementsArray of the ssot - * @param {Array} robotCodeTaskSection robot code w/o empty lines as an array of Strings - * @param {Array} declaredApplications all declared Aplications from ***settings*** section as Strings - * @param {String} robotId the id of the current robot / ssot - * @returns elementsArray with all needed properties + * @description Build the elementsArray of the ssot + * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of Strings + * @param {Array} declaredApplications All declared Aplications from ***settings*** section as Strings + * @param {String} robotId The id of the current robot / ssot + * @returns {Array} elementsArray with all needed properties */ const getElementsArray = ( robotCodeTaskSection, @@ -501,9 +501,9 @@ const getElementsArray = ( }; /** - * @description retrieves the starterId of the robot from the elements array + * @description Retrieves the starterId of the robot from the elements array * @param {Array} elementsArray Array of all elements of the robot - * @returns starterId as string + * @returns {String} StarterId */ const getStarterId = (elementsArray) => { const starterElements = elementsArray.filter( @@ -518,9 +518,9 @@ const getStarterId = (elementsArray) => { }; /** * @description - * @param {Array} robotCodeAsArray the complete robotCode w/o new lines as array - * @param {String} selector the selector to get the line number for - * @returns line number where the selector occurs + * @param {Array} robotCodeAsArray The complete robotCode w/o new lines as array + * @param {String} selector The selector for which the line number will be retrieved + * @returns {number} Line number where the selector occurs */ const getLineNumberForSelector = (robotCodeAsArray, selector) => { let lineNumber; @@ -538,7 +538,7 @@ const getLineNumberForSelector = (robotCodeAsArray, selector) => { /** * @description Parses the RPA-Framework code from the code editor to the single source of truth - * @param {String} robotCode from the code-editor + * @param {String} robotCode From the code-editor * @returns Single source of truth as a JavaSctipt-object or undefined if an error occures */ const parseRobotCodeToSsot = (robotCode) => { diff --git a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index fcb4f624..bcf0c36d 100644 --- a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -9,8 +9,8 @@ const DEFAULT_SPACING = '150,0'; const DEFAULT_STARTEVENT_POSITION = '200,330'; /** - * @description Will search through the ssot and return the only element without a predecessor - * @param {Object} ssot The ssot to process + * @description Searches through the ssot and return the only element without a predecessor + * @param {Object} ssot The ssot that will be processed */ const findStartElement = (ssot) => ssot.elements.find( @@ -18,8 +18,8 @@ const findStartElement = (ssot) => ); /** - * @description Will create an order within the elements based on their positioning in the flow - * @param {Object} ssot The ssot to process + * @description Creates an order within the elements based on their positioning in the flow + * @param {Object} ssot The ssot that will be processed * @returns {Array} The elements of the ssot in the correct order in which they appear in the flow */ const buildCorrectOrder = (ssot) => { @@ -36,8 +36,8 @@ const buildCorrectOrder = (ssot) => { }; /** - * @description The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot. - * Because of that this workaround is needed, which takes in the created element and updates its id to the one saved in the ssot + * @description Workaround which takes in the created element and updates its id to the one saved in the ssot. + * The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot therefore this workaround is needed. * @param {*} modeling The modeling extension * @param {Object} element The first element (start element) to process * @returns {String} The now set id of the shape @@ -52,7 +52,7 @@ const updateIdForElement = (modeling, cli, element, cliResult) => { }; /** - * @description Will create the first element in the BPMN diagram as a start event + * @description Creates the first element in the BPMN diagram as a start event * @param {*} cli The modeling cli extension * @param {*} modeling The modeling extension * @param {Object} element The first element (start element) to process @@ -87,7 +87,7 @@ const drawElement = (cli, modeling, element, previousElement) => { }; /** - * @description Will check if the default start event is still present and will remove if so + * @description Checks if the default start event is still present and will remove if so * @param {*} cli The modeling cli extension */ const removeDefaultStarter = (cli) => { @@ -96,7 +96,7 @@ const removeDefaultStarter = (cli) => { }; /** - * @description Will create the first element in the BPMN diagram as a start event + * @description Creates the first element in the BPMN diagram as a start event * @param {*} cli The modeling cli extension * @param {*} modeling The modeling extension * @param {Object} element The first element (start element) to process @@ -116,7 +116,7 @@ const drawStartElement = (cli, modeling, element) => { }; /** - * @description Will create the BPMN XML from the provided ssot, as well as displaying the diagram on the modeling component + * @description Creates the BPMN XML from the provided ssot, as well as displaying the diagram on the modeling component * @param {*} modeler The bpmn modeler * @param {Object} ssot The ssot to parse * @returns {String} The parsed XML BPMN diagram as a String diff --git a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js index 7988a3db..d7333478 100644 --- a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js +++ b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js @@ -6,7 +6,7 @@ const FUNCTIONALITIES_STORAGE_PATH = 'TaskApplicationCombinations'; /** - * @description Will get the rpa functionalities object for a specific rpa application and rpa task combination + * @description Retrieves the rpa functionalities object for a specific rpa application and rpa task combination * @param {String} application Name of the rpa application * @param {String} task Name of the rpa task */ diff --git a/frontend/src/utils/sessionStorage/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js index b0e0d113..ef770d3f 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/attributes.js +++ b/frontend/src/utils/sessionStorage/localSsotController/attributes.js @@ -7,15 +7,15 @@ import { deleteAttributesForActivities } from '../../../api/routes/robots/rpaAtt const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; /** - * @description Will get the attribute object array from the session storage - * @returns {Array} parameter local storage + * @description Retrieves the attribute object array from the session storage + * @returns {Array} Parameter from local storage */ const getAttributeStorage = () => JSON.parse(sessionStorage.getItem(ATTRIBUTE_STORAGE_PATH)); /** - * @description Will get the attribute object for an activiy from session storage - * @param {String} activityId Id of the activity for which to get the attribute object + * @description Retrieves the attribute object for an activiy from session storage + * @param {String} activityId Id of the activity for which the attribute object will be retrieved * @returns The attribute object for the selected activity or undefined if not available */ const getAttributeObjectForActivity = (activityId) => { @@ -28,7 +28,7 @@ const getAttributeObjectForActivity = (activityId) => { }; /** - * @description This function gets the selected rpa task for the selected activity from session storage + * @description Retrieves the selected rpa task for the selected activity from session storage * @param {String} activityId Id of the currently selected activity * @returns The selected rpa task for the selected activity from session storage or undefined if not available */ @@ -114,7 +114,7 @@ const setRpaApplication = (robotId, activityId, newApplication) => { }; /** - * @description Gets the rpa application for the selected activity from session storage + * @description Retrieves the rpa application for the selected activity from the session storage * @param {String} activityId Id of the currently selected activity * @returns The selected rpa application for the selected activity or undefined */ @@ -128,7 +128,7 @@ const getRpaApplication = (activityId) => { }; /** - * @description If there is more than one unused attribute object, delete it in the database + * @description Cheks if there is more than one unused attribute object, if so delete it in the database * @param {Array} attributes List of all attributes saved in the session storage * @param {Array} usedElementIds The activityIds that are still being used * @param {String} robotId The Id of the robot diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index 920d53f6..3b979bbd 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -62,14 +62,14 @@ const createParameterObject = ( }; /** - * @description Gets the parameter object session storage + * @description Retrieves the parameter object session storage * @returns {Array} Parameter session storage */ const getParameterStorage = () => JSON.parse(sessionStorage.getItem(PARAMETER_STORAGE_PATH)); /** - * @description Gets the parameter object for an activity from the session storage + * @description Retrieves the parameter object for an activity from the session storage * @param {String} activityId Id of the activity for which to get the parameter object for * @returns {Object} The parameter object for the activity */ @@ -83,7 +83,7 @@ const getParameterObjectForActivity = (activityId) => { }; /** - * @description Will check if the parameter object is filled correctly + * @description Checks if the parameter object is filled correctly * @param {String} parameterObject The parameter object for which to check if it is filled correctly * @param {String} rpaFunctionalitiesObject The rpa functionalities object (rpa-task) needed to check for correctness * @returns {Boolean} @@ -119,11 +119,11 @@ const checkIfParameterObjectCorrect = ( }; /** - * @description Gets the parameter object for the activity from the session storage and checks if the paramter object is correctly filled. + * @description Retrieves the parameter object for the activity from the session storage and checks if the paramter object is correctly filled. * If no paramter object for the activity exists but an attribute object then it will create a new parameter object and add it to the session storage. * If no parameter object and no attributes object exists for the activity it will return undefined. - * @param {String} robotId Id of the robot/ssot for which to retrieve the parameter object - * @param {String} activityId Id of the activity for which to retrieve the parameter object for + * @param {String} robotId Id of the robot/ssot for which the parameter object will be retrieved + * @param {String} activityId Id of the activity for which the parameter object will be retrieved * @returns {Object} The parameter object for the activity */ const getParameterObject = (robotId, activityId) => { @@ -166,7 +166,7 @@ const getParameterObject = (robotId, activityId) => { * @description Sets a single parameter value in the session storage * @param {String} activityId Id of the activity for which to change the parameter value for * @param {Object} value The value object returned by the dropdown selection cotaining the new parameter value - * @param {String} parameterName The name of the parameter to be changed + * @param {String} parameterName The name of the parameter that will be changed */ const setSingleParameter = (activityId, value, parameterName) => { const localParameterStorage = getParameterStorage(); @@ -201,8 +201,8 @@ const setSingleParameter = (activityId, value, parameterName) => { /** * @description Sets a property of a single parameter object in the session storage * @param {String} activityId Id of the activity for which to change a parameter property for - * @param {String} parameterName Name of the parameter we want to change a property for - * @param {String} property Name of the property we want to change + * @param {String} parameterName Name of the parameter of which a property will be changed + * @param {String} property Name of the property that will be changed * @param {Object} value The value object returned by the dropdown selection * @returns {Object} Updated parameter object */ @@ -236,11 +236,11 @@ const setPropertyForParameter = ( }; /** - * @description Retrieves the parameter session storage and returns the current value of the property we want to check + * @description Retrieves the parameter session storage and returns the current value of the property that will be checked * @param {string} robotId Id of the selected robot * @param {string} activityId Id of the selected activity - * @param {string} parameterName The name of the parameter for which we want to get an update on the status of a property - * @param {string} property The property of the parameters we want to get the current value of + * @param {string} parameterName The name of the parameter for which to get an update on the status of a property + * @param {string} property The property of the parameters to get the current value of * @returns {String} The value of the property of the parameter or undefined if the activity has no parameter objects */ const parameterPropertyStatus = ( @@ -264,7 +264,7 @@ const parameterPropertyStatus = ( /** * @description Sets the new value as the name of the output variable in the session storage - * @param {String} activityId Id of the activity for which to change the value of the output variable for + * @param {String} activityId Id of the activity for which the value of the output variable will be changed * @param {String} value The new value for the name of the output variable */ const setOutputValueName = (activityId, value) => { diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index c96712d9..4bd7b915 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -28,7 +28,7 @@ const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; /** - * @description Gets the robotId of the currently opened robot from the session storage + * @description Retrieves the robotId of the currently opened robot from the session storage * @returns Currently saved robotId */ const getRobotId = () => JSON.parse(sessionStorage.getItem(ROBOT_ID_PATH)); @@ -43,7 +43,7 @@ const setRobotId = (robotId) => { /** * @description Initializes the ssot in the session storage - * @param {String} robotId Id of the robot for which we want to initialize the ssot in the session storage + * @param {String} robotId Id of the robot for which the ssot in the session storage will be initialized */ const initSsotSessionStorage = (robotId) => { getSsot(robotId) diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 7f5f2a1a..6b712923 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -1,9 +1,9 @@ import { getAvailableApplications } from '../../api/routes/functionalities/functionalities'; /** - * @description Checks if passed item already exists in session storage and initializes with given value if not existing. - * @param {String} itemToCheckFor The selected item to check for in the session storage. - * @param {String} valueToInitTo The value to init to if the item is not existing in session storage yet. + * @description Checks if the passed item already exists in the session storage and initializes it with given value if not existing. + * @param {String} itemToCheckFor The selected item in the session storage that will be checked + * @param {String} valueToInitTo The value to initialize to if the item is not existing in session storage yet. */ const initSessionStorage = (itemToCheckFor, valueToInitTo) => { if (sessionStorage.getItem(itemToCheckFor) === null) From 6160ac813e4babb34dc87eb2b7f07594920b01ad Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 19 May 2021 12:06:39 +0200 Subject: [PATCH 065/149] fix robotId prop missing warning when creating a new robot --- frontend/src/components/pages/RobotOverview/RobotOverview.jsx | 2 ++ server/api/controllers/ssotRetrievalController.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index d69433a7..464555de 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -89,6 +89,7 @@ const RobotOverview = () => { createNewRobot(userId, robotName) .then((response) => response.json()) .then((newRobot) => { + console.log(newRobot); const newRobotList = [newRobot, ...robotList]; setRobotList([]); setRobotList(newRobotList); @@ -110,6 +111,7 @@ const RobotOverview = () => { .filter((val) => val.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) ); + console.log(filteredBotList); return ( <> diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index 4d24e436..e0544525 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -296,8 +296,8 @@ exports.createNewRobot = async (req, res) => { }); const returnObj = { + _id: ssot.id, robotName: nameWithEmptyspace, - robotId: ssot.id, }; res.send(returnObj); From 4a66654f26130938fb8306cfc2955a0a8944d03f Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 19 May 2021 12:11:54 +0200 Subject: [PATCH 066/149] fix tests --- server/api/routes/users/users.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index 23fb3284..3e74e896 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -100,7 +100,7 @@ describe('POST /users/{userId}/robots', () => { expect(response.statusCode).toBe(200); const data = await response._getData(); - const newRobotId = data.robotId; + const newRobotId = data._id; // verify if really in DB const request2 = httpMocks.createRequest({ From e343bb437ecf07f5e0b505404d9dc04b24c4f4ff Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 19 May 2021 12:12:08 +0200 Subject: [PATCH 067/149] polished docs backend --- .../rpaFrameworkCommandsController.js | 2 +- .../api/controllers/ssotParsingController.js | 2 +- .../controllers/ssotRetrievalController.js | 6 ++-- server/api/controllers/ssotRpaAttributes.js | 4 +-- .../api/controllers/ssotVariableController.js | 4 +-- server/socket/socketHelperFunctions.js | 28 +++++++++---------- .../ssotToRobotParsing/generateCodeBase.js | 6 ++-- .../generateCodeForRpaTasks.js | 18 ++++++------ .../ssotToRobotParsing/retrieveParameters.js | 18 ++++++------ .../ssotToRobotParsing/ssotToRobotParser.js | 12 ++++---- server/utils/testing/testDatabaseHandler.js | 6 ++-- 11 files changed, 53 insertions(+), 53 deletions(-) diff --git a/server/api/controllers/rpaFrameworkCommandsController.js b/server/api/controllers/rpaFrameworkCommandsController.js index 3e880849..b2293385 100644 --- a/server/api/controllers/rpaFrameworkCommandsController.js +++ b/server/api/controllers/rpaFrameworkCommandsController.js @@ -81,7 +81,7 @@ exports.getAvailableTasksForApplications = async (req, res) => { * get: * tags: * - RPA-Functionalities - * summary: Get all available Task and Application combinations with the input parameters and possible output values + * summary: Retrieve all available Task and Application combinations with the input parameters and possible output values * operationId: getFunctionalities * responses: * 200: diff --git a/server/api/controllers/ssotParsingController.js b/server/api/controllers/ssotParsingController.js index 6938da77..09ecae1f 100644 --- a/server/api/controllers/ssotParsingController.js +++ b/server/api/controllers/ssotParsingController.js @@ -13,7 +13,7 @@ const ssotToRobotparser = require('../../utils/ssotToRobotParsing/ssotToRobotPar * get: * tags: * - Robots - * summary: Get the robot framework code of a specific robot + * summary: Retrieve the robot framework code of a specific robot * operationId: getRobotCode * responses: * 200: diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index 4d24e436..42ec2f3a 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -17,7 +17,7 @@ const userAccessModels = require('../models/userAccessObjectModel.js'); * get: * tags: * - Robots - * summary: Get a robot with a specific id + * summary: Retrieve a robot with a specific id * operationId: getSpecificRobot * responses: * 200: @@ -52,7 +52,7 @@ exports.getSingleSourceOfTruth = async (req, res) => { * get: * tags: * - Users - * summary: Get all robots for a specific user + * summary: Retrieve all robots for a specific user * operationId: getRobotsForUser * responses: * 200: @@ -319,7 +319,7 @@ exports.createNewRobot = async (req, res) => { * put: * tags: * - Robots - * summary: Overwrite the existing robot with an updated one + * summary: Overwrite an existing robot with an updated one * operationId: overwriteRobot * requestBody: * content: diff --git a/server/api/controllers/ssotRpaAttributes.js b/server/api/controllers/ssotRpaAttributes.js index 1e276aa3..43e94b27 100644 --- a/server/api/controllers/ssotRpaAttributes.js +++ b/server/api/controllers/ssotRpaAttributes.js @@ -8,7 +8,7 @@ const ssotModels = require('../models/singleSourceOfTruthModel.js'); * put: * tags: * - Robots - * summary: Overwrite existing rpa attribute objects with updated one's + * summary: Overwrite existing rpa attribute objects with updated ones * operationId: overwriteAttributes * requestBody: * content: @@ -73,7 +73,7 @@ exports.updateMany = async (req, res) => { * get: * tags: * - Robots - * summary: Get all rpa attribute objects for a specific robot + * summary: Retrieve all rpa attribute objects for a specific robot * operationId: getAttributesForRobot * responses: * 200: diff --git a/server/api/controllers/ssotVariableController.js b/server/api/controllers/ssotVariableController.js index 93d4a9bf..d4ed46cd 100644 --- a/server/api/controllers/ssotVariableController.js +++ b/server/api/controllers/ssotVariableController.js @@ -10,7 +10,7 @@ const rpaModels = require('../models/rpaTaskModel'); * put: * tags: * - Robots - * summary: Overwrite existing parameter objects with updated one's + * summary: Overwrite existing parameter objects with updated ones * operationId: overwriteParameters * requestBody: * content: @@ -75,7 +75,7 @@ exports.updateMany = async (req, res) => { * get: * tags: * - Robots - * summary: Get all parameter objects for a specific robot + * summary: Retrieve all parameter objects for a specific robot * operationId: getParametersForRobot * responses: * 200: diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 84dff022..eecac3b1 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -10,8 +10,8 @@ mongoose.set('useFindAndModify', false); /** * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code - * @param {String} robotId the id of the robot we want the robot code for - * @param {String} jobId the id of the current job + * @param {String} robotId The id of the robot that the robot code will be fetched for + * @param {String} jobId The id of the current job */ exports.getRobotCodeForJob = async (robotId, jobId) => { try { @@ -24,7 +24,7 @@ exports.getRobotCodeForJob = async (robotId, jobId) => { /** * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code - * @param {String} robotId the id of the robot we want the robot code for + * @param {String} robotId The id of the robot that the robot code will be fetched for */ exports.getRobotCode = async (robotId) => { try { @@ -37,7 +37,7 @@ exports.getRobotCode = async (robotId) => { /** * @description Finds a specific robot job and retrieves the parameter array - * @param {String} jobId the id of the robot job that we want to get all the parameters from + * @param {String} jobId The id of the robot for which all parameters will be retrieved */ exports.getRobotJobParameters = async (jobId) => { const robotJobParameters = await mongoose @@ -51,7 +51,7 @@ exports.getRobotJobParameters = async (jobId) => { /** * @description Fetches the ssot from the database and parses the ssot to robot code - * @param {String} robotId the id of the robot we want the robot code for + * @param {String} robotId The id of the robot which will be parsed to robot code */ exports.getAllUserIds = async () => { try { @@ -68,10 +68,10 @@ exports.getAllUserIds = async () => { /** * @description Creates a Job in the database for a robot execution of a specific user - * @param {String} userId the id of the user that wants to execute a robot - * @param {String} robotId the id of the robot to be executed - * @param {String} status the current status of the job (either waiting, executing, successful or failed) - * @param {Array} parameters different parameters the user defined before executing the robot + * @param {String} userId The id of the user that wants to execute a robot + * @param {String} robotId The id of the robot tha will be executed + * @param {String} status The current status of the job (either waiting, executing, successful or failed) + * @param {Array} parameters Different parameters the user defined before executing the robot */ exports.createJob = async (userId, robotId, status, parameters) => { const job = new jobsModel.Job({ @@ -94,8 +94,8 @@ exports.createJob = async (userId, robotId, status, parameters) => { /** * @description Finds a specific job in the database and updates the status of the Job - * @param {String} jobId the id of the job that we want to update - * @param {String} status the current status of the job (either waiting, executing, success or failed) + * @param {String} jobId The id of the job that will be updated + * @param {String} status The current status of the job (either waiting, executing, success or failed) */ exports.updateRobotJobStatus = async (jobId, status) => { await jobsModel.Job.findByIdAndUpdate(jobId, { status }, (err) => { @@ -107,8 +107,8 @@ exports.updateRobotJobStatus = async (jobId, status) => { /** * @description Updates the given Job when the run has failed with the list of failing activities - * @param {String} jobId the id of the job that we want to update - * @param {Array} errorLog the list of logs of the robots activites + * @param {String} jobId The id of the job that will be updated + * @param {Array} errorLog The list of logs of the robots activites */ exports.updateRobotJobErrors = async (jobId, errorLog) => { const errors = errorLog.robot_run.activities @@ -131,7 +131,7 @@ exports.updateRobotJobErrors = async (jobId, errorLog) => { /** * @description Finds all jobs with status waiting in the database for a specific user - * @param {String} userId the id of the user we want all waiting jobs for + * @param {String} userId The id of the user for which all waiting jobs will be retrieved */ exports.getAllWaitingJobsForUser = async (userId) => { const jobList = await jobsModel.Job.find( diff --git a/server/utils/ssotToRobotParsing/generateCodeBase.js b/server/utils/ssotToRobotParsing/generateCodeBase.js index 5038137e..1fb45acd 100644 --- a/server/utils/ssotToRobotParsing/generateCodeBase.js +++ b/server/utils/ssotToRobotParsing/generateCodeBase.js @@ -50,8 +50,8 @@ const generateCodeForLibraryImports = (elements) => { }; /** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved + * @description Retrieve the associated parameter objects for all activities in the ssot + * @param {Object} ssot The ssot for which the parameters will be retrieved * @returns {Array} Array of attribute objects */ const retrieveAttributes = async (ssot) => { @@ -78,7 +78,7 @@ const retrieveAttributes = async (ssot) => { /** * @description Generates that basic code that every robot has - * @param {Object} ssot The ssot + * @param {Object} ssot The ssot that will be handled * @returns {string} Basic code for the .robot file */ const generateCodeBase = async (ssot) => { diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 9bf5064d..0786c597 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -13,15 +13,15 @@ const rpaModels = require('../../api/models/rpaTaskModel'); /** * @description Checks whether the given element is of type instruction and contains rpa attributes - * @param {Object} currentElement Element to check + * @param {Object} currentElement Element that will be checked * @returns {Boolean} Value specifies if object is of type instruction and contains rpa attributes */ const isAnRpaInstruction = (currentElement) => currentElement.type === ACTIVITY_IDENTIFIER; /** - * @description Will create a prefix to catch the output variable of an activity, if one is present - * @param {Object} paramObject The parameter object to check and loop through + * @description Creates a prefix to catch the output variable of an activity, if one is present + * @param {Object} paramObject The parameter object that will be checked and looped through * @returns {String} String specifying the output variables name */ const setOutputVar = (paramObject) => { @@ -34,8 +34,8 @@ const setOutputVar = (paramObject) => { }; /** - * @description Will append all provided parameters to a string which can be used to generate the RPAf file - * @param {Object} parameterObject The parameter object to check and loop through + * @description Appends all provided parameters to a string which can be used to generate the RPAf file + * @param {Object} parameterObject The parameter object that will be checked and looped through * @returns {String} String specifying the input parameters with the needed spacing in between */ const appendRpaInputParameter = (parameterObject) => { @@ -76,12 +76,12 @@ const successorTasksExist = (currentElement) => currentElement.successorIds[0] !== ''; /** - * @description Receives an array of all elements and generates the .robot code for the elements recursively. - * @param {String} id Id of the element we are looking for + * @description Generates the .robot code for the elements in the array of all elements recursively + * @param {String} id Id of the element that the code will be generated for * @param {Array} elements All the elements from the ssot * @param {Array} parameters All parameter objects of the robot * @param {Array} attributes All attribute objects of the robot - * @param {String} codeToAppend The current code we want to extend + * @param {String} codeToAppend The current code that will be extended * @returns {string} Generated .robot code for the tasks section */ const writeCodeForElement = ( @@ -140,7 +140,7 @@ const writeCodeForElement = ( }; /** - * @description Receives an array of all elements and generates the .robot code for all RPA Tasks + * @description Generates the .robot code for all RPA Tasks * @param {Array} elements All the elements from the SSoT * @param {Object} metaData MetaData of the robot * @returns {string} Generated .robot code for the tasks section diff --git a/server/utils/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js index 2e90220a..092da077 100644 --- a/server/utils/ssotToRobotParsing/retrieveParameters.js +++ b/server/utils/ssotToRobotParsing/retrieveParameters.js @@ -10,8 +10,8 @@ const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); const jobsModel = require('../../api/models/robotJobModel.js'); /** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved + * @description Will retrieve the associated parameter objects for all activities in the ssot + * @param {Object} ssot The ssot for which the parameters will be retrieved * @returns {Array} Array of parameter objects */ const retrieveParameters = async (ssot) => { @@ -44,9 +44,9 @@ const retrieveParameters = async (ssot) => { }; /** - * @description Update Parameter Objects with new parameters - * @param {Array} parameterObjects The selection of parameter objects this function will have a look at - * @param {Array} newParameters New parameters in the form {id, value} that the function will use to update the parameter objects + * @description Updates Parameter Objects with new parameters + * @param {Array} parameterObjects The selection of parameter objects that will possibly be updated + * @param {Array} newParameters New parameters in the form {id, value} that will be used to update the parameter objects */ const updateParameterObjects = (parameterObjects, newParameters) => { parameterObjects.map((parameterObject) => { @@ -70,7 +70,7 @@ const updateParameterObjects = (parameterObjects, newParameters) => { }; /** - * @description Retrieve all parameters for a specific job + * @description Retrieves all parameters for a specific job * @param {String} jobId The id of the job */ const getAllParametersForJob = async (jobId) => { @@ -81,9 +81,9 @@ const getAllParametersForJob = async (jobId) => { }; /** - * @description For all activities in the ssot this method will retrieve the associated parameter objects - * @param {Object} ssot The ssot for which the parameters should be retrieved - * @param {String} jobId The job id identifiyng a job object from which we want to fetch additional paramters + * @description Retrieves the associated parameter objects for all activities in the ssot + * @param {Object} ssot The ssot for which the parameters will be retrieved + * @param {String} jobId The job id identifiyng a job object from which the additional paramters will be fetched * @returns {Array} Array of parameter objects */ const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 4343b85b..68ef7591 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -33,7 +33,7 @@ const parseSsotToRobotCode = async (ssot) => { /** * @description Parses the given SSoT and parameters of the robot job to an executable .robot file - * @param {Object} ssot The SSoT + * @param {Object} ssot The Ssot * @param {Object} jobId The id of the job * @returns {string} Code that has to be put in .robot file */ @@ -50,8 +50,8 @@ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { }; /** - * @description Parses the SSoT provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which should be parsed + * @description Parses the Ssot provided by its id to an executable .robot file + * @param {String} robotId The id of the ssot which will be parsed * @returns {string} Code that has to be put in .robot file */ const parseSsotById = async (robotId) => { @@ -60,9 +60,9 @@ const parseSsotById = async (robotId) => { }; /** - * @description Parses the SSoT provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which should be parsed - * @param {String} jobId The id of the current robotJob that is to be executed + * @description Parses the Ssot provided by its id to an executable .robot file + * @param {String} robotId The id of the ssot which will be parsed + * @param {String} jobId The id of the current robotJob that will be executed * @returns {string} Code that has to be put in .robot file */ const parseCodeForJob = async (robotId, jobId) => { diff --git a/server/utils/testing/testDatabaseHandler.js b/server/utils/testing/testDatabaseHandler.js index d92de9e7..54ba4fe5 100644 --- a/server/utils/testing/testDatabaseHandler.js +++ b/server/utils/testing/testDatabaseHandler.js @@ -14,7 +14,7 @@ const mongod = new MongoMemoryServer({ }); /** - * Connect to the in-memory database. + * @description Connects to the in-memory database. */ exports.connect = async () => { const uri = await mongod.getUri(); @@ -23,7 +23,7 @@ exports.connect = async () => { }; /** - * Drop database, close the connection and stop mongod. + * @description Drops the database, closes the connection and stops mongod. */ exports.closeDatabase = async () => { await mongoose.connection.dropDatabase(); @@ -33,7 +33,7 @@ exports.closeDatabase = async () => { }; /** - * Remove all the data for all db collections. + * @description Removes all the data for all db collections. */ exports.clearDatabase = async () => { const { collections } = mongoose.connection; From 4112099deb46213e520019742faba8e9d0f169f2 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 19 May 2021 12:18:06 +0200 Subject: [PATCH 068/149] polish for better github pages look --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 1 + .../robotInteractionCockpitFunctionality.js | 6 +++--- .../src/utils/componentsFunctionality/notificationUtils.jsx | 5 +++++ frontend/src/utils/sessionStorage/sessionStorageUtils.js | 6 +++++- server/utils/testing/testDatabaseHandler.js | 4 ++++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 088e2377..745b95cd 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -9,6 +9,7 @@ const { Header } = Layout; /** * @component * @description Renders the header navbar for all pages and initially selects the passed key-element. + * @category Frontend * @example return */ const HeaderNavbar = (props) => { diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index dec75b55..b2c2bbf3 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -1,11 +1,11 @@ +import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameter'; +import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributes'; + /** * @category Frontend * @module */ -import { getAllParametersForRobot } from '../../../../api/routes/robots/rpaParameter'; -import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributes'; - /** * @description Will return a boolean regarding the correct configuration of the given parameterObejcts belonging to a robot. * If a paramter is required and no value is passed and the value will not be specified later by the user, the paramter is not correctly configured. diff --git a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx index ae96b8c0..cd0183d3 100644 --- a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx +++ b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx @@ -8,6 +8,11 @@ import { } from '@ant-design/icons'; import corporateDesign from '../../layout/corporateDesign'; +/** + * @category Frontend + * @module + */ + /** * @description Will first consider if a special icon is requested and otherwise return the corresponding icon for the notification type. * @param {String} type One from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 6b712923..246674d6 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -1,8 +1,12 @@ import { getAvailableApplications } from '../../api/routes/functionalities/functionalities'; +/** + * @category Frontend + * @module + */ /** * @description Checks if the passed item already exists in the session storage and initializes it with given value if not existing. - * @param {String} itemToCheckFor The selected item in the session storage that will be checked + * @param {String} itemToCheckFor The selected item in the session storage that will be checked * @param {String} valueToInitTo The value to initialize to if the item is not existing in session storage yet. */ const initSessionStorage = (itemToCheckFor, valueToInitTo) => { diff --git a/server/utils/testing/testDatabaseHandler.js b/server/utils/testing/testDatabaseHandler.js index 54ba4fe5..b4decd99 100644 --- a/server/utils/testing/testDatabaseHandler.js +++ b/server/utils/testing/testDatabaseHandler.js @@ -1,6 +1,10 @@ const mongoose = require('mongoose'); const { MongoMemoryServer } = require('mongodb-memory-server'); +/** + * @category Server + * @module + */ const mongooseOpts = { useNewUrlParser: true, useUnifiedTopology: true, From c82d106f4ea61fba91014b11193be3bf9b720162 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 19 May 2021 15:23:14 +0200 Subject: [PATCH 069/149] fix NaN is an invalid value warning --- frontend/src/components/pages/Home/Home.jsx | 2 +- frontend/src/components/pages/RobotOverview/RobotOverview.jsx | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/components/pages/Home/Home.jsx b/frontend/src/components/pages/Home/Home.jsx index fc759b71..f39e215d 100644 --- a/frontend/src/components/pages/Home/Home.jsx +++ b/frontend/src/components/pages/Home/Home.jsx @@ -18,7 +18,7 @@ const Home = () => {
{ createNewRobot(userId, robotName) .then((response) => response.json()) .then((newRobot) => { - console.log(newRobot); const newRobotList = [newRobot, ...robotList]; setRobotList([]); setRobotList(newRobotList); @@ -111,7 +110,6 @@ const RobotOverview = () => { .filter((val) => val.robotName.toUpperCase().includes(currentSearchValue.toUpperCase()) ); - console.log(filteredBotList); return ( <> From b203be67ee9bd645fa9fc3489a7b34f478dbd888 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 19 May 2021 16:21:58 +0200 Subject: [PATCH 070/149] fix warning callbacks will be deprecated --- .../RobotModeler/BpmnModeler/BpmnModeler.jsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx index 12c0b508..3eb36208 100644 --- a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx @@ -45,13 +45,15 @@ const BpmnModeler = (props) => { props.onModelerUpdate(newModeler); const openBpmnDiagram = (xml) => { - newModeler.importXML(xml, (error) => { - if (error) { - console.error('fail import xml'); - } - const canvas = newModeler.get('canvas'); - canvas.zoom('fit-viewport'); - }); + newModeler + .importXML(xml) + .then(() => { + const canvas = newModeler.get('canvas'); + canvas.zoom('fit-viewport'); + }) + .catch((error) => { + console.error('failed to import xml: ', error); + }); }; openBpmnDiagram(emptyBpmn); }, []); From 0dd8c29c41a73b924e6f564eb144d967fffe3b80 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 19 May 2021 17:44:28 +0200 Subject: [PATCH 071/149] fix several warnings regarding unique key in robot interaction cockpit and related components --- .../RobotInteractionExecutionSection.jsx | 4 +++- .../subComponents/RobotLogEntryCard.jsx | 10 ++++++---- .../RobotInteractionInputSection.jsx | 12 +++++++----- .../subComponents/RobotInteractionParameterInput.jsx | 6 +++++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 759e4735..c9d43654 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -91,8 +91,10 @@ const RobotInteractionExecutionSection = (props) => { Robot Run Logs {executionLogs.robot_run && - executionLogs.robot_run.activities.map((log) => ( + executionLogs.robot_run.activities.map((log, index) => ( diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx index 511ab3f3..c6ab860d 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx @@ -9,7 +9,7 @@ const RobotLogCard = (props) => { return ( { {log.message &&

Error Message: {log.message}

} {log.tasks && - log.tasks.map((task) => ( - + log.tasks.map((task, index) => ( + // eslint-disable-next-line react/no-array-index-key +

Task: {task.task_name}

@@ -43,5 +44,6 @@ export default RobotLogCard; RobotLogCard.propTypes = { displayStatusIcon: PropTypes.func.isRequired, - log: PropTypes.arrayOf(Object).isRequired, + log: PropTypes.oneOfType([PropTypes.arrayOf(Object), PropTypes.any]) + .isRequired, }; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx index 499e07ef..5e1a46e5 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/RobotInteractionInputSection.jsx @@ -1,6 +1,8 @@ +/* eslint-disable react/no-array-index-key */ +/* eslint-disable no-underscore-dangle */ import React from 'react'; import PropTypes from 'prop-types'; -import { Typography, Space } from 'antd'; +import { Card, Typography, Space } from 'antd'; import RobotInteractionInputParameter from './subComponents/RobotInteractionParameterInput'; const { Title } = Typography; @@ -15,25 +17,25 @@ const RobotInteractionInputSection = ({ updateParameterValue, }) => ( - {parameterList.map((activityInformation) => { + {parameterList.map((activityInformation, index) => { if (activityInformation.activityParameter.length > 0) { return ( - <> + Activity: {activityInformation.activityName} {activityInformation.activityParameter.map((params) => ( ))} - + ); } return
; diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx index ebf48562..6c2b4289 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionInputSection/subComponents/RobotInteractionParameterInput.jsx @@ -40,9 +40,13 @@ const RobotInteractionInputParameter = ({ RobotInteractionInputParameter.propTypes = { variableName: PropTypes.string.isRequired, dataType: PropTypes.string.isRequired, - infoText: PropTypes.string.isRequired, + infoText: PropTypes.string, updateParameterValue: PropTypes.func.isRequired, parameterId: PropTypes.string.isRequired, }; +RobotInteractionInputParameter.defaultProps = { + infoText: undefined, +}; + export default RobotInteractionInputParameter; From 612d3a6fac7e84c536a1934730a41d164402e52f Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 25 May 2021 10:04:57 +0200 Subject: [PATCH 072/149] reimplement availableApplications localStorage --- .../pages/RobotCodeEditor/RobotCodeEditor.jsx | 3 -- .../pages/RobotModeler/RobotModeler.jsx | 17 +---------- .../pages/RobotOverview/RobotOverview.jsx | 20 +++++++++++-- .../robotCodeToSsotParsing.js | 2 +- .../robotCodeToSsotParsing.test.js | 2 +- .../functionalities.js | 2 +- .../localSsotController/ssot.js | 2 +- .../sessionStorage/sessionStorageUtils.js | 28 ++++++++++--------- 8 files changed, 37 insertions(+), 39 deletions(-) diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index f75d264f..559eb0ac 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -4,7 +4,6 @@ import { highlight, languages } from 'prismjs/components/prism-core'; import Editor from 'react-simple-code-editor'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import { getParsedRobotFile } from '../../../api/routes/robots/robots'; -import { initAvailableApplicationsSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; import { upsert } from '../../../utils/sessionStorage/localSsotController/ssot'; import 'prismjs/components/prism-robotframework'; @@ -37,8 +36,6 @@ const RobotFile = () => { * @description Equivalent to ComponentDidMount in class based components */ useEffect(() => { - initAvailableApplicationsSessionStorage(); - const robotId = JSON.parse(sessionStorage.getItem('robotId')); getParsedRobotFile(robotId) .then((response) => response.text()) diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 5c0bac64..70f42639 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -6,12 +6,8 @@ import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/routes/robots/robots'; import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameter'; import { getAllAttributes } from '../../../api/routes/robots/rpaAttributes'; -import { getAllRpaFunctionalities } from '../../../api/routes/functionalities/functionalities'; import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; -import { - initAvailableApplicationsSessionStorage, - initSessionStorage, -} from '../../../utils/sessionStorage/sessionStorageUtils'; +import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import 'bpmn-js/dist/assets/diagram-js.css'; import 'bpmn-font/dist/css/bpmn-embedded.css'; @@ -54,16 +50,6 @@ const Modeler = (match) => { sessionStorage.setItem('attributeLocalStorage', JSON.stringify(data)); }); - getAllRpaFunctionalities(robotId) - .then((response) => response.json()) - .then((data) => { - initSessionStorage('TaskApplicationCombinations', JSON.stringify([])); - sessionStorage.setItem( - 'TaskApplicationCombinations', - JSON.stringify(data) - ); - }); - getAllParametersForRobot(robotId) .then((response) => response.json()) .then((data) => { @@ -71,7 +57,6 @@ const Modeler = (match) => { sessionStorage.setItem('parameterLocalStorage', JSON.stringify(data)); }); initSessionStorage('taskToApplicationCache', JSON.stringify({})); - initAvailableApplicationsSessionStorage(); }, []); return ( diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 2364a345..31003ae5 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -9,11 +9,15 @@ import { newClientJoined, } from '../../../api/socketHandler/socketListeners'; import CreateRobotContainer from './RobotContainer/CreateRobotContainer'; -import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; +import { + initSessionStorage, + initAvailableApplicationsSessionStorage, +} from '../../../utils/sessionStorage/sessionStorageUtils'; import { fetchSsotsForUser, createNewRobot, } from '../../../api/routes/users/users'; +import { getAllRpaFunctionalities } from '../../../api/routes/functionalities/functionalities'; const { Search } = Input; const { Option } = Select; @@ -48,8 +52,18 @@ const RobotOverview = () => { * @description Equivalent to ComponentDidMount in class based components */ useEffect(() => { - initSessionStorage('CurrentUserId', '80625d115100a2ee8d8e695b'); + initSessionStorage('currentUserId', '80625d115100a2ee8d8e695b'); retrieveBotList(userId); + getAllRpaFunctionalities() + .then((response) => response.json()) + .then((data) => { + initSessionStorage('taskApplicationCombinations', JSON.stringify([])); + sessionStorage.setItem( + 'taskApplicationCombinations', + JSON.stringify(data) + ); + initAvailableApplicationsSessionStorage(); + }); }, []); /** @@ -67,7 +81,7 @@ const RobotOverview = () => { * @param {Integer} value the value of the number input field used for setting the user id */ const changeUserId = (value) => { - sessionStorage.setItem('CurrentUserId', value); + sessionStorage.setItem('currentUserId', value); retrieveBotList(value); setUserId(value); }; diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index e792e11d..79cbf105 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -435,7 +435,7 @@ const getElementsArray = ( return undefined; let taskAndApplicationCombinations = JSON.parse( - sessionStorage.getItem('TaskApplicationCombinations') + sessionStorage.getItem('taskApplicationCombinations') ); taskAndApplicationCombinations = taskAndApplicationCombinations.filter( (singleCombination) => diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index d6037a86..5615c566 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -22,7 +22,7 @@ sessionStorage.setItem( '["Excel.Application","Excel.Files","HTTP","Testing"]' ); sessionStorage.setItem( - 'TaskApplicationCombinations', + 'taskApplicationCombinations', JSON.stringify(taskAndApplicationCombinations) ); diff --git a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js index 7988a3db..562c94f8 100644 --- a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js +++ b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js @@ -3,7 +3,7 @@ * @module */ -const FUNCTIONALITIES_STORAGE_PATH = 'TaskApplicationCombinations'; +const FUNCTIONALITIES_STORAGE_PATH = 'taskApplicationCombinations'; /** * @description Will get the rpa functionalities object for a specific rpa application and rpa task combination diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index c96712d9..41cfc2de 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -69,7 +69,7 @@ const initSsotSessionStorage = (robotId) => { .then((response) => response.json()) .then((data) => { sessionStorage.setItem( - 'TaskApplicationCombinations', + 'taskApplicationCombinations', JSON.stringify(data) ); }) diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 7f5f2a1a..a37f066e 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -1,5 +1,3 @@ -import { getAvailableApplications } from '../../api/routes/functionalities/functionalities'; - /** * @description Checks if passed item already exists in session storage and initializes with given value if not existing. * @param {String} itemToCheckFor The selected item to check for in the session storage. @@ -12,17 +10,21 @@ const initSessionStorage = (itemToCheckFor, valueToInitTo) => { const initAvailableApplicationsSessionStorage = () => { initSessionStorage('availableApplications', JSON.stringify([])); - let applicationList = sessionStorage.getItem('availableApplications'); - applicationList = JSON.parse(applicationList); - if (applicationList && applicationList.length < 1) - getAvailableApplications() - .then((response) => response.json()) - .then((data) => { - sessionStorage.setItem('availableApplications', JSON.stringify(data)); - }) - .catch((error) => { - console.error(error); - }); + const taskAndApplicationCombinations = JSON.parse( + sessionStorage.getItem('taskApplicationCombinations') + ); + const allApplications = taskAndApplicationCombinations.map( + (singleCombination) => singleCombination.Application + ); + const applicationsWithoutDuplicates = allApplications.filter( + (singleApplication, index, self) => + self.indexOf(singleApplication) === index + ); + + sessionStorage.setItem( + 'availableApplications', + JSON.stringify(applicationsWithoutDuplicates) + ); }; export { initAvailableApplicationsSessionStorage, initSessionStorage }; From 558bb206219822b30ed8862b01a4613752d2fb84 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 15:19:46 +0200 Subject: [PATCH 073/149] renamed workflows --- .github/workflows/{heroku_deploy.yml => herokuDeploy.yml} | 0 .github/workflows/{linter frontend.yml => linterFrontend.yml} | 0 .github/workflows/{linter server.yml => linterServer.yml} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{heroku_deploy.yml => herokuDeploy.yml} (100%) rename .github/workflows/{linter frontend.yml => linterFrontend.yml} (100%) rename .github/workflows/{linter server.yml => linterServer.yml} (100%) diff --git a/.github/workflows/heroku_deploy.yml b/.github/workflows/herokuDeploy.yml similarity index 100% rename from .github/workflows/heroku_deploy.yml rename to .github/workflows/herokuDeploy.yml diff --git a/.github/workflows/linter frontend.yml b/.github/workflows/linterFrontend.yml similarity index 100% rename from .github/workflows/linter frontend.yml rename to .github/workflows/linterFrontend.yml diff --git a/.github/workflows/linter server.yml b/.github/workflows/linterServer.yml similarity index 100% rename from .github/workflows/linter server.yml rename to .github/workflows/linterServer.yml From 8b82d849eaa7c2adba9989656333f694cb4c67de Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 15:24:32 +0200 Subject: [PATCH 074/149] adapted wiki titles --- wiki/Documentation-Folder-structure.md | 88 +- wiki/Documentation-single-source-of-truth.md | 1152 +++++++++--------- wiki/How-to-style-using-CSS.md | 830 ++++++------- wiki/How-to-write-code-documentation.md | 174 +-- wiki/How-to-write-tests.md | 272 ++--- wiki/Team-Scrum-process.md | 146 +-- 6 files changed, 1331 insertions(+), 1331 deletions(-) diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-structure.md index a7f95e46..1b9d1cdc 100644 --- a/wiki/Documentation-Folder-structure.md +++ b/wiki/Documentation-Folder-structure.md @@ -1,44 +1,44 @@ -# General - -There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: - -- A **frontend/** folder with its own package.json. There you can find everything regarding the React frontend. -- A **server/** folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. -- A **wiki/** folder which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. -- A **.github/** folder which contains all workflows, our issue & pull request templates as well as some notes for the open source project. - -The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). - -## Server - -The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). -The central file here is the **server.js**. Here all the different routers are being used. - -- **api/**: Contains the routes, models and controllers of our API. -- **socket/**: Contains the socket manager who provides the socket rooms for communication -- **utils/**: Helper functions or files like the SsotToRobotParser, the openApiDocumentation or some testing files - -## Frontend - -On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. -The **public/** folder contains the known meta information of a web page, as well as the favicon. -Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: - -- **api/**: API call related functions. -- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. - Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. - In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. -- **layout/**: Contains our corporate design and customized theme. -- **resources/**: Contains images, fonts and other static files. -- **utils/**: Contains the following subfolders: - - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - - **sessionStorage/**: Contains all the helper files we need to interact with the session storage - - **socket/**: Contains the socket connection file - -# Naming conventions - -- All components are saved as .jsx files (including index.jsx and App.jsx) -- All non-component JavaScript files are saved as .js -- Component names are written in _PascalCase_ -- Non-component JavaScript files are written in _camelCase_ -- The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. +# General + +There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: + +- A **frontend/** folder with its own package.json. There you can find everything regarding the React frontend. +- A **server/** folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. +- A **wiki/** folder which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. +- A **.github/** folder which contains all workflows, our issue & pull request templates as well as some notes for the open source project. + +The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). + +## Server + +The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). +The central file here is the **server.js**. Here all the different routers are being used. + +- **api/**: Contains the routes, models and controllers of our API. +- **socket/**: Contains the socket manager who provides the socket rooms for communication +- **utils/**: Helper functions or files like the SsotToRobotParser, the openApiDocumentation or some testing files + +## Frontend + +On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. +The **public/** folder contains the known meta information of a web page, as well as the favicon. +Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: + +- **api/**: API call related functions. +- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. + Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. + In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. +- **layout/**: Contains our corporate design and customized theme. +- **resources/**: Contains images, fonts and other static files. +- **utils/**: Contains the following subfolders: + - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests + - **sessionStorage/**: Contains all the helper files we need to interact with the session storage + - **socket/**: Contains the socket connection file + +# Naming conventions + +- All components are saved as .jsx files (including index.jsx and App.jsx) +- All non-component JavaScript files are saved as .js +- Component names are written in _PascalCase_ +- Non-component JavaScript files are written in _camelCase_ +- The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-single-source-of-truth.md index dea7251f..05a9ac92 100644 --- a/wiki/Documentation-single-source-of-truth.md +++ b/wiki/Documentation-single-source-of-truth.md @@ -1,576 +1,576 @@ -# Single Source of Truth - -## What do we need a SSoT for? - -The goal of Ark_automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. -The user selects the modeling language he/she prefers and starts modeling the behavior of the robot (at least for now the user has to pre-select the modeling language). At the same time, the user can view/change the .robot code of the bot and/or update attributes via the property panel. -To achieve that we need a single-source-of-truth(SSoT) for each robot. In the SSoT all necessary information is saved so that changes can be automatically applied to every interface. - -### Which frontends do we want to support? - -- definitely have to be implemented: BPMN editor, robot framework code editor -- optional (planned) are: Google BLOCKLY -- in the long run we are open for other modelling languages - -(_We want to support all modelling languages that can be rendered into an edge and node model_) - -Observation: All frontends that represent "executable program code" can be represented as a graph. - -### Analysis: What can Robot Framework support? - -- Linear flow (sequences) -- Branching -- Loops (For+While) - **Does not support** try-catch constructs - -## How is the SSoT going to be included in the product? - -The SSoT itself will be stored on the server-side of the product. It will support multiple use cases shown in the following image: -![SSoT in product](https://i.imgur.com/jViSHTQ.png) -With a change of one of the interfaces on the frontend-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. - -### We have agreed on the following - -- **Saving the SSoT** - the local SSOT is pushed into the DB in certain time intervals (or trigger like "change tab") - the SSoT stores only the logic behind the modeling interfaces - (the visual representation is "rendered" from the graph) -- Only those features of the modelling languages are allowed that **are supported by Robot Framework**. - Parallelism is not supported - No gateways other than an XOR split are recorded in the SSOT. - ( => non-interrupting events are not supported) - Exception handling is not supported - (=> therefore we do not support intermediate events in BPMN) -- **Front-end rendering** - - requires extensive programming - - may cause the programmer to see his model differently from the way he saved it - - Hard-coded values required for frontend rendering are stored in a `config.json` - -### FAQ: - -1. **Do we store information about each model in the SSoT or do we "render" each model from the SSoT without having specific model information stored in the SSoT?** - 1. we render each model from our "logical graph". - 2. no modelling-interface-specific values are therefore stored. - 3. missing attributes needed to create a modelling visualisation have to be assumed or calculated with default values -2. **Do we use the XML as SSOT?** - No, we render the models from the SSOT. For e.g. BPMN we render SSOT to XML to BPMN. -3. **How do we store the edges from BPMN?** - Implicitly through the successor/predecessor relationships. The exact waypoints have to be "calculated" -4. **What are the consequences of not saving modelling attributes for our project? (BPMN specific)** - exact arrangement in the interface is not maintained; - however: support for adherence to the standard (automatic pretty print) - Logic for updating SSoT after deleting (and adding) is needed. - Config files with sizes, colours, symbols etc. are needed for each modelling interface - -## Concept for applying the SSoT - -**Note: SSoT should be closer to basic programming constructs than to a BPMN model. -Therefore: All interfaces are rendered into a graph model where the nodes are defined by the following tags: 'INSTRUCTION', 'BRANCH', 'CASE' and 'MARKER'. These tags represent the basic programming constructs that can also be used in the **Robot Framework\*\*. - -### Overview - -| SSoT tag | BPMN representation | Code representation | ArkA 0.3 | ArkA 1.0 | -| :---------: | :----------------------------: | :------------------: | :----------------: | :----------------: | -| INSTRUCTION | Activity | "one line of code" | :heavy_check_mark: | :heavy_check_mark: | -| CASE | XOR-Gateway | Branching (IF, CASE) | :x: | :heavy_check_mark: | -| LOOP | XOR-Split & Join (Combination) | Loop (FOR, WHILE) | :x: | :heavy_check_mark: | -| MARKER | Start & End Event | - | :heavy_check_mark: | :heavy_check_mark: | -| _EXCEPTION_ | _intermediate Event_ | _TRY-CATCH_ | :x: | :x: | - -**Special features for events:** -**Timers:** In the long term, timers are to be represented in BPMN as intermediate events. At the moment, a "sleep event" (to pause execution) is to be defined as an instruction with an RPA action as an example. - -**Event types:** are not stored. Events therefore always appear as "empty circles". They are also not linkable with logic. For example, if an end event is to send a mail, please model this construct as 'Activity: Send Mail' and 'End Event'. -No intermediate events are currently supported. - -### Overview SSOT hierarchy - -![](https://i.imgur.com/7yOqDZv.png) - -### Component: HEADER - -User information about a robot (creator, released for etc.) is stored in an additional file in the database. - -**SSoT** - -```json -{ - "_id": "6045eccfa9a07940e5763f0b", - "starterId": "exampleID", - "robotName": "exampleRobot", - "elements": [ - { - /* Here start the nodes of the graph */ - } - ] -} -``` - -### Element: INSTRUCTION - -**SSoT** - -```json -{ - "type": "INSTRUCTION", - "name": "exampleName", - "id": "exampleId", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"], - "rpaApplication": "e.g. Excel.Files", - "rpaTask": "e.g. Open Workbook" -} -``` - -**parameter object extending the INSTRUCTION:** - -```json -{ - "robotId": "604f537ed699a2eb47274184", - "activityId": "Activity_47II", - "outputValue": "exampleId", - "rpaParameters": [ - { - "name": "Filename", - "type": "Boolean", - "value": "", - "requireUserInput": true, - "infoText": "The name of the file", - "isRequired": true, - "index": 0 - }, - { - "name": "Path", - "value": "C:/RPA-folder/", - "type": "Boolean", - "requireUserInput": false, - "infoText": "The path where the file is located on the machine", - "isRequired": true, - "index": 1 - } - ] -} -``` - -**attribute object extending the INSTRUCTION:** - -```json -{ - "robotId": "604f537ed699a2eb47274184", - "activityId": "Activity_47II", - "rpaApplication": "Excel.Files", - "rpaTask": "Open Workbook" -} -``` - -**BPMN requires:** - -- id :heavy_check_mark: -- label -> name :heavy_check_mark: -- predecessor :heavy_check_mark: -- successor :heavy_check_mark: -- ~~position~~ -> calculated :heavy_check_mark: -- ~~size~~ -> `config.json` :heavy_check_mark: -- _RPA-Task & Application & Parameters_ :heavy_check_mark: - -By using separate external objects we allow for a more consistent updating of the ssot, since it is only required to carry the information about the name of single elements, as well as their predecessors and successors. -Splitting the required information again into parameter and attributes has benefits when working with only one of the both in situations where many of those objects are needed, but only the attribute or parameter information is needed at that point. - -### Element: CASE - -**SSoT stores** - -- predecessor node, Successor node -- name, ID -- default successor node -- conditions (for each successor node) = IF condition - -```json -{ - "type": "CASE", - "name": "", - "id": "exampleId", - "predecessorIds": ["randomId3"], - "successorIds": ["randomId", "randomId2, randomId3"], - "default_successorIds": "randomId", - "conditions": { - "X+1==3": "randomID", - "X-1==3": "randomID2" - } -} -``` - -**BPMN requires** - -- predecessor node :heavy_check_mark: -- successor node :heavy_check_mark: -- label (name) :heavy_check_mark: -- default successor node :heavy_check_mark: -- conditions (texts at the Path to each successor node) :heavy_check_mark: - -### Element: LOOP - -**SSoT stores** - -- id, text (label) -- predecessor and successor nodes of the loop -- loop termination condition -- predecessor node of the loop body end -- successor node of the loop body start - -```json -{ - "type": "LOOP", - "id": "exampleId", - "loop_condition": "X > 5", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"], - "loop_body_predecessorIds": ["randomId"], - "loop_body_successorIds": ["randomId"] -} -``` - -### Element: MARKER - -**SSoT stores** - -- id, text (label) -- predecessor node -- successor node - -```json -{ - "type": "MARKER", - "id": "exampleId", - "name": "Wait 5 seconds", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"] -} -``` - -**BPMN requires** - -- label :heavy_check_mark: -- event type1: Start, End :heavy_check_mark: - - start = Event without incoming edge - - end = Event without outgoing edge -- event type2: timer event, message event etc. :thought_balloon: - - all events are always rendered as "neutral events" (empty circle). - ---- - -## Example parsing from BPMN xml to SSOT - -Modelled process -![](https://i.imgur.com/rMsmw1g.png) - - - - - - - - - - -
BPMN Json SSOT
- -```json -{ - "_declaration": { - "_attributes": { - "version": "1.0", - "encoding": "UTF-8" - } - }, - "bpmn2:definitions": { - "_attributes": { - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "xmlns:bpmn2": "http://www.omg.org/spec/BPMN/20100524/MODEL", - "xmlns:bpmndi": "http://www.omg.org/spec/BPMN/20100524/DI", - "xmlns:dc": "http://www.omg.org/spec/DD/20100524/DC", - "xmlns:arkRPA": "http://magic", - "xmlns:di": "http://www.omg.org/spec/DD/20100524/DI", - "id": "sample-diagram", - "targetNamespace": "http://bpmn.io/schema/bpmn", - "xsi:schemaLocation": "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" - }, - "bpmn2:collaboration": { - "_attributes": { - "id": "Collaboration_0czsqyr" - }, - "bpmn2:participant": { - "_attributes": { - "id": "Participant_0cyhvx8", - "processRef": "Process_1" - } - } - }, - "bpmn2:process": { - "_attributes": { - "id": "Process_1", - "isExecutable": "false" - }, - "bpmn2:task": [ - { - "_attributes": { - "id": "Activity_0a128t6", - "name": "#+# First activity" - }, - "bpmn2:incoming": { - "_text": "Flow_1bewk1i" - }, - "bpmn2:outgoing": { - "_text": "Flow_0sg07kn" - } - }, - { - "_attributes": { - "id": "Activity_0ascvdr", - "name": "#+#+# RPA Activity" - }, - "bpmn2:incoming": { - "_text": "Flow_0sg07kn" - }, - "bpmn2:outgoing": { - "_text": "Flow_1hwcghk" - } - } - ], - "bpmn2:sequenceFlow": [ - { - "_attributes": { - "id": "Flow_1bewk1i", - "sourceRef": "StartEvent_1", - "targetRef": "Activity_0a128t6" - } - }, - { - "_attributes": { - "id": "Flow_0sg07kn", - "sourceRef": "Activity_0a128t6", - "targetRef": "Activity_0ascvdr" - } - }, - { - "_attributes": { - "id": "Flow_1hwcghk", - "sourceRef": "Activity_0ascvdr", - "targetRef": "Event_0wghmrz" - } - } - ], - "bpmn2:endEvent": { - "_attributes": { - "id": "Event_0wghmrz" - }, - "bpmn2:incoming": { - "_text": "Flow_1hwcghk" - } - }, - "bpmn2:startEvent": { - "_attributes": { - "id": "StartEvent_1" - }, - "bpmn2:outgoing": { - "_text": "Flow_1bewk1i" - } - } - }, - "bpmndi:BPMNDiagram": { - "_attributes": { - "id": "BPMNDiagram_1" - }, - "bpmndi:BPMNPlane": { - "_attributes": { - "id": "BPMNPlane_1", - "bpmnElement": "Collaboration_0czsqyr" - }, - "bpmndi:BPMNShape": [ - { - "_attributes": { - "id": "Participant_0cyhvx8_di", - "bpmnElement": "Participant_0cyhvx8", - "isHorizontal": "true" - }, - "dc:Bounds": { - "_attributes": { - "x": "130", - "y": "220", - "width": "710", - "height": "250" - } - } - }, - { - "_attributes": { - "id": "Activity_0a128t6_di", - "bpmnElement": "Activity_0a128t6" - }, - "dc:Bounds": { - "_attributes": { - "x": "340", - "y": "280", - "width": "100", - "height": "80" - } - } - }, - { - "_attributes": { - "id": "Activity_0ascvdr_di", - "bpmnElement": "Activity_0ascvdr" - }, - "dc:Bounds": { - "_attributes": { - "x": "500", - "y": "280", - "width": "100", - "height": "80" - } - } - }, - { - "_attributes": { - "id": "Event_0wghmrz_di", - "bpmnElement": "Event_0wghmrz" - }, - "dc:Bounds": { - "_attributes": { - "x": "662", - "y": "392", - "width": "36", - "height": "36" - } - } - }, - { - "_attributes": { - "id": "_BPMNShape_StartEvent_2", - "bpmnElement": "StartEvent_1" - }, - "dc:Bounds": { - "_attributes": { - "x": "212", - "y": "302", - "width": "36", - "height": "36" - } - } - } - ], - "bpmndi:BPMNEdge": [ - { - "_attributes": { - "id": "Flow_1bewk1i_di", - "bpmnElement": "Flow_1bewk1i" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "248", - "y": "320" - } - }, - { - "_attributes": { - "x": "340", - "y": "320" - } - } - ] - }, - { - "_attributes": { - "id": "Flow_0sg07kn_di", - "bpmnElement": "Flow_0sg07kn" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "440", - "y": "320" - } - }, - { - "_attributes": { - "x": "500", - "y": "320" - } - } - ] - }, - { - "_attributes": { - "id": "Flow_1hwcghk_di", - "bpmnElement": "Flow_1hwcghk" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "600", - "y": "320" - } - }, - { - "_attributes": { - "x": "631", - "y": "320" - } - }, - { - "_attributes": { - "x": "631", - "y": "410" - } - }, - { - "_attributes": { - "x": "662", - "y": "410" - } - } - ] - } - ] - } - } - } -} -``` - - - -```json - "_id": "6045eccfa9a07940e5763f0b", - "starterId": "exampleID", - "robotName": "exampleRobot", - "elements": [ - { - "type": "MARKER", - "name": "", - "id": "StartEvent_1", - "predecessorIds": [], - "successorIds": ["Activity_0a128t6"], - }, - // first activity - { - "type": "INSTRUCTION", - "name": "#+# First activity", - "id": "Activity_0a128t6", - "predecessorIds": ["StartEvent_1"], - "successorIds": ["Activity_0ascvdr"] - }, - // second activity - { - "type": "INSTRUCTION", - "name": "#+#+# RPA Activity", - "id": "Activity_0ascvdr", - "predecessorIds": ["Activity_0a128t6"], - "successorIds": ["Event_0wghmrz"] - }, - // Endevent - { - "type": "MARKER", - "name": "", - "id": "Event_0wghmrz", - "predecessorIds": ["Activity_0a128t6"], - "successorIds": [], - } - ] -} -``` - -
+# Single Source of Truth + +## What do we need a SSoT for? + +The goal of Ark_automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. +The user selects the modeling language he/she prefers and starts modeling the behavior of the robot (at least for now the user has to pre-select the modeling language). At the same time, the user can view/change the .robot code of the bot and/or update attributes via the property panel. +To achieve that we need a single-source-of-truth(SSoT) for each robot. In the SSoT all necessary information is saved so that changes can be automatically applied to every interface. + +### Which frontends do we want to support? + +- definitely have to be implemented: BPMN editor, robot framework code editor +- optional (planned) are: Google BLOCKLY +- in the long run we are open for other modelling languages + +(_We want to support all modelling languages that can be rendered into an edge and node model_) + +Observation: All frontends that represent "executable program code" can be represented as a graph. + +### Analysis: What can Robot Framework support? + +- Linear flow (sequences) +- Branching +- Loops (For+While) + **Does not support** try-catch constructs + +## How is the SSoT going to be included in the product? + +The SSoT itself will be stored on the server-side of the product. It will support multiple use cases shown in the following image: +![SSoT in product](https://i.imgur.com/jViSHTQ.png) +With a change of one of the interfaces on the frontend-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. + +### We have agreed on the following + +- **Saving the SSoT** - the local SSOT is pushed into the DB in certain time intervals (or trigger like "change tab") - the SSoT stores only the logic behind the modeling interfaces + (the visual representation is "rendered" from the graph) +- Only those features of the modelling languages are allowed that **are supported by Robot Framework**. - Parallelism is not supported - No gateways other than an XOR split are recorded in the SSOT. + ( => non-interrupting events are not supported) - Exception handling is not supported + (=> therefore we do not support intermediate events in BPMN) +- **Front-end rendering** + - requires extensive programming + - may cause the programmer to see his model differently from the way he saved it + - Hard-coded values required for frontend rendering are stored in a `config.json` + +### FAQ: + +1. **Do we store information about each model in the SSoT or do we "render" each model from the SSoT without having specific model information stored in the SSoT?** + 1. we render each model from our "logical graph". + 2. no modelling-interface-specific values are therefore stored. + 3. missing attributes needed to create a modelling visualisation have to be assumed or calculated with default values +2. **Do we use the XML as SSOT?** + No, we render the models from the SSOT. For e.g. BPMN we render SSOT to XML to BPMN. +3. **How do we store the edges from BPMN?** + Implicitly through the successor/predecessor relationships. The exact waypoints have to be "calculated" +4. **What are the consequences of not saving modelling attributes for our project? (BPMN specific)** - exact arrangement in the interface is not maintained; + however: support for adherence to the standard (automatic pretty print) - Logic for updating SSoT after deleting (and adding) is needed. - Config files with sizes, colours, symbols etc. are needed for each modelling interface + +## Concept for applying the SSoT + +**Note: SSoT should be closer to basic programming constructs than to a BPMN model. +Therefore: All interfaces are rendered into a graph model where the nodes are defined by the following tags: 'INSTRUCTION', 'BRANCH', 'CASE' and 'MARKER'. These tags represent the basic programming constructs that can also be used in the **Robot Framework\*\*. + +### Overview + +| SSoT tag | BPMN representation | Code representation | ArkA 0.3 | ArkA 1.0 | +| :---------: | :----------------------------: | :------------------: | :----------------: | :----------------: | +| INSTRUCTION | Activity | "one line of code" | :heavy_check_mark: | :heavy_check_mark: | +| CASE | XOR-Gateway | Branching (IF, CASE) | :x: | :heavy_check_mark: | +| LOOP | XOR-Split & Join (Combination) | Loop (FOR, WHILE) | :x: | :heavy_check_mark: | +| MARKER | Start & End Event | - | :heavy_check_mark: | :heavy_check_mark: | +| _EXCEPTION_ | _intermediate Event_ | _TRY-CATCH_ | :x: | :x: | + +**Special features for events:** +**Timers:** In the long term, timers are to be represented in BPMN as intermediate events. At the moment, a "sleep event" (to pause execution) is to be defined as an instruction with an RPA action as an example. + +**Event types:** are not stored. Events therefore always appear as "empty circles". They are also not linkable with logic. For example, if an end event is to send a mail, please model this construct as 'Activity: Send Mail' and 'End Event'. +No intermediate events are currently supported. + +### Overview SSOT hierarchy + +![](https://i.imgur.com/7yOqDZv.png) + +### Component: HEADER + +User information about a robot (creator, released for etc.) is stored in an additional file in the database. + +**SSoT** + +```json +{ + "_id": "6045eccfa9a07940e5763f0b", + "starterId": "exampleID", + "robotName": "exampleRobot", + "elements": [ + { + /* Here start the nodes of the graph */ + } + ] +} +``` + +### Element: INSTRUCTION + +**SSoT** + +```json +{ + "type": "INSTRUCTION", + "name": "exampleName", + "id": "exampleId", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"], + "rpaApplication": "e.g. Excel.Files", + "rpaTask": "e.g. Open Workbook" +} +``` + +**parameter object extending the INSTRUCTION:** + +```json +{ + "robotId": "604f537ed699a2eb47274184", + "activityId": "Activity_47II", + "outputValue": "exampleId", + "rpaParameters": [ + { + "name": "Filename", + "type": "Boolean", + "value": "", + "requireUserInput": true, + "infoText": "The name of the file", + "isRequired": true, + "index": 0 + }, + { + "name": "Path", + "value": "C:/RPA-folder/", + "type": "Boolean", + "requireUserInput": false, + "infoText": "The path where the file is located on the machine", + "isRequired": true, + "index": 1 + } + ] +} +``` + +**attribute object extending the INSTRUCTION:** + +```json +{ + "robotId": "604f537ed699a2eb47274184", + "activityId": "Activity_47II", + "rpaApplication": "Excel.Files", + "rpaTask": "Open Workbook" +} +``` + +**BPMN requires:** + +- id :heavy_check_mark: +- label -> name :heavy_check_mark: +- predecessor :heavy_check_mark: +- successor :heavy_check_mark: +- ~~position~~ -> calculated :heavy_check_mark: +- ~~size~~ -> `config.json` :heavy_check_mark: +- _RPA-Task & Application & Parameters_ :heavy_check_mark: + +By using separate external objects we allow for a more consistent updating of the ssot, since it is only required to carry the information about the name of single elements, as well as their predecessors and successors. +Splitting the required information again into parameter and attributes has benefits when working with only one of the both in situations where many of those objects are needed, but only the attribute or parameter information is needed at that point. + +### Element: CASE + +**SSoT stores** + +- predecessor node, Successor node +- name, ID +- default successor node +- conditions (for each successor node) = IF condition + +```json +{ + "type": "CASE", + "name": "", + "id": "exampleId", + "predecessorIds": ["randomId3"], + "successorIds": ["randomId", "randomId2, randomId3"], + "default_successorIds": "randomId", + "conditions": { + "X+1==3": "randomID", + "X-1==3": "randomID2" + } +} +``` + +**BPMN requires** + +- predecessor node :heavy_check_mark: +- successor node :heavy_check_mark: +- label (name) :heavy_check_mark: +- default successor node :heavy_check_mark: +- conditions (texts at the Path to each successor node) :heavy_check_mark: + +### Element: LOOP + +**SSoT stores** + +- id, text (label) +- predecessor and successor nodes of the loop +- loop termination condition +- predecessor node of the loop body end +- successor node of the loop body start + +```json +{ + "type": "LOOP", + "id": "exampleId", + "loop_condition": "X > 5", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"], + "loop_body_predecessorIds": ["randomId"], + "loop_body_successorIds": ["randomId"] +} +``` + +### Element: MARKER + +**SSoT stores** + +- id, text (label) +- predecessor node +- successor node + +```json +{ + "type": "MARKER", + "id": "exampleId", + "name": "Wait 5 seconds", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"] +} +``` + +**BPMN requires** + +- label :heavy_check_mark: +- event type1: Start, End :heavy_check_mark: + - start = Event without incoming edge + - end = Event without outgoing edge +- event type2: timer event, message event etc. :thought_balloon: + - all events are always rendered as "neutral events" (empty circle). + +--- + +## Example parsing from BPMN xml to SSOT + +Modelled process +![](https://i.imgur.com/rMsmw1g.png) + + + + + + + + + + +
BPMN Json SSOT
+ +```json +{ + "_declaration": { + "_attributes": { + "version": "1.0", + "encoding": "UTF-8" + } + }, + "bpmn2:definitions": { + "_attributes": { + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:bpmn2": "http://www.omg.org/spec/BPMN/20100524/MODEL", + "xmlns:bpmndi": "http://www.omg.org/spec/BPMN/20100524/DI", + "xmlns:dc": "http://www.omg.org/spec/DD/20100524/DC", + "xmlns:arkRPA": "http://magic", + "xmlns:di": "http://www.omg.org/spec/DD/20100524/DI", + "id": "sample-diagram", + "targetNamespace": "http://bpmn.io/schema/bpmn", + "xsi:schemaLocation": "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" + }, + "bpmn2:collaboration": { + "_attributes": { + "id": "Collaboration_0czsqyr" + }, + "bpmn2:participant": { + "_attributes": { + "id": "Participant_0cyhvx8", + "processRef": "Process_1" + } + } + }, + "bpmn2:process": { + "_attributes": { + "id": "Process_1", + "isExecutable": "false" + }, + "bpmn2:task": [ + { + "_attributes": { + "id": "Activity_0a128t6", + "name": "#+# First activity" + }, + "bpmn2:incoming": { + "_text": "Flow_1bewk1i" + }, + "bpmn2:outgoing": { + "_text": "Flow_0sg07kn" + } + }, + { + "_attributes": { + "id": "Activity_0ascvdr", + "name": "#+#+# RPA Activity" + }, + "bpmn2:incoming": { + "_text": "Flow_0sg07kn" + }, + "bpmn2:outgoing": { + "_text": "Flow_1hwcghk" + } + } + ], + "bpmn2:sequenceFlow": [ + { + "_attributes": { + "id": "Flow_1bewk1i", + "sourceRef": "StartEvent_1", + "targetRef": "Activity_0a128t6" + } + }, + { + "_attributes": { + "id": "Flow_0sg07kn", + "sourceRef": "Activity_0a128t6", + "targetRef": "Activity_0ascvdr" + } + }, + { + "_attributes": { + "id": "Flow_1hwcghk", + "sourceRef": "Activity_0ascvdr", + "targetRef": "Event_0wghmrz" + } + } + ], + "bpmn2:endEvent": { + "_attributes": { + "id": "Event_0wghmrz" + }, + "bpmn2:incoming": { + "_text": "Flow_1hwcghk" + } + }, + "bpmn2:startEvent": { + "_attributes": { + "id": "StartEvent_1" + }, + "bpmn2:outgoing": { + "_text": "Flow_1bewk1i" + } + } + }, + "bpmndi:BPMNDiagram": { + "_attributes": { + "id": "BPMNDiagram_1" + }, + "bpmndi:BPMNPlane": { + "_attributes": { + "id": "BPMNPlane_1", + "bpmnElement": "Collaboration_0czsqyr" + }, + "bpmndi:BPMNShape": [ + { + "_attributes": { + "id": "Participant_0cyhvx8_di", + "bpmnElement": "Participant_0cyhvx8", + "isHorizontal": "true" + }, + "dc:Bounds": { + "_attributes": { + "x": "130", + "y": "220", + "width": "710", + "height": "250" + } + } + }, + { + "_attributes": { + "id": "Activity_0a128t6_di", + "bpmnElement": "Activity_0a128t6" + }, + "dc:Bounds": { + "_attributes": { + "x": "340", + "y": "280", + "width": "100", + "height": "80" + } + } + }, + { + "_attributes": { + "id": "Activity_0ascvdr_di", + "bpmnElement": "Activity_0ascvdr" + }, + "dc:Bounds": { + "_attributes": { + "x": "500", + "y": "280", + "width": "100", + "height": "80" + } + } + }, + { + "_attributes": { + "id": "Event_0wghmrz_di", + "bpmnElement": "Event_0wghmrz" + }, + "dc:Bounds": { + "_attributes": { + "x": "662", + "y": "392", + "width": "36", + "height": "36" + } + } + }, + { + "_attributes": { + "id": "_BPMNShape_StartEvent_2", + "bpmnElement": "StartEvent_1" + }, + "dc:Bounds": { + "_attributes": { + "x": "212", + "y": "302", + "width": "36", + "height": "36" + } + } + } + ], + "bpmndi:BPMNEdge": [ + { + "_attributes": { + "id": "Flow_1bewk1i_di", + "bpmnElement": "Flow_1bewk1i" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "248", + "y": "320" + } + }, + { + "_attributes": { + "x": "340", + "y": "320" + } + } + ] + }, + { + "_attributes": { + "id": "Flow_0sg07kn_di", + "bpmnElement": "Flow_0sg07kn" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "440", + "y": "320" + } + }, + { + "_attributes": { + "x": "500", + "y": "320" + } + } + ] + }, + { + "_attributes": { + "id": "Flow_1hwcghk_di", + "bpmnElement": "Flow_1hwcghk" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "600", + "y": "320" + } + }, + { + "_attributes": { + "x": "631", + "y": "320" + } + }, + { + "_attributes": { + "x": "631", + "y": "410" + } + }, + { + "_attributes": { + "x": "662", + "y": "410" + } + } + ] + } + ] + } + } + } +} +``` + + + +```json + "_id": "6045eccfa9a07940e5763f0b", + "starterId": "exampleID", + "robotName": "exampleRobot", + "elements": [ + { + "type": "MARKER", + "name": "", + "id": "StartEvent_1", + "predecessorIds": [], + "successorIds": ["Activity_0a128t6"], + }, + // first activity + { + "type": "INSTRUCTION", + "name": "#+# First activity", + "id": "Activity_0a128t6", + "predecessorIds": ["StartEvent_1"], + "successorIds": ["Activity_0ascvdr"] + }, + // second activity + { + "type": "INSTRUCTION", + "name": "#+#+# RPA Activity", + "id": "Activity_0ascvdr", + "predecessorIds": ["Activity_0a128t6"], + "successorIds": ["Event_0wghmrz"] + }, + // Endevent + { + "type": "MARKER", + "name": "", + "id": "Event_0wghmrz", + "predecessorIds": ["Activity_0a128t6"], + "successorIds": [], + } + ] +} +``` + +
diff --git a/wiki/How-to-style-using-CSS.md b/wiki/How-to-style-using-CSS.md index 274ef95c..793a03a4 100644 --- a/wiki/How-to-style-using-CSS.md +++ b/wiki/How-to-style-using-CSS.md @@ -1,415 +1,415 @@ -# How to style components using CSS - -## CSS general info - -- CSS = Cascading Style Sheets -- Only purpose is to style and animate markup language (HTML) -- Because we are rendering our React app in `HTML`, we can therefore also style all components of the app - -## Getting started with CSS - -
How to use CSS -

- -**1. Use Inline CSS** -Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. - -```html - -``` - -**2. Use Internal CSS** -In the tag open a \ tag. There you can specifiy the html component affected and the styling that should be applied to it. For example: - -```html - - - -``` - -**3. Use External CSS** -Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. -`` - -Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp - -### How to debug CSS - -Use the dev tools of your browser and check out the Style tab regarding your selected object. -![](https://i.imgur.com/OkpU7fx.png) - -

- -
Anatomy of CSS Syntax -

- -```html -selector { property: value; } // Example h1 { color: red; } -``` - -**Selector:** Who do you want to change? -**Property:** What do you want to change? -**Value:** How do you want it to be changed? - -### About CSS Selectors - -**Which properties can I change?** -Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index - -#### Selector: CSS Classes - -You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -.title { - color: red; -} -``` - -#### Selector: HTML IDs. - -You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -#MyTitle { - color: red; -} -``` - -#### Selector: Pseudo classes - -Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) - -```HTML -h1:hover{ - color= blue; -} -``` - -#### CSS Rule priority - -Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values - -

- -
Best practices -

- -- Write CSS Rules like this, starting the properties in a new line - -```html -h1 { color: red; font-size : 200px; } -``` - -- Alphabetically sort the selectors -- Use rem as font size unit -

- -## Using CSS in React - -
Styling Options -

- -### Inline Styling - -To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. - -```jsx -class MyHeader extends React.Component { - render() { - return ( -

-

Hello Style!

-

Add a little style!

-
- ); - } -} -``` - -> Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. - -### Using external stylesheets - -Write your CSS styling in a separate .css file and import it. -**./App.jsx** - -```jsx -import React from 'react'; -import ReactDOM from 'react-dom'; -import './App.css'; - -class MyHeader extends React.Component { - render() { -
- -## How to use AntD? - -
Basics about AntD -

- -To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. - -Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` - -Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. - -```jsx -import React from 'react'; -import { Button } from 'antd'; - -const TestButton = () => ( - <> - - -); - -export default TestButton; -``` - -

- -
AntD-Components -

- -**Frequently used Components** - -- for button see: [Button](https://ant.design/components/button/) -- for normal text & headings see: [Typography](https://ant.design/components/typography/) -- for input fields see: [Input](https://ant.design/components/input/) - -**About AntD Layout & Grid** -**AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. -For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). - -**AntD Grid** - -- As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. -- Your content elements should be placed directly in the col, and the only col should be placed directly in a row. -- The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. -- If the sum of col spans in a row is more than 24, then the overflowing col as a whole will start a new line arrangement. -- You can align Elements in the Grid horizontally and vertically and add Gutter (kind of margin between the boxes) which should always be preferred to the traditional alignment using CSS! - -```jsx -import { Row, Col } from 'antd'; - -ReactDOM.render( - <> - - col1 - col2 - - - col1 - col2 - col3 - - , - mountNode -); -``` - -> This will return two rows. The first row contains two columns, the second row contains three columns. -> -> **AntD Space** -> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons, horizontally aligned with space between the buttons. -> -> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. - -The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. - -**Link to the Documentation**. -For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. - -

- -# How to apply CSS in this Project - -## Use of styles via CSS - -In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: - -- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. -- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. - -### Basic rules for styling: - -
See the rules -

- -- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. -- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style -- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose -- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component - -

- -### CSS vs. CSS modules - -
When to use what? -

- -In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. -For example when you define the following style... - -```css -.button { - background-color: red; -} -``` - -... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. - -If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: - -```jsx -import styles from './Example.module.css'; -``` - -Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: - -```css -.button { - background-color: green; -} -``` - -In the file we would include the style in the following way: - -```jsx - -``` - -

- -### Conventions - -
We agreed on -

- -- naming: - For the naming of classes and ids please use **hyphens** consistently. - For example, don't call the class `buttonBackground` and instead call it `button-background`. -- sizing: - Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) - -

- ---- - -## Homework (take approx. 1h) - -1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) -2. Click through [this tutorial](https://de.learnlayout.com) -3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) -4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) - -## Further Reading. - -For more games to learn CSS checkout https://codepip.com/games/ -Take a look at this website https://css-tricks.com/ -For the style guide issue https://24ways.org/2011/front-end-style-guides +# How to style components using CSS + +## CSS general info + +- CSS = Cascading Style Sheets +- Only purpose is to style and animate markup language (HTML) +- Because we are rendering our React app in `HTML`, we can therefore also style all components of the app + +## Getting started with CSS + +
How to use CSS +

+ +**1. Use Inline CSS** +Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. + +```html + +``` + +**2. Use Internal CSS** +In the tag open a \ tag. There you can specifiy the html component affected and the styling that should be applied to it. For example: + +```html + + + +``` + +**3. Use External CSS** +Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. +`` + +Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp + +### How to debug CSS + +Use the dev tools of your browser and check out the Style tab regarding your selected object. +![](https://i.imgur.com/OkpU7fx.png) + +

+ +
Anatomy of CSS Syntax +

+ +```html +selector { property: value; } // Example h1 { color: red; } +``` + +**Selector:** Who do you want to change? +**Property:** What do you want to change? +**Value:** How do you want it to be changed? + +### About CSS Selectors + +**Which properties can I change?** +Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index + +#### Selector: CSS Classes + +You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. +**Html** + +```html +

Helloo

+``` + +**CSS** + +``` +.title { + color: red; +} +``` + +#### Selector: HTML IDs. + +You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. +**Html** + +```html +

Helloo

+``` + +**CSS** + +``` +#MyTitle { + color: red; +} +``` + +#### Selector: Pseudo classes + +Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) + +```HTML +h1:hover{ + color= blue; +} +``` + +#### CSS Rule priority + +Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values + +

+ +
Best practices +

+ +- Write CSS Rules like this, starting the properties in a new line + +```html +h1 { color: red; font-size : 200px; } +``` + +- Alphabetically sort the selectors +- Use rem as font size unit +

+ +## Using CSS in React + +
Styling Options +

+ +### Inline Styling + +To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. + +```jsx +class MyHeader extends React.Component { + render() { + return ( +

+

Hello Style!

+

Add a little style!

+
+ ); + } +} +``` + +> Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. + +### Using external stylesheets + +Write your CSS styling in a separate .css file and import it. +**./App.jsx** + +```jsx +import React from 'react'; +import ReactDOM from 'react-dom'; +import './App.css'; + +class MyHeader extends React.Component { + render() { +
+ +## How to use AntD? + +
Basics about AntD +

+ +To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. + +Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` + +Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. + +```jsx +import React from 'react'; +import { Button } from 'antd'; + +const TestButton = () => ( + <> + + +); + +export default TestButton; +``` + +

+ +
AntD-Components +

+ +**Frequently used Components** + +- for button see: [Button](https://ant.design/components/button/) +- for normal text & headings see: [Typography](https://ant.design/components/typography/) +- for input fields see: [Input](https://ant.design/components/input/) + +**About AntD Layout & Grid** +**AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. +For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). + +**AntD Grid** + +- As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. +- Your content elements should be placed directly in the col, and the only col should be placed directly in a row. +- The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. +- If the sum of col spans in a row is more than 24, then the overflowing col as a whole will start a new line arrangement. +- You can align Elements in the Grid horizontally and vertically and add Gutter (kind of margin between the boxes) which should always be preferred to the traditional alignment using CSS! + +```jsx +import { Row, Col } from 'antd'; + +ReactDOM.render( + <> + + col1 + col2 + + + col1 + col2 + col3 + + , + mountNode +); +``` + +> This will return two rows. The first row contains two columns, the second row contains three columns. +> +> **AntD Space** +> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. + +```jsx +import { Button, Space } from 'antd'; + +function SpaceDemo() { + return ( + + + + + ); +} + +ReactDOM.render(, mountNode); +``` + +> This will return two Buttons, horizontally aligned with space between the buttons. +> +> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. + +The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. + +```jsx +import { Button, Space } from 'antd'; + +function SpaceDemo() { + return ( + + + + + ); +} + +ReactDOM.render(, mountNode); +``` + +> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. + +**Link to the Documentation**. +For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. + +

+ +# How to apply CSS in this Project + +## Use of styles via CSS + +In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: + +- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. +- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. + +### Basic rules for styling: + +
See the rules +

+ +- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. +- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style +- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose +- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component + +

+ +### CSS vs. CSS modules + +
When to use what? +

+ +In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. +For example when you define the following style... + +```css +.button { + background-color: red; +} +``` + +... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. + +If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: + +```jsx +import styles from './Example.module.css'; +``` + +Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: + +```css +.button { + background-color: green; +} +``` + +In the file we would include the style in the following way: + +```jsx + +``` + +

+ +### Conventions + +
We agreed on +

+ +- naming: + For the naming of classes and ids please use **hyphens** consistently. + For example, don't call the class `buttonBackground` and instead call it `button-background`. +- sizing: + Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) + +

+ +--- + +## Homework (take approx. 1h) + +1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) +2. Click through [this tutorial](https://de.learnlayout.com) +3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) +4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) + +## Further Reading. + +For more games to learn CSS checkout https://codepip.com/games/ +Take a look at this website https://css-tricks.com/ +For the style guide issue https://24ways.org/2011/front-end-style-guides diff --git a/wiki/How-to-write-code-documentation.md b/wiki/How-to-write-code-documentation.md index ed2e3899..3b69c6d7 100644 --- a/wiki/How-to-write-code-documentation.md +++ b/wiki/How-to-write-code-documentation.md @@ -1,87 +1,87 @@ -## General - -We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. - -Documentation will be generated as a website under which the individual parts of the software (server/frontend) are visible and listed with their respective classes and modules. -It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. - -## How to write documentation - -### React Components - -As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. -Because of that tag all methods in the same file are -For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): - -``` -/** - * @description Some documented component - * @category Frontend/Server - * @component - * @example - * const text = 'some example text' - * return ( ) - */ -``` - -The attributes are: - -- description: Describe the component, its use case and/or where it could be used -- category: Either _Frontend_ or _Server_, based on where it is used (for React components this should most likely always be _Frontend_) -- component: Tag to specify this as a component -- example: Code which describes a possible use scenario for this component - -### Classes - -To document classes, please follow the following scheme in front of the constructor method: - -``` -/** - * @description This is a description of the MyClass constructor function. - * @category Frontend/Server - * @class - * @classdesc This is a description of the MyClass class. - */ -``` - -The attributes are: - -- description: Describe the constructor function -- category: Either _Frontend_ or _Server_, based on where it is used -- class: Tag to specify this as a class constructor -- classdesc: Describe the functionality and behavior of the class - -### Functions/Methods - -When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there - -``` -/** - * @description This is the description of what the function does - * @param {string} arg1 - A nice argument - * @param {*} arg2 - A fancy second argument - * @returns {number} number of interest which is returned - */ -``` - -The attributes are: - -- description: Describe the functionality and/or behavior of the function/method -- param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using \*. Specify the name of the parameter and separated from that name specify what this parameter should represent. -- returns {datatype}: Specify the datatype returned by the function and what that value represents - -#### Group as module - -When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there - -``` -/** - * @category Frontend/Server - * @module optionalString - */ -``` - -The attributes are: - -- category: Either _Frontend_ or _Server_, based on where it is used -- module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. +## General + +We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. + +Documentation will be generated as a website under which the individual parts of the software (server/frontend) are visible and listed with their respective classes and modules. +It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. + +## How to write documentation + +### React Components + +As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. +Because of that tag all methods in the same file are +For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): + +``` +/** + * @description Some documented component + * @category Frontend/Server + * @component + * @example + * const text = 'some example text' + * return ( ) + */ +``` + +The attributes are: + +- description: Describe the component, its use case and/or where it could be used +- category: Either _Frontend_ or _Server_, based on where it is used (for React components this should most likely always be _Frontend_) +- component: Tag to specify this as a component +- example: Code which describes a possible use scenario for this component + +### Classes + +To document classes, please follow the following scheme in front of the constructor method: + +``` +/** + * @description This is a description of the MyClass constructor function. + * @category Frontend/Server + * @class + * @classdesc This is a description of the MyClass class. + */ +``` + +The attributes are: + +- description: Describe the constructor function +- category: Either _Frontend_ or _Server_, based on where it is used +- class: Tag to specify this as a class constructor +- classdesc: Describe the functionality and behavior of the class + +### Functions/Methods + +When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + +``` +/** + * @description This is the description of what the function does + * @param {string} arg1 - A nice argument + * @param {*} arg2 - A fancy second argument + * @returns {number} number of interest which is returned + */ +``` + +The attributes are: + +- description: Describe the functionality and/or behavior of the function/method +- param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using \*. Specify the name of the parameter and separated from that name specify what this parameter should represent. +- returns {datatype}: Specify the datatype returned by the function and what that value represents + +#### Group as module + +When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + +``` +/** + * @category Frontend/Server + * @module optionalString + */ +``` + +The attributes are: + +- category: Either _Frontend_ or _Server_, based on where it is used +- module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. diff --git a/wiki/How-to-write-tests.md b/wiki/How-to-write-tests.md index 1676e30b..a0c0d08f 100644 --- a/wiki/How-to-write-tests.md +++ b/wiki/How-to-write-tests.md @@ -1,136 +1,136 @@ -# Testing - -## Topics - -- Why automatically test? -- Tools -- What to test? -- How to write a test? -- How to execute a test? -- Best practices -- Your next Steps -- Places to continue research - ---- - -### Why automatically test? - -**The purpose of testing is to give you confidence that the app is working correctly.** - -- Helps to catch bugs earlier - - You might unknowingly break an app whenever you change a line of code. -- Test your changes faster - - Manually testing your app after each change is cumbersome. - - Refactoring is easier -- Tests help document - - for example edge cases -- Improves the architecture - - Enforces code splitting and single responsibilities - -### Tools - -![The tools used often](https://i.imgur.com/sxEsfOJ.png) -There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. - -> React Testing Library approaches testing from a user perspective. Thus it naturally leads to writing integration tests where multiple components are tested together. -> As an example, imagine a button. With React Testing Library you typically wouldn't test if the onClick prop is called when the button is clicked. You would rather test if a specific button triggers a certain effect. Like a delete button opening a confirmation modal. -> With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). - -#### Jest - -- Unit testing -- Snapshot testing - - Is useful for making sure that the UI does not change unexpectedly -- Integration testing -- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) - - Mock = An object on which you set expectations - - Stub = Provides predefined answers to method calls - - Spy = Doesn't change functionality - - **In general you can simply refer to it as mocking** - -Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) - -You can also use [this short Jest cheatsheet](https://devhints.io/jest) - -#### React Testing Library - -- Component testing - - Testing based on the correct rendering of components -- Simulate user behavior -- Can't access components state - -[Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) -[RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) - -#### Which testing tool to use - -- For everything related to rendering components and therefore requires evaluations against the DOM -- If you are only testing functions and methods, please use plain Jest - -### What to test? - -#### Do - -- Utility methods -- Complex implementations (eg: algorithms) -- Anything that has edge cases -- Core business logic -- High-risk Services -- Common user interactions -- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) -- Interactions between units that were stubbed in the unit tests - -#### Don't - -- JavaScript and NodeJS core functions -- Third-party libraries -- External applications -- API calls. Stub them unless you’re doing E2E testing -- Database operations, unless you’re doing E2E testing -- Trivial methods not involving logic (simple getters and setters) -- Code that is throw-away or placeholder code - -### How to write a test? - -- In the same folder of component, create file filename.test.js - - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files -- Use describe, it, beforeEach, etc. - -### How to execute a test? - -`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) - -### Best practices - -- Tests should be pure (have the same outcome on multiple runs), so mock - - API calls - - Third-party libraries - - Timers - - Dates - - Random values - - File access -- Use constants to assign and evaluate to prevent typos that may cause the test to fail -- Create Tests That Are Resistant to UI Changes -- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); - - Think about using the built-in afterEach functionality if your Use-Case requires it -- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. -- Find yourself mocking the same function over and over in multiple tests? - - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! -- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. -- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain -- Don’t create fake/poor tests just for increasing coverage -- Avoid including implementation details in tests - -## Next Steps - -- [ ] read through [the jest documentation](https://jestjs.io/docs/en/getting-started) (about 15 minutes) -- [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 -- [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) - -## Places to continue research - -- https://www.freecodecamp.org/news/testing-react-hooks/ -- https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be -- https://www.robinwieruch.de/react-testing-library/ -- Jest docs https://jestjs.io/docs/en/getting-started -- RTL Docs https://testing-library.com/docs/react-testing-library/intro/ +# Testing + +## Topics + +- Why automatically test? +- Tools +- What to test? +- How to write a test? +- How to execute a test? +- Best practices +- Your next Steps +- Places to continue research + +--- + +### Why automatically test? + +**The purpose of testing is to give you confidence that the app is working correctly.** + +- Helps to catch bugs earlier + - You might unknowingly break an app whenever you change a line of code. +- Test your changes faster + - Manually testing your app after each change is cumbersome. + - Refactoring is easier +- Tests help document + - for example edge cases +- Improves the architecture + - Enforces code splitting and single responsibilities + +### Tools + +![The tools used often](https://i.imgur.com/sxEsfOJ.png) +There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. + +> React Testing Library approaches testing from a user perspective. Thus it naturally leads to writing integration tests where multiple components are tested together. +> As an example, imagine a button. With React Testing Library you typically wouldn't test if the onClick prop is called when the button is clicked. You would rather test if a specific button triggers a certain effect. Like a delete button opening a confirmation modal. +> With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). + +#### Jest + +- Unit testing +- Snapshot testing + - Is useful for making sure that the UI does not change unexpectedly +- Integration testing +- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) + - Mock = An object on which you set expectations + - Stub = Provides predefined answers to method calls + - Spy = Doesn't change functionality + - **In general you can simply refer to it as mocking** + +Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) + +You can also use [this short Jest cheatsheet](https://devhints.io/jest) + +#### React Testing Library + +- Component testing + - Testing based on the correct rendering of components +- Simulate user behavior +- Can't access components state + +[Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) +[RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) + +#### Which testing tool to use + +- For everything related to rendering components and therefore requires evaluations against the DOM +- If you are only testing functions and methods, please use plain Jest + +### What to test? + +#### Do + +- Utility methods +- Complex implementations (eg: algorithms) +- Anything that has edge cases +- Core business logic +- High-risk Services +- Common user interactions +- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) +- Interactions between units that were stubbed in the unit tests + +#### Don't + +- JavaScript and NodeJS core functions +- Third-party libraries +- External applications +- API calls. Stub them unless you’re doing E2E testing +- Database operations, unless you’re doing E2E testing +- Trivial methods not involving logic (simple getters and setters) +- Code that is throw-away or placeholder code + +### How to write a test? + +- In the same folder of component, create file filename.test.js + - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files +- Use describe, it, beforeEach, etc. + +### How to execute a test? + +`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) + +### Best practices + +- Tests should be pure (have the same outcome on multiple runs), so mock + - API calls + - Third-party libraries + - Timers + - Dates + - Random values + - File access +- Use constants to assign and evaluate to prevent typos that may cause the test to fail +- Create Tests That Are Resistant to UI Changes +- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); + - Think about using the built-in afterEach functionality if your Use-Case requires it +- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. +- Find yourself mocking the same function over and over in multiple tests? + - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! +- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. +- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain +- Don’t create fake/poor tests just for increasing coverage +- Avoid including implementation details in tests + +## Next Steps + +- [ ] read through [the jest documentation](https://jestjs.io/docs/en/getting-started) (about 15 minutes) +- [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 +- [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) + +## Places to continue research + +- https://www.freecodecamp.org/news/testing-react-hooks/ +- https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be +- https://www.robinwieruch.de/react-testing-library/ +- Jest docs https://jestjs.io/docs/en/getting-started +- RTL Docs https://testing-library.com/docs/react-testing-library/intro/ diff --git a/wiki/Team-Scrum-process.md b/wiki/Team-Scrum-process.md index 4cc8212c..c11859ce 100644 --- a/wiki/Team-Scrum-process.md +++ b/wiki/Team-Scrum-process.md @@ -1,73 +1,73 @@ -## Our current Scrum process is the following: - -### General -- One sprint is usually three weeks long. -- The teams' core work time is Monday-Wednesday (9 am-3 pm) and a fourth flexible day that each team member can set himself -- Each member of the team works about 32 hours per week - -### Meetings - -**1. Daily Scrum:** -Limited to 15 min the daily scrum takes place Monday, Tuesday and Wednesday at 9 am in MS Teams. -Only the core team is participating including Maximilian. -The structure the team agreed on is that every team member shortly answers the following three questions: -* What did I do yesterday that helped the Development Team achieve the sprint goal? -* What will I do today to help the Development Team achieve the sprint goal? -* Do I see any obstacle that will prevent me or the Development Team from achieving the Sprint Goal? - -**2. Sprint Planning:** -It usually takes place on the first day of the new sprint. It should never exceed 4 hours. -Only the core team is participating including Maximilian. The Scrum Master is inviting everyone. The goal is to define a sprint backlog and a sprint goal as well as the responsibilities for the different issues. We estimate the effort of the stories using Planning Poker. We decided to use the Fibonacci scale at the beginning of the 6th sprint. One story point corresponds to 2 man-hours. - -**3. Sprint Review:** -It usually takes place on the last day of the sprint. It takes about 1 hour. -The core team is participating as well as important Stakeholders like Prof. Weske, Tobias Metzke-Bernstein, Simon Siegert, Maximilian Völker. The Product Owner takes care of the invitations. -First, the Product Owner presents which stories of the backlog were done and the Development Team shows the product increment and explains what went well and what challenges they faced. Second, the stakeholders give feedback on the product increment and give valuable input for the next sprint. - -**4. Sprint Retrospective:** -It takes place directly 0.5 hours after the sprint review. It should not exceed 1.5 hours. Only the core team is participating. -The Scrum Master is inviting everyone. The goal is to reflect on the last sprint and find ways to improve the scrum process as well as the way the team works together. The Scrum Master informs Maximilian about any changes to the process and updates this wiki. - -### Artefacts -All the relevant scrum artifacts are stored here in this GitHub project. - -**Product Increment:** -* The current product increment can be found on the master branch. It is updated before every sprint review. - -**Product Backlog & Sprint Backlog:** -* Can be found in the "Projects" tab under "Kanban Board". -* For every user story, the definition of done is defined under the point "Conditions of satisfaction". -* New ideas for user stories can be sent to the product owner directly or an issue can be created in the column "User Story Ideas / Bug Reporting" - - -### Agreements - -We agreed on having a **Pull Request freeze on 14:00** the day before the sprint review. This means, that no further Pull Requests may be created until then, if the changes are supposed to be merged for the current sprint goal. The same day **at 18:00 we agreed on a merge freeze**, which means no further pull requests from feature branches are to be merged into dev for the release presented at the sprint review the next day. User stories that are merged after 18:00 will be presented at the next sprint review. - -### Action Points for this Sprint - -During our last retrospective we agreed on tackling the following action points: -* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. -* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` -* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. -* We review pull requests more conscientiously in the future. This has been left a bit behind. -* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. -* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. - -### Old Action Points -* Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. -* The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. -* The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). -* PRs must be reviewed within one business day. Own PRs should not be prioritized over other people's PRs. -* In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. -* Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. -* The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. -* The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. -* Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. -* We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. -* We will delete the Quote-thread. -* The Scrum Master will open a thread regarding further distribution of the presentations which are supposed to be held. We then want to finally assign us to these presentations. -* Pull Requests that introduce more than 500 lines of changes need a more detailed description so that reviewers can understand the components, not only check for syntax. -* Work on spike issues is supposed to be stopped as soon as the estimated time has passed -* We want to figure out ways to find a balance between time spent on our bachelors project and the bachelors thesis. -* We need to define our programming style for issues, wether it's closer to extreme programming or more future proof implementations +## Our current Scrum process is the following: + +### General +- One sprint is usually three weeks long. +- The teams' core work time is Monday-Wednesday (9 am-3 pm) and a fourth flexible day that each team member can set himself +- Each member of the team works about 32 hours per week + +### Meetings + +**1. Daily Scrum:** +Limited to 15 min the daily scrum takes place Monday, Tuesday and Wednesday at 9 am in MS Teams. +Only the core team is participating including Maximilian. +The structure the team agreed on is that every team member shortly answers the following three questions: +* What did I do yesterday that helped the Development Team achieve the sprint goal? +* What will I do today to help the Development Team achieve the sprint goal? +* Do I see any obstacle that will prevent me or the Development Team from achieving the Sprint Goal? + +**2. Sprint Planning:** +It usually takes place on the first day of the new sprint. It should never exceed 4 hours. +Only the core team is participating including Maximilian. The Scrum Master is inviting everyone. The goal is to define a sprint backlog and a sprint goal as well as the responsibilities for the different issues. We estimate the effort of the stories using Planning Poker. We decided to use the Fibonacci scale at the beginning of the 6th sprint. One story point corresponds to 2 man-hours. + +**3. Sprint Review:** +It usually takes place on the last day of the sprint. It takes about 1 hour. +The core team is participating as well as important Stakeholders like Prof. Weske, Tobias Metzke-Bernstein, Simon Siegert, Maximilian Völker. The Product Owner takes care of the invitations. +First, the Product Owner presents which stories of the backlog were done and the Development Team shows the product increment and explains what went well and what challenges they faced. Second, the stakeholders give feedback on the product increment and give valuable input for the next sprint. + +**4. Sprint Retrospective:** +It takes place directly 0.5 hours after the sprint review. It should not exceed 1.5 hours. Only the core team is participating. +The Scrum Master is inviting everyone. The goal is to reflect on the last sprint and find ways to improve the scrum process as well as the way the team works together. The Scrum Master informs Maximilian about any changes to the process and updates this wiki. + +### Artefacts +All the relevant scrum artifacts are stored here in this GitHub project. + +**Product Increment:** +* The current product increment can be found on the master branch. It is updated before every sprint review. + +**Product Backlog & Sprint Backlog:** +* Can be found in the "Projects" tab under "Kanban Board". +* For every user story, the definition of done is defined under the point "Conditions of satisfaction". +* New ideas for user stories can be sent to the product owner directly or an issue can be created in the column "User Story Ideas / Bug Reporting" + + +### Agreements + +We agreed on having a **Pull Request freeze on 14:00** the day before the sprint review. This means, that no further Pull Requests may be created until then, if the changes are supposed to be merged for the current sprint goal. The same day **at 18:00 we agreed on a merge freeze**, which means no further pull requests from feature branches are to be merged into dev for the release presented at the sprint review the next day. User stories that are merged after 18:00 will be presented at the next sprint review. + +### Action Points for this Sprint + +During our last retrospective we agreed on tackling the following action points: +* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. +* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` +* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. +* We review pull requests more conscientiously in the future. This has been left a bit behind. +* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. +* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. + +### Old Action Points +* Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. +* The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. +* The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). +* PRs must be reviewed within one business day. Own PRs should not be prioritized over other people's PRs. +* In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. +* Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. +* The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. +* The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. +* Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. +* We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. +* We will delete the Quote-thread. +* The Scrum Master will open a thread regarding further distribution of the presentations which are supposed to be held. We then want to finally assign us to these presentations. +* Pull Requests that introduce more than 500 lines of changes need a more detailed description so that reviewers can understand the components, not only check for syntax. +* Work on spike issues is supposed to be stopped as soon as the estimated time has passed +* We want to figure out ways to find a balance between time spent on our bachelors project and the bachelors thesis. +* We need to define our programming style for issues, wether it's closer to extreme programming or more future proof implementations From 1e73659595fd5bc0647bdfb78f7af6707ccec64b Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 15:34:02 +0200 Subject: [PATCH 075/149] fixed file namings --- .../components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx | 4 ++-- .../src/resources/modeler/{empty.bpmn.jsx => emptyBpmn.js} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename frontend/src/resources/modeler/{empty.bpmn.jsx => emptyBpmn.js} (100%) diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx index 12c0b508..f2aa63fc 100644 --- a/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/BpmnModeler/BpmnModeler.jsx @@ -4,8 +4,8 @@ import { Layout } from 'antd'; import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'; import PropTypes from 'prop-types'; import CliModule from 'bpmn-js-cli'; -import removeUnsupportedBpmnFunctions from './RemoveUnsupportedBpmnFunctions'; -import { emptyBpmn } from '../../../../resources/modeler/empty.bpmn'; +import removeUnsupportedBpmnFunctions from './removeUnsupportedBpmnFunctions'; +import { emptyBpmn } from '../../../../resources/modeler/emptyBpmn'; import styles from './BpmnModeler.module.css'; import 'bpmn-js/dist/assets/diagram-js.css'; import 'bpmn-font/dist/css/bpmn-embedded.css'; diff --git a/frontend/src/resources/modeler/empty.bpmn.jsx b/frontend/src/resources/modeler/emptyBpmn.js similarity index 100% rename from frontend/src/resources/modeler/empty.bpmn.jsx rename to frontend/src/resources/modeler/emptyBpmn.js From ebae2621131227f02e10837060c8b81b24fd3d9b Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Tue, 25 May 2021 15:35:36 +0200 Subject: [PATCH 076/149] Rename RemoveUnsupportedBpmnFunctions.js to removeUnsupportedBpmnFunctions.js --- ...upportedBpmnFunctions.js => removeUnsupportedBpmnFunctions.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/src/components/pages/RobotModeler/BpmnModeler/{RemoveUnsupportedBpmnFunctions.js => removeUnsupportedBpmnFunctions.js} (100%) diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/pages/RobotModeler/BpmnModeler/removeUnsupportedBpmnFunctions.js similarity index 100% rename from frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js rename to frontend/src/components/pages/RobotModeler/BpmnModeler/removeUnsupportedBpmnFunctions.js From 83951fcac955fddca100ea0f2cd9cc35cf8c8745 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 16:07:01 +0200 Subject: [PATCH 077/149] renaming in wiki for real --- ...trating-Bots.md => Concept-Starting-and-Orchestrating-Bots.md} | 0 ...atabase-and-communication.md => Database-and-Communication.md} | 0 ...tion-Folder-structure.md => Documentation-Folder-Structure.md} | 0 ...source-of-truth.md => Documentation-Single-Source-of-Truth.md} | 0 wiki/{How-to-style-using-CSS.md => How-To-Style-Using-CSS.md} | 0 ...e-code-documentation.md => How-To-Write-Code-Documentation.md} | 0 wiki/{How-to-write-tests.md => How-To-Write-Tests.md} | 0 wiki/{Team-Scrum-process.md => Team-Scrum-Process.md} | 0 wiki/{Vision-for-Ark-automate.md => Vision-for-Ark-Automate.md} | 0 wiki/{Why-RPA-framework.md => Why-RPA-Framework.md} | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename wiki/{Concept-Starting-and-orchestrating-Bots.md => Concept-Starting-and-Orchestrating-Bots.md} (100%) rename wiki/{Database-and-communication.md => Database-and-Communication.md} (100%) rename wiki/{Documentation-Folder-structure.md => Documentation-Folder-Structure.md} (100%) rename wiki/{Documentation-single-source-of-truth.md => Documentation-Single-Source-of-Truth.md} (100%) rename wiki/{How-to-style-using-CSS.md => How-To-Style-Using-CSS.md} (100%) rename wiki/{How-to-write-code-documentation.md => How-To-Write-Code-Documentation.md} (100%) rename wiki/{How-to-write-tests.md => How-To-Write-Tests.md} (100%) rename wiki/{Team-Scrum-process.md => Team-Scrum-Process.md} (100%) rename wiki/{Vision-for-Ark-automate.md => Vision-for-Ark-Automate.md} (100%) rename wiki/{Why-RPA-framework.md => Why-RPA-Framework.md} (100%) diff --git a/wiki/Concept-Starting-and-orchestrating-Bots.md b/wiki/Concept-Starting-and-Orchestrating-Bots.md similarity index 100% rename from wiki/Concept-Starting-and-orchestrating-Bots.md rename to wiki/Concept-Starting-and-Orchestrating-Bots.md diff --git a/wiki/Database-and-communication.md b/wiki/Database-and-Communication.md similarity index 100% rename from wiki/Database-and-communication.md rename to wiki/Database-and-Communication.md diff --git a/wiki/Documentation-Folder-structure.md b/wiki/Documentation-Folder-Structure.md similarity index 100% rename from wiki/Documentation-Folder-structure.md rename to wiki/Documentation-Folder-Structure.md diff --git a/wiki/Documentation-single-source-of-truth.md b/wiki/Documentation-Single-Source-of-Truth.md similarity index 100% rename from wiki/Documentation-single-source-of-truth.md rename to wiki/Documentation-Single-Source-of-Truth.md diff --git a/wiki/How-to-style-using-CSS.md b/wiki/How-To-Style-Using-CSS.md similarity index 100% rename from wiki/How-to-style-using-CSS.md rename to wiki/How-To-Style-Using-CSS.md diff --git a/wiki/How-to-write-code-documentation.md b/wiki/How-To-Write-Code-Documentation.md similarity index 100% rename from wiki/How-to-write-code-documentation.md rename to wiki/How-To-Write-Code-Documentation.md diff --git a/wiki/How-to-write-tests.md b/wiki/How-To-Write-Tests.md similarity index 100% rename from wiki/How-to-write-tests.md rename to wiki/How-To-Write-Tests.md diff --git a/wiki/Team-Scrum-process.md b/wiki/Team-Scrum-Process.md similarity index 100% rename from wiki/Team-Scrum-process.md rename to wiki/Team-Scrum-Process.md diff --git a/wiki/Vision-for-Ark-automate.md b/wiki/Vision-for-Ark-Automate.md similarity index 100% rename from wiki/Vision-for-Ark-automate.md rename to wiki/Vision-for-Ark-Automate.md diff --git a/wiki/Why-RPA-framework.md b/wiki/Why-RPA-Framework.md similarity index 100% rename from wiki/Why-RPA-framework.md rename to wiki/Why-RPA-Framework.md From 5585308dd61cb792e9ce10ac6c2fb8d6016851c7 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 25 May 2021 16:34:45 +0200 Subject: [PATCH 078/149] fix remaining eslint warnings --- .../modelerSidebarFunctionality.test.js | 9 --------- .../modelerSidebarFunctionalityTestingUtils.js | 1 + server/package.json | 2 +- server/socket/socketHelperFunctions.js | 6 ++---- server/socket/socketManager.js | 1 + server/utils/testing/testDatabaseHandler.js | 4 ++-- 6 files changed, 7 insertions(+), 16 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 03887cbf..faaa5c8b 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -468,15 +468,6 @@ describe('Sidebar Functionality: Application Change', () => { }); it('handle application change WITHOUT cache existing', async () => { - const MOCK_VALUE = 'cookbookApplication'; - const MOCK_ROBOT_ID = '0123456789-4711'; - const MOCK_CURRENT_ELEMENT_ID = '123450815'; - const MOCK_CURRENT_ELEMENT = { id: constants.MOCK_CURRENT_ELEMENT_ID }; - const MOCK_SELECTED_ELEMENTS = [constants.MOCK_CURRENT_ELEMENT]; - const MOCK_ELEMENT_STATE = { - selectedElements: constants.MOCK_SELECTED_ELEMENTS, - currentElement: constants.MOCK_CURRENT_ELEMENT, - }; const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index 0cdf6502..f1ee9197 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ const MOCK_ROBOT_ID = '0123456789abc0815'; const MOCK_CURRENT_ELEMENT_ID = '123450815'; const MOCK_ROBOT_NAME = 'testRobotFromTest'; diff --git a/server/package.json b/server/package.json index c281f00f..07f64b26 100644 --- a/server/package.json +++ b/server/package.json @@ -17,6 +17,7 @@ "chai": "^4.3.4", "express": "^4.16.4", "mongodb": "^3.6.5", + "mongodb-memory-server": "^6.9.6", "mongoose": "^5.12.1", "nodemon": "^2.0.7", "socket.io": "^4.0.0", @@ -33,7 +34,6 @@ "eslint-plugin-react": "^7.22.0", "eslint-plugin-react-hooks": "^4.2.0", "jest": "^26.6.3", - "mongodb-memory-server": "^6.9.6", "node-mocks-http": "^1.10.1", "supertest": "^6.1.1" }, diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 84dff022..870abbf7 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -85,10 +85,8 @@ exports.createJob = async (userId, robotId, status, parameters) => { const { _id: objId } = jobObj; return objId; } catch (err) { - if (err) { - console.error(err); - return undefined; - } + console.error(err); + return undefined; } }; diff --git a/server/socket/socketManager.js b/server/socket/socketManager.js index e418ad01..6664093e 100644 --- a/server/socket/socketManager.js +++ b/server/socket/socketManager.js @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ const socketHelperFunctions = require('./socketHelperFunctions'); exports.socketManager = (io, socket) => { diff --git a/server/utils/testing/testDatabaseHandler.js b/server/utils/testing/testDatabaseHandler.js index d92de9e7..fc3e0541 100644 --- a/server/utils/testing/testDatabaseHandler.js +++ b/server/utils/testing/testDatabaseHandler.js @@ -40,9 +40,9 @@ exports.clearDatabase = async () => { // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html const result = []; - for (const key in collections) { + Object.keys(collections).forEach((key) => { const collection = collections[key]; result.push(collection.deleteMany()); - } + }); return Promise.all(result); }; From a3a69cbd615048f010632298f5c5cd136952935c Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 25 May 2021 16:47:29 +0200 Subject: [PATCH 079/149] Delete obsolete eslint comments --- frontend/src/api/routes/robots/robots.js | 1 - frontend/src/api/routes/robots/rpaAttributes.js | 1 - frontend/src/api/routes/robots/rpaParameter.js | 1 - .../robotInteractionCockpitFunctionality.js | 1 - .../BpmnModeler/RemoveUnsupportedBpmnFunctions.js | 3 +-- .../components/pages/RobotOverview/RobotOverview.test.js | 7 +------ server/api/models/robotJobModel.js | 5 ++--- server/socket/socketManager.js | 2 -- server/utils/ssotToRobotParsing/retrieveParameters.js | 3 +-- server/utils/ssotToRobotParsing/ssotToRobotParser.js | 2 -- 10 files changed, 5 insertions(+), 21 deletions(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index 3fcd3927..d2a583bc 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -59,7 +59,6 @@ const deleteRobotFromDB = async (robotId) => { */ const updateRobot = async (robotId, ssot) => { const requestStringSsot = `/robots/${robotId}`; - // eslint-disable-next-line no-unused-vars const response = await fetch(requestStringSsot, { body: ssot, method: 'PUT', diff --git a/frontend/src/api/routes/robots/rpaAttributes.js b/frontend/src/api/routes/robots/rpaAttributes.js index 7c99ea98..7f5bfa99 100644 --- a/frontend/src/api/routes/robots/rpaAttributes.js +++ b/frontend/src/api/routes/robots/rpaAttributes.js @@ -20,7 +20,6 @@ const getAllAttributes = async (robotId) => { */ const updateManyAttributes = async (attributeObjectList) => { const requestStringAttributes = `/robots/rpaattributes`; - // eslint-disable-next-line no-unused-vars const response = await fetch(requestStringAttributes, { body: JSON.stringify({ attributeObjectList }), method: 'PUT', diff --git a/frontend/src/api/routes/robots/rpaParameter.js b/frontend/src/api/routes/robots/rpaParameter.js index 916f1190..5344a669 100644 --- a/frontend/src/api/routes/robots/rpaParameter.js +++ b/frontend/src/api/routes/robots/rpaParameter.js @@ -20,7 +20,6 @@ const getAllParametersForRobot = async (robotId) => { */ const updateManyParameters = async (parameterObjectsList) => { const requestStringParameters = `/robots/parameters`; - // eslint-disable-next-line no-unused-vars const response = await fetch(requestStringParameters, { body: JSON.stringify({ parameterObjectsList }), method: 'PUT', diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index de0a6bd0..1d2a2acc 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -108,7 +108,6 @@ const getActivityAndParameterInformation = ( }); }; -// eslint-disable-next-line import/prefer-default-export export { getActivityAndParameterInformation, isRobotExecutable, diff --git a/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js b/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js index 5e223415..37880a87 100644 --- a/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js +++ b/frontend/src/components/pages/RobotModeler/BpmnModeler/RemoveUnsupportedBpmnFunctions.js @@ -1,8 +1,8 @@ +/* eslint-disable func-names */ import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider'; const removeUnsupportedBpmnFunctions = () => { const { getPaletteEntries } = PaletteProvider.prototype; - // eslint-disable-next-line func-names PaletteProvider.prototype.getPaletteEntries = function () { const entries = getPaletteEntries.apply(this); delete entries['create.intermediate-event']; @@ -21,7 +21,6 @@ const removeUnsupportedBpmnFunctions = () => { // eslint-disable-next-line class-methods-use-this getContextPadEntries() { - // eslint-disable-next-line func-names return function (entries) { const customizesEntries = entries; delete customizesEntries['append.text-annotation']; diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js index f048a368..8ba8b49e 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js @@ -1,3 +1,4 @@ +/* eslint-disable react/jsx-filename-extension */ /* eslint-disable func-names */ /* eslint-disable object-shorthand */ /* eslint-disable no-undef */ @@ -32,11 +33,6 @@ const MOCK_ROBOT_LIST = [ }, ]; -const MOCK_ROBOT_INFO = { - robotName: NEW_ROBOT_NAME, - robotId: '12345678901234567890123c', -}; - async function mockFetch(url) { switch (url) { case `/users/${USER_ID}/robots`: { @@ -58,7 +54,6 @@ beforeEach(() => window.fetch.mockImplementation(mockFetch)); describe('Testing functionality behind button to trigger function call for new but creation', () => { it('check if attempt to fetch occured twice', async () => { act(() => { - // eslint-disable-next-line react/jsx-filename-extension render( diff --git a/server/api/models/robotJobModel.js b/server/api/models/robotJobModel.js index c1539d74..e3fabf4d 100644 --- a/server/api/models/robotJobModel.js +++ b/server/api/models/robotJobModel.js @@ -21,8 +21,7 @@ const activityErrorSchema = new Schema({ message: { type: String, required: [true, 'Error messsage required'] }, }); -// eslint-disable-next-line camelcase -const Job_Schema = new Schema({ +const jobSchema = new Schema({ user_id: { type: mongoose.Types.ObjectId, required: [true, 'UserId required'], @@ -36,5 +35,5 @@ const Job_Schema = new Schema({ loggedErrors: [activityErrorSchema], }); -const Job = mongoose.model('job', Job_Schema); +const Job = mongoose.model('job', jobSchema); module.exports = { Job }; diff --git a/server/socket/socketManager.js b/server/socket/socketManager.js index 6664093e..00d383d8 100644 --- a/server/socket/socketManager.js +++ b/server/socket/socketManager.js @@ -49,8 +49,6 @@ exports.socketManager = (io, socket) => { } }); } - - // eslint-disable-next-line no-else-return } else { socket.emit('errorUserRoomConnection', 'Invalid userId: ', userId); } diff --git a/server/utils/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js index 2e90220a..0ec7cc61 100644 --- a/server/utils/ssotToRobotParsing/retrieveParameters.js +++ b/server/utils/ssotToRobotParsing/retrieveParameters.js @@ -1,12 +1,11 @@ +/* eslint-disable no-unused-vars */ /** * @category Server * @module */ const mongoose = require('mongoose'); const { ACTIVITY_IDENTIFIER } = require('./robotCodeConstants'); -// eslint-disable-next-line no-unused-vars const ssotModels = require('../../api/models/singleSourceOfTruthModel.js'); -// eslint-disable-next-line no-unused-vars const jobsModel = require('../../api/models/robotJobModel.js'); /** diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 4343b85b..9f15be69 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -20,7 +20,6 @@ const { generateCodeForRpaTasks } = require('./generateCodeForRpaTasks'); * @returns {string} Code that has to be put in .robot file */ const parseSsotToRobotCode = async (ssot) => { - // eslint-disable-next-line prefer-const const result = await generateCodeBase(ssot); const parameters = await retrieveParameters(ssot); result.parsedCode += await generateCodeForRpaTasks( @@ -38,7 +37,6 @@ const parseSsotToRobotCode = async (ssot) => { * @returns {string} Code that has to be put in .robot file */ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { - // eslint-disable-next-line prefer-const const result = await generateCodeBase(ssot); const parameters = await retrieveParametersFromSsotAndJob(ssot, jobId); result.parsedCode += await generateCodeForRpaTasks( From 1dc81b2a698c739b285352852f4904de83a49d52 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 17:00:18 +0200 Subject: [PATCH 080/149] renaming in uao AccessLevel -> accessLevel --- server/api/controllers/ssotRetrievalController.js | 4 ++-- server/api/models/userAccessObjectModel.js | 2 +- server/api/routes/users/users.test.js | 2 +- server/utils/openApiDocumentation/openApiComponents.js | 4 ++-- server/utils/testing/testData.js | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index 4d24e436..a353f16f 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -83,7 +83,7 @@ exports.getRobotList = async (req, res) => { .find( { userId: usableUserId }, { - AccessLevel: 0, + accessLevel: 0, _id: 0, userId: 0, } @@ -290,7 +290,7 @@ exports.createNewRobot = async (req, res) => { .exec(); const userObject = await mongoose.model('userAccessObject').create({ - AccessLevel: 'ReadWrite', + accessLevel: 'ReadWrite', robotId: ssot.id, userId: usableUserId, }); diff --git a/server/api/models/userAccessObjectModel.js b/server/api/models/userAccessObjectModel.js index aee53381..c276b333 100644 --- a/server/api/models/userAccessObjectModel.js +++ b/server/api/models/userAccessObjectModel.js @@ -3,7 +3,7 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; const userAccessSchema = new Schema({ - AccessLevel: String, + accessLevel: String, robotId: { type: mongoose.Types.ObjectId, required: [true, 'RobotId required'], diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index 23fb3284..2b768a02 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -56,7 +56,7 @@ describe('POST /users/robotAccess', () => { body: { userId: testUserId, robotId: testRobotId, - AccessLevel: 'ReadWrite', + accessLevel: 'ReadWrite', }, }); const response = httpMocks.createResponse(); diff --git a/server/utils/openApiDocumentation/openApiComponents.js b/server/utils/openApiDocumentation/openApiComponents.js index 18a69265..0376c74c 100644 --- a/server/utils/openApiDocumentation/openApiComponents.js +++ b/server/utils/openApiDocumentation/openApiComponents.js @@ -120,11 +120,11 @@ * UserAccessObjects: * type: object * required: - * - AccessLevel + * - accessLevel * - robotId * - userId * properties: - * AccessLevel: + * accessLevel: * type: string * example: ReadWrite * robotId: diff --git a/server/utils/testing/testData.js b/server/utils/testing/testData.js index d1ec8511..9ced9b06 100644 --- a/server/utils/testing/testData.js +++ b/server/utils/testing/testData.js @@ -54,13 +54,13 @@ const testSsot = { }; const testUserAccessObject = { - AccessLevel: '0', + accessLevel: '0', robotId: testRobotId, userId: testUserId, }; const testUserAccessObject2 = { - AccessLevel: '0', + accessLevel: '0', robotId: '604a3ba6561e2d1fad4eda11', userId: user2Id, }; From 48fb9d6e1a64e1d7710770e7be70e446cc96e312 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 17:00:42 +0200 Subject: [PATCH 081/149] renaming in rpa-task: Code, Application, Task to lower case --- .../robotCodeTestData.js | 18 +++++------ .../robotCodeToSsotParsing.js | 20 ++++++------- .../functionalities.js | 2 +- .../rpaFrameworkCommandsController.js | 4 +-- server/api/models/rpaTaskModel.js | 6 ++-- server/api/models/rpaTaskModel.test.js | 12 ++++---- .../functionalities/functionalities.test.js | 14 ++++----- .../generateCodeForRpaTasks.js | 2 +- server/utils/testing/testData.js | 30 +++++++++---------- 9 files changed, 54 insertions(+), 54 deletions(-) diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js index 44284fb4..444a112a 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeTestData.js @@ -6,9 +6,9 @@ const correctTaskSection = const taskAndApplicationCombinations = [ { _id: '6061d5627dee5516b3824ade', - Application: 'Excel.Application', - Task: 'Open Application', - Code: 'Open Application', + application: 'Excel.Application', + task: 'Open Application', + code: 'Open Application', outputValue: false, inputVars: [ { @@ -29,9 +29,9 @@ const taskAndApplicationCombinations = [ }, { _id: '6085975cae268e739f0f3b95', - Application: 'Testing', - Task: 'TaskWithOutput', - Code: 'TaskWithOutput', + application: 'Testing', + task: 'TaskWithOutput', + code: 'TaskWithOutput', outputValue: true, inputVars: [ { @@ -46,9 +46,9 @@ const taskAndApplicationCombinations = [ }, { _id: '6062e52f241bffc33838f279', - Application: 'HTTP', - Task: 'Get Request', - Code: 'Get Request', + application: 'HTTP', + task: 'Get Request', + code: 'Get Request', outputValue: false, inputVars: [ { diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index e792e11d..014e6eaf 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -172,7 +172,7 @@ const currentLineWithoutOutputValueName = (completeLine, splitPlaceholder) => { const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { let numberOfOccurrences = 0; allMatchingCombinations.forEach((singleObject) => { - if (singleObject.Task === rpaTask) { + if (singleObject.task === rpaTask) { numberOfOccurrences += 1; } }); @@ -201,7 +201,7 @@ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { if (numberOfOccurrences > 1) { let correctExampleText = ''; allMatchingCombinations.forEach((singleCombination) => { - correctExampleText += `\n${singleCombination.Application}.${rpaTask}`; + correctExampleText += `\n${singleCombination.application}.${rpaTask}`; }); customNotification( 'Error', @@ -267,10 +267,10 @@ const getInstructionBlocksFromTaskSection = ( let rpaTask = getRpaTask(currentLine, splitPlaceholder); const allMatchingCombinations = taskAndApplicationCombinations.filter( (singleCombination) => { - if (rpaTask === singleCombination.Task) return true; + if (rpaTask === singleCombination.task) return true; if ( - rpaTask.endsWith(singleCombination.Task) && - rpaTask.startsWith(singleCombination.Application) + rpaTask.endsWith(singleCombination.task) && + rpaTask.startsWith(singleCombination.application) ) return true; @@ -287,7 +287,7 @@ const getInstructionBlocksFromTaskSection = ( return; } - rpaTask = rpaTask.replace(`${matchingCombination.Application}.`, ''); + rpaTask = rpaTask.replace(`${matchingCombination.application}.`, ''); const rpaParameters = getRpaParameters(currentLine, splitPlaceholder); @@ -295,7 +295,7 @@ const getInstructionBlocksFromTaskSection = ( instructionBlocks[instructionBlocks.length - 1].paramArray = rpaParameters; instructionBlocks[instructionBlocks.length - 1].rpaApplication = - matchingCombination.Application; + matchingCombination.application; } }); return errorWasThrown ? undefined : instructionBlocks; @@ -369,8 +369,8 @@ const buildSingleParameterObject = ( const combinationObject = taskAndApplicationCombinations.filter( (singleCombinationObject) => - singleCombinationObject.Application === rpaApplication && - singleCombinationObject.Task === rpaTask + singleCombinationObject.application === rpaApplication && + singleCombinationObject.task === rpaTask )[0]; const parameterArray = combinationObject.inputVars.map( @@ -439,7 +439,7 @@ const getElementsArray = ( ); taskAndApplicationCombinations = taskAndApplicationCombinations.filter( (singleCombination) => - declaredApplications.includes(singleCombination.Application) + declaredApplications.includes(singleCombination.application) ); const instructionArray = getInstructionBlocksFromTaskSection( diff --git a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js index 7988a3db..f616530d 100644 --- a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js +++ b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js @@ -15,7 +15,7 @@ const getRpaFunctionalitiesObject = (application, task) => { sessionStorage.getItem(FUNCTIONALITIES_STORAGE_PATH) ); return rpaFunctionalities.find( - (element) => element.Application === application && element.Task === task + (element) => element.application === application && element.task === task ); }; diff --git a/server/api/controllers/rpaFrameworkCommandsController.js b/server/api/controllers/rpaFrameworkCommandsController.js index 3e880849..64c02f10 100644 --- a/server/api/controllers/rpaFrameworkCommandsController.js +++ b/server/api/controllers/rpaFrameworkCommandsController.js @@ -23,7 +23,7 @@ const rpaModels = require('../models/rpaTaskModel'); exports.getAvailableApplications = async (req, res) => { try { res.set('Content-Type', 'application/json'); - const tasks = await mongoose.model('rpa-task').distinct('Application'); + const tasks = await mongoose.model('rpa-task').distinct('application'); res.send(tasks); } catch (err) { console.error(err); @@ -64,7 +64,7 @@ exports.getAvailableTasksForApplications = async (req, res) => { if (application != null) { await mongoose .model('rpa-task') - .distinct('Task', { Application: application }, (err, tasks) => { + .distinct('task', { application }, (err, tasks) => { res.send(tasks); }); } else { diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index e6d72abf..ff7efda5 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -11,9 +11,9 @@ const rpaParameterSchema = new Schema({ }); const rpaTaskSchema = new Schema({ - Application: { type: String, required: [true, 'Application required'] }, - Task: { type: String, required: [true, 'Task required'] }, - Code: { type: String, required: [true, 'Code required'] }, + application: { type: String, required: [true, 'Application required'] }, + task: { type: String, required: [true, 'Task required'] }, + code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, inputVars: [rpaParameterSchema], Output: rpaParameterSchema, diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index ad8f4f73..7bf7ab51 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -35,24 +35,24 @@ describe('tasks have validation for missing parameters', () => { it('should be invalid if application is empty', async () => { task.save( (err) => - expect(err.errors.Application).to.exist && - expect(err.errors.Application.message).equal('Application required') + expect(err.errors.application).to.exist && + expect(err.errors.application.message).equal('Application required') ); }); it('should be invalid if task is empty', async () => { task.save( (err) => - expect(err.errors.Task).to.exist && - expect(err.errors.Task.message).equal('Task required') + expect(err.errors.task).to.exist && + expect(err.errors.task.message).equal('Task required') ); }); it('should be invalid if code is empty', async () => { task.save( (err) => - expect(err.errors.Code).to.exist && - expect(err.errors.Code.message).equal('Code required') + expect(err.errors.code).to.exist && + expect(err.errors.code.message).equal('Code required') ); }); }); diff --git a/server/api/routes/functionalities/functionalities.test.js b/server/api/routes/functionalities/functionalities.test.js index cff57397..2fd91b15 100644 --- a/server/api/routes/functionalities/functionalities.test.js +++ b/server/api/routes/functionalities/functionalities.test.js @@ -30,10 +30,10 @@ describe('GET /functionalities/applications', () => { expect(response.statusCode).toBe(200); expect(data).toEqual([ - testData.testRpaTask1.Application, - testData.testRpaTask2.Application, - testData.testRpaTask4.Application, - testData.testRpaTask5.Application, + testData.testRpaTask1.application, + testData.testRpaTask2.application, + testData.testRpaTask4.application, + testData.testRpaTask5.application, ]); }); }); @@ -42,7 +42,7 @@ describe('GET /functionalities/{application}/tasks', () => { it('retrieves the list of all available tasks for an application correctly', async () => { const request = httpMocks.createRequest({ params: { - application: testData.testRpaTask1.Application, + application: testData.testRpaTask1.application, }, }); @@ -52,8 +52,8 @@ describe('GET /functionalities/{application}/tasks', () => { expect(response.statusCode).toBe(200); expect(data).toEqual([ - testData.testRpaTask1.Task, - testData.testRpaTask3.Task, + testData.testRpaTask1.task, + testData.testRpaTask3.task, ]); }); }); diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 6ed8b5e7..5c640d91 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -152,7 +152,7 @@ const generateCodeForRpaTasks = async (elements, parameters, attributes) => { const groupedByTask = await mongoose .model('rpa-task') - .aggregate([{ $group: { _id: '$Task', count: { $sum: 1 } } }]); + .aggregate([{ $group: { _id: '$task', count: { $sum: 1 } } }]); const listOfDuplicates = groupedByTask .filter((singleTask) => singleTask.count > 1) // eslint-disable-next-line no-underscore-dangle diff --git a/server/utils/testing/testData.js b/server/utils/testing/testData.js index 9ced9b06..01396b4c 100644 --- a/server/utils/testing/testData.js +++ b/server/utils/testing/testData.js @@ -67,9 +67,9 @@ const testUserAccessObject2 = { const numberOfTestTasks = 5; const testRpaTask1 = { - Application: 'Browser', - Task: 'Click Button', - Code: 'Click Button', + application: 'Browser', + task: 'Click Button', + code: 'Click Button', outputValue: false, inputVars: [ { @@ -83,9 +83,9 @@ const testRpaTask1 = { }; const testRpaTask2 = { - Application: 'Excel', - Task: 'Input Text', - Code: 'Input Text', + application: 'Excel', + task: 'Input Text', + code: 'Input Text', outputValue: false, inputVars: [ { @@ -106,9 +106,9 @@ const testRpaTask2 = { }; const testRpaTask3 = { - Application: 'Browser', - Task: 'Input Password', - Code: 'Input Password', + application: 'Browser', + task: 'Input Password', + code: 'Input Password', outputValue: false, inputVars: [ { @@ -122,9 +122,9 @@ const testRpaTask3 = { }; const testRpaTask4 = { - Application: 'Excel.Application', - Task: 'Open Workbook', - Code: 'Open Workbook', + application: 'Excel.Application', + task: 'Open Workbook', + code: 'Open Workbook', outputValue: false, inputVars: [ { @@ -138,9 +138,9 @@ const testRpaTask4 = { }; const testRpaTask5 = { - Application: 'Excel.Files', - Task: 'Open Workbook', - Code: 'Open Workbook', + application: 'Excel.Files', + task: 'Open Workbook', + code: 'Open Workbook', outputValue: false, inputVars: [ { From 3a9709645098d15dd3c72e1bce85af43c49f12a1 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 17:12:50 +0200 Subject: [PATCH 082/149] camelCasing of robotLog json file --- .../RobotInteractionExecutionSection.jsx | 4 +- .../subComponents/RobotLogEntryCard.jsx | 2 +- server/api/models/robotJobModel.js | 2 +- server/socket/socketHelper.test.js | 4 +- server/socket/socketHelperFunctions.js | 4 +- server/socket/socketManager.js | 8 ++-- server/utils/testing/testData.js | 44 +++++++++---------- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 759e4735..7060a956 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -90,8 +90,8 @@ const RobotInteractionExecutionSection = (props) => { Robot Run Logs - {executionLogs.robot_run && - executionLogs.robot_run.activities.map((log) => ( + {executionLogs.robotRun && + executionLogs.robotRun.activities.map((log) => ( { style={{ margin: '10px' }} headStyle={{ 'font-weight': 'bold' }} hoverable - title={log.activity_name} + title={log.activityName} size='small' type='inner' > diff --git a/server/api/models/robotJobModel.js b/server/api/models/robotJobModel.js index c1539d74..b799da0f 100644 --- a/server/api/models/robotJobModel.js +++ b/server/api/models/robotJobModel.js @@ -13,7 +13,7 @@ const tasksStatusSchema = new Schema({ }); const activityErrorSchema = new Schema({ - activity_name: { type: String, required: [true, 'Activity name required'] }, + activityName: { type: String, required: [true, 'Activity name required'] }, tasks: { type: [tasksStatusSchema], required: [true, 'At least on task required'], diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index 79c760cf..773f753d 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -106,12 +106,12 @@ describe('updating of job', () => { const foundJob = await mongoose.model('job').findById(testData.testJob._id); expect(foundJob.loggedErrors.length).toEqual(2); - expect(foundJob.loggedErrors[0].activity_name).toBe('Browser3'); + expect(foundJob.loggedErrors[0].activityName).toBe('Browser3'); expect(foundJob.loggedErrors[0].tasks.length).toBe(2); expect(foundJob.loggedErrors[0].message).toBe( "No keyword with name 'Open Chro Browser' found. Did you mean:\n RPA.Browser.Selenium.Open Chrome Browser" ); - expect(foundJob.loggedErrors[1].activity_name).toBe('Save file'); + expect(foundJob.loggedErrors[1].activityName).toBe('Save file'); expect(foundJob.loggedErrors[1].message).toBe('Test Failing Message'); }); }); diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 84dff022..30e21540 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -111,10 +111,10 @@ exports.updateRobotJobStatus = async (jobId, status) => { * @param {Array} errorLog the list of logs of the robots activites */ exports.updateRobotJobErrors = async (jobId, errorLog) => { - const errors = errorLog.robot_run.activities + const errors = errorLog.robotRun.activities .filter((activity) => activity.status === 'FAIL') .map((activity) => ({ - activity_name: activity.activity_name, + activityName: activity.activityName, tasks: activity.tasks, message: activity.message, })); diff --git a/server/socket/socketManager.js b/server/socket/socketManager.js index e418ad01..b4c41e13 100644 --- a/server/socket/socketManager.js +++ b/server/socket/socketManager.js @@ -78,16 +78,16 @@ exports.socketManager = (io, socket) => { socket.on('updatedLiveRobotLog', ({ userId, jobId, robotLogs }) => { io.to(userId).emit('changedRobotStatus', 'running'); - if (robotLogs.final_message === 'Execution completed') { + if (robotLogs.finalMessage === 'Execution completed') { socketHelperFunctions.updateRobotJobStatus( jobId, - robotLogs.robot_run.status === 'FAIL' ? 'failed' : 'successful' + robotLogs.robotRun.status === 'FAIL' ? 'failed' : 'successful' ); io.to(userId).emit( 'changedRobotStatus', - robotLogs.robot_run.status === 'FAIL' ? 'failed' : 'successful' + robotLogs.robotRun.status === 'FAIL' ? 'failed' : 'successful' ); - if (robotLogs.robot_run.status === 'FAIL') { + if (robotLogs.robotRun.status === 'FAIL') { socketHelperFunctions.updateRobotJobErrors(jobId, robotLogs); } } diff --git a/server/utils/testing/testData.js b/server/utils/testing/testData.js index 01396b4c..9f9170b7 100644 --- a/server/utils/testing/testData.js +++ b/server/utils/testing/testData.js @@ -255,72 +255,72 @@ const testRobotCode = '*** Settings *** Library RPA.Excel.Application Library RPA.Browser *** Tasks *** FirstActivity RPA.Excel.Application.Open Workbook C://Users/Filepath SecondActivity Find Empty Row StonksOnlyGoUp.xls ThirdActivity Open Browser TESTVALUE'; const failingRobotRunLog = { - robot_run: { + robotRun: { name: 'DanielTest2', - activity_count: 8, + activityCount: 8, activities: [ { - activity_name: 'Browser1', - tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], + activityName: 'Browser1', + tasks: [{ taskName: 'Open Chrome Browser', status: 'PASS' }], status: 'PASS', message: '', }, { - activity_name: 'Say hello', - tasks: [{ task_name: 'Open Workbook', status: 'PASS' }], + activityName: 'Say hello', + tasks: [{ taskName: 'Open Workbook', status: 'PASS' }], status: 'PASS', message: '', }, { - activity_name: 'Say Goodbye!', + activityName: 'Say Goodbye!', tasks: [ - { task_name: 'Set Worksheet Value', status: 'PASS' }, - { task_name: 'Set Worksheet Value', status: 'PASS' }, + { taskName: 'Set Worksheet Value', status: 'PASS' }, + { taskName: 'Set Worksheet Value', status: 'PASS' }, ], status: 'PASS', message: '', }, { - activity_name: 'Browser2', - tasks: [{ task_name: 'Open Chrome Browser', status: 'PASS' }], + activityName: 'Browser2', + tasks: [{ taskName: 'Open Chrome Browser', status: 'PASS' }], status: 'PASS', message: '', }, { - activity_name: 'Browser3', + activityName: 'Browser3', tasks: [ - { task_name: 'Open Chro Browser', status: 'FAIL' }, - { task_name: 'Set Worksheet Value', status: 'NOT RUN' }, + { taskName: 'Open Chro Browser', status: 'FAIL' }, + { taskName: 'Set Worksheet Value', status: 'NOT RUN' }, ], status: 'FAIL', message: "No keyword with name 'Open Chro Browser' found. Did you mean:\n RPA.Browser.Selenium.Open Chrome Browser", }, { - activity_name: 'Interrupt', - tasks: [{ task_name: 'Set Worksheet Value', status: 'PASS' }], + activityName: 'Interrupt', + tasks: [{ taskName: 'Set Worksheet Value', status: 'PASS' }], status: 'PASS', message: '', }, { - activity_name: 'Browser4', + activityName: 'Browser4', tasks: [ - { task_name: 'Open Chrome Browser', status: 'PASS' }, - { task_name: 'Set Worksheet Value', status: 'PASS' }, + { taskName: 'Open Chrome Browser', status: 'PASS' }, + { taskName: 'Set Worksheet Value', status: 'PASS' }, ], status: 'PASS', message: '', }, { - activity_name: 'Save file', - tasks: [{ task_name: 'Save Workbook', status: 'FAIL' }], + activityName: 'Save file', + tasks: [{ taskName: 'Save Workbook', status: 'FAIL' }], status: 'FAIL', message: 'Test Failing Message', }, ], status: 'FAIL', }, - final_message: 'Execution completed', + finalMessage: 'Execution completed', }; module.exports = { From f57bdba5907592cb15625df8f6fa709a27a11a85 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 25 May 2021 17:27:59 +0200 Subject: [PATCH 083/149] implement robotMetadata as Object and fix tests --- frontend/src/components/App.jsx | 4 +-- .../HeaderNavbar/HeaderNavbar.jsx | 4 +-- .../pages/RobotCodeEditor/RobotCodeEditor.jsx | 7 ++-- .../ModelerSidebar/ModelerSidebar.jsx | 3 +- .../modelerSidebarFunctionality.js | 11 ++++--- .../modelerSidebarFunctionality.test.js | 23 +++++++++---- .../pages/RobotModeler/RobotModeler.jsx | 14 +++++--- .../pages/RobotOverview/RobotOverview.jsx | 1 + .../pages/RobotOverview/RobotOverview.test.js | 4 +-- .../bpmnToSsotParsing/bpmnToSsotParsing.js | 9 ++++-- .../bpmnToSsotParsing.test.js | 9 +++++- .../robotCodeToSsotParsing.js | 9 ++++-- .../robotCodeToSsotParsing.test.js | 10 ++++-- .../localSsotController/ssot.js | 32 +++++++++++++++---- 14 files changed, 100 insertions(+), 40 deletions(-) diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index b0d58dd3..34a5b83a 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; -import Modeler from './pages/RobotModeler/RobotModeler'; +import RobotModeler from './pages/RobotModeler/RobotModeler'; import Home from './pages/Home/Home'; import Error from './pages/Error/Error'; import RobotFile from './pages/RobotCodeEditor/RobotCodeEditor'; @@ -17,7 +17,7 @@ const App = () => (
- + { selectedKey === bpmnModelerPageKey || selectedKey === robotCodeEditorPageKey ) { - const robotId = JSON.parse(sessionStorage.getItem('robotId')); - bpmnModelerLink += `/${robotId}`; + bpmnModelerLink += `/${getRobotId()}`; } return ( diff --git a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx index 559eb0ac..23729c84 100644 --- a/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx +++ b/frontend/src/components/pages/RobotCodeEditor/RobotCodeEditor.jsx @@ -5,7 +5,10 @@ import Editor from 'react-simple-code-editor'; import HeaderNavbar from '../../multiPageComponents/HeaderNavbar/HeaderNavbar'; import { getParsedRobotFile } from '../../../api/routes/robots/robots'; import { parseRobotCodeToSsot } from '../../../utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing'; -import { upsert } from '../../../utils/sessionStorage/localSsotController/ssot'; +import { + getRobotId, + upsert, +} from '../../../utils/sessionStorage/localSsotController/ssot'; import 'prismjs/components/prism-robotframework'; import 'prismjs/themes/prism.css'; import styles from './RobotCodeEditor.module.css'; @@ -36,7 +39,7 @@ const RobotFile = () => { * @description Equivalent to ComponentDidMount in class based components */ useEffect(() => { - const robotId = JSON.parse(sessionStorage.getItem('robotId')); + const robotId = getRobotId(); getParsedRobotFile(robotId) .then((response) => response.text()) .then((robotCode) => { diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx index ce1661e4..b43ee815 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/ModelerSidebar.jsx @@ -16,6 +16,7 @@ import { downloadRobotFile, onSaveToCloud, } from './modelerSidebarFunctionality/modelerSidebarFunctionality'; +import { getRobotName } from '../../../../utils/sessionStorage/localSsotController/ssot'; const { Title } = Typography; const { Sider } = Layout; @@ -73,7 +74,7 @@ const ModelerSidebar = ({ modeler, robotId }) => { - {sessionStorage.getItem('robotName')} + {getRobotName()} {elementState.selectedElements.length === 1 && ( { +const onSaveToCloud = async (modeler) => { const xml = await modeler.saveXML({ format: true }); - const result = await parseBpmnToSsot(xml, robotId); + const result = await parseBpmnToSsot(xml); const ssot = JSON.stringify(result); sessionStorage.setItem('ssotLocal', ssot); upsert(); @@ -41,7 +44,7 @@ const onSaveToCloud = async (modeler, robotId) => { */ const downloadRobotFile = async (robotId) => { const response = await (await getParsedRobotFile(robotId)).text(); - const fileName = `${sessionStorage.getItem('robotName')}.robot`; + const fileName = `${getRobotName()}.robot`; downloadString(response, 'text/robot', fileName); }; diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index bd4d3d18..bdb2019c 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -4,13 +4,12 @@ jest.mock('../../../../../api/routes/robots/robots'); jest.mock('./downloadStringAsFile'); -jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); jest.mock('../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'); +jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); jest.mock('../../../../../api/routes/functionalities/functionalities'); jest.mock('../../../../../utils/sessionStorage/localSsotController/parameters'); jest.mock('../../../../../utils/sessionStorage/localSsotController/attributes'); -jest.mock('../../../../../utils/sessionStorage/localSsotController/ssot'); import { nameChangedHandler, @@ -36,12 +35,23 @@ import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/func import constants from './modelerSidebarFunctionalityTestingUtils'; import { getParsedRobotFile } from '../../../../../api/routes/robots/robots'; import downloadString from './downloadStringAsFile'; -import { upsert } from '../../../../../utils/sessionStorage/localSsotController/ssot'; +import { + getRobotName, + upsert, +} from '../../../../../utils/sessionStorage/localSsotController/ssot'; import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing'; +import { initSessionStorage } from '../../../../../utils/sessionStorage/sessionStorageUtils'; describe('Robot Metadata Utilities Tests', () => { it('downloads the robot file', async () => { - sessionStorage.setItem('robotName', constants.MOCK_ROBOT_NAME); + initSessionStorage( + 'robotMetadata', + JSON.stringify({ robotName: constants.MOCK_ROBOT_NAME }) + ); + + getRobotName.mockImplementation( + () => JSON.parse(sessionStorage.getItem('robotMetadata')).robotName + ); getParsedRobotFile.mockImplementation((robotId) => { expect(robotId).toEqual(constants.MOCK_ROBOT_ID); @@ -66,9 +76,8 @@ describe('Robot Metadata Utilities Tests', () => { ); }); - parseBpmnToSsot.mockImplementation(async (xml, robotId) => { + parseBpmnToSsot.mockImplementation(async (xml) => { expect(xml).toEqual(constants.MOCK_XML); - expect(robotId).toEqual(constants.MOCK_ROBOT_ID); return constants.MOCK_PARSER_RESULT; }); @@ -353,7 +362,7 @@ describe('Sidebar Functionality: Task Change', () => { let setParameterListCallCounter = 0; const MOCK_SETTER_OBJECT = { setOutputValueName: (newName) => { - expect(newName === undefined || newName === 'setOutputValueName').toBe( + expect(newName === undefined || newName === 'OutputValueName').toBe( true ); setOutputValueNameCallCounter += 1; diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index 70f42639..d9363e62 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -6,7 +6,7 @@ import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/routes/robots/robots'; import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameter'; import { getAllAttributes } from '../../../api/routes/robots/rpaAttributes'; -import { setRobotId } from '../../../utils/sessionStorage/localSsotController/ssot'; +import { setRobotMetadata } from '../../../utils/sessionStorage/localSsotController/ssot'; import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import 'bpmn-js/dist/assets/diagram-js.css'; @@ -17,8 +17,9 @@ import 'bpmn-font/dist/css/bpmn-embedded.css'; * @category Frontend * @component */ -const Modeler = (match) => { +const RobotModeler = (match) => { const { robotId } = match.match.params; + setRobotMetadata(undefined, robotId); const [modeler, setModeler] = useState(null); const [robotName, setRobotName] = useState(); @@ -30,13 +31,16 @@ const Modeler = (match) => { * @description Equivalent to ComponentDidMount in class based components */ useEffect(() => { - setRobotId(robotId); initSessionStorage('idCounter', JSON.stringify('541')); + const robotMetadata = { + robotId, + }; + sessionStorage.setItem('robotMetadata', JSON.stringify(robotMetadata)); getSsot(robotId) .then((response) => response.json()) .then((data) => { sessionStorage.setItem('ssotLocal', JSON.stringify(data)); - sessionStorage.setItem('robotName', data.robotName); + setRobotMetadata(data.robotName, robotId); setRobotName(data.robotName); }) .catch((error) => { @@ -80,4 +84,4 @@ const Modeler = (match) => { ); }; -export default Modeler; +export default RobotModeler; diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 31003ae5..0b2b4b33 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -53,6 +53,7 @@ const RobotOverview = () => { */ useEffect(() => { initSessionStorage('currentUserId', '80625d115100a2ee8d8e695b'); + initSessionStorage('robotMetadata', JSON.stringify({})); retrieveBotList(userId); getAllRpaFunctionalities() .then((response) => response.json()) diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js index c38fb06b..e57a34b2 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js @@ -55,7 +55,7 @@ async function mockFetch(url) { beforeAll(() => jest.spyOn(window, 'fetch')); beforeEach(() => window.fetch.mockImplementation(mockFetch)); -describe('Testing functionality behind button to trigger function call for new but creation', () => { +describe('Testing functionality behind button to trigger function call for new robot creation', () => { it('checks if attempt to fetch occured twice', async () => { act(() => { // eslint-disable-next-line react/jsx-filename-extension @@ -69,6 +69,6 @@ describe('Testing functionality behind button to trigger function call for new b act(() => { userEvent.click(screen.getByText('Create new Robot')); }); - expect(window.fetch).toHaveBeenCalledTimes(2); + expect(window.fetch).toHaveBeenCalledTimes(3); }); }); diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index 746d640d..723fe991 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -1,4 +1,8 @@ import customNotification from '../../componentsFunctionality/notificationUtils'; +import { + getRobotId, + getRobotName, +} from '../../sessionStorage/localSsotController/ssot'; const { parseString } = require('xmljs2'); @@ -179,8 +183,9 @@ const getStartEventId = (bpmnJson) => { * @description Parses an JSON created from the xml of the bpmn model to the single source of truth * @returns {string} XML that has to be put in single source of truth file */ -const parseBpmnToSsot = async (bpmnXml, robotId) => { - const robotName = sessionStorage.getItem('robotName'); +const parseBpmnToSsot = async (bpmnXml) => { + const robotName = getRobotName(); + const robotId = getRobotId(); const bpmnJson = await parseString(bpmnXml.xml); const startEventId = getStartEventId(bpmnJson); diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js index fe99f254..9a57be4e 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js @@ -1,3 +1,9 @@ +const { + setRobotMetadata, +} = require('../../sessionStorage/localSsotController/ssot.js'); +const { + initSessionStorage, +} = require('../../sessionStorage/sessionStorageUtils.js'); const parser = require('./bpmnToSsotParsing.js'); const BPMN_XML = { @@ -8,7 +14,8 @@ const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; describe('Parsing Tests', () => { it('successfully parses the bpmn to ssot', async () => { // expect.assertions(1); - sessionStorage.setItem('robotName', 'AwesomeTestRobot'); + initSessionStorage('robotMetadata', JSON.stringify({})); + setRobotMetadata('AwesomeTestRobot', ROBOT_ID); const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); expect(Ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); expect(Ssot).toHaveProperty('starterId', 'Event_1wm4a0f'); diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 79cbf105..09f5825b 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -3,6 +3,11 @@ * @module */ +import { + getRobotId, + getRobotName, +} from '../../sessionStorage/localSsotController/ssot'; + const { default: customNotification, } = require('../../componentsFunctionality/notificationUtils'); @@ -538,8 +543,8 @@ const getLineNumberForSelector = (robotCodeAsArray, selector) => { * @returns Single source of truth as a JavaSctipt-object or undefined if an error occures */ const parseRobotCodeToSsot = (robotCode) => { - const robotId = JSON.parse(sessionStorage.getItem('robotId')); - const robotName = sessionStorage.getItem('robotName'); + const robotName = getRobotName(); + const robotId = getRobotId(); const robotCodeAsArray = getRobotCodeAsArray(robotCode); const lineNumberSettingsSelector = getLineNumberForSelector( diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index 5615c566..b7ad5765 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -15,8 +15,12 @@ const parser = require('./robotCodeToSsotParsing'); const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; -sessionStorage.setItem('robotName', 'AwesomeTestRobot'); -sessionStorage.setItem('robotId', '12345678'); +const robotMetadata = { + robotName: 'AwesomeTestRobot', + robotId: '12345678', +}; + +sessionStorage.setItem('robotMetadata', JSON.stringify(robotMetadata)); sessionStorage.setItem( 'availableApplications', '["Excel.Application","Excel.Files","HTTP","Testing"]' @@ -39,7 +43,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { sessionStorage.setItem('idCounter', '5416'); const ssot = parser.parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); - expect(ssot).toHaveProperty('_id', 12345678); + expect(ssot).toHaveProperty('_id', '12345678'); expect(ssot).toHaveProperty('starterId', 'Event_0ay5417'); }); diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 41cfc2de..159cdcfc 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -23,7 +23,7 @@ import { deleteUnusedAttributesFromDB, } from './attributes'; -const ROBOT_ID_PATH = 'robotId'; +const ROBOT_METADATA_PATH = 'robotMetadata'; const ATTRIBUTE_STORAGE_PATH = 'attributeLocalStorage'; const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; @@ -31,14 +31,26 @@ const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; * @description Gets the robotId of the currently opened robot from the session storage * @returns Currently saved robotId */ -const getRobotId = () => JSON.parse(sessionStorage.getItem(ROBOT_ID_PATH)); +const getRobotId = () => + JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)).robotId; /** - * @description Writes the robotId of the currently opened robot into the session storage + * @description Gets the robotName of the currently opened robot from the session storage + * @returns Currently saved robotName + */ +const getRobotName = () => + JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)).robotName; + +/** + * @description Writes the robotId and the robotName of the currently opened robot into the session storage + * @param {String} robotName The robotName ot the currently opened robot * @param {String} robotId The robotId ot the currently opened robot */ -const setRobotId = (robotId) => { - sessionStorage.setItem(ROBOT_ID_PATH, JSON.stringify(robotId)); +const setRobotMetadata = (robotName, robotId) => { + const robotMetadata = JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)); + if (typeof robotName !== 'undefined') robotMetadata.robotName = robotName; + if (typeof robotId !== 'undefined') robotMetadata.robotId = robotId; + sessionStorage.setItem(ROBOT_METADATA_PATH, JSON.stringify(robotMetadata)); }; /** @@ -50,7 +62,7 @@ const initSsotSessionStorage = (robotId) => { .then((response) => response.json()) .then((data) => { sessionStorage.setItem('ssotLocal', JSON.stringify(data)); - sessionStorage.setItem('robotName', data.robotName); + setRobotMetadata(data.robotName, robotId); }) .catch((error) => { console.error(error); @@ -140,4 +152,10 @@ const upsert = async () => { ); }; -export { setRobotId, initSsotSessionStorage, upsert }; +export { + setRobotMetadata, + getRobotName, + getRobotId, + initSsotSessionStorage, + upsert, +}; From a4e95d57ed2e4afbc49c1453101cb92fa853508b Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 25 May 2021 17:30:52 +0200 Subject: [PATCH 084/149] fix further es lint warnings --- frontend/package-lock.json | 23986 +--------------- .../pages/RobotOverview/RobotOverview.test.js | 1 - .../bpmnToSsotParsing.test.js | 5 +- .../robotCodeToSsotParsing.test.js | 1 + 4 files changed, 48 insertions(+), 23945 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7ecf7ced..0afb3397 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,23897 +1,8 @@ { "name": "ark-automate", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "ark-automate", - "version": "0.1.0", - "dependencies": { - "@ant-design/icons": "^4.4.0", - "@craco/craco": "^6.1.1", - "antd": "^4.8.2", - "body-parser": "^1.18.3", - "bpmn-font": "^0.10.0", - "bpmn-js": "^7.4.0", - "bpmn-js-cli": "^2.0.2", - "bpmn-js-properties-panel": "^0.37.5", - "camunda-bpmn-moddle": "^4.4.1", - "craco-antd": "^1.19.0", - "craco-less": "^1.17.1", - "prismjs": "^1.23.0", - "prop-types": "^15.7.2", - "react": "^17.0.1", - "react-dom": "^17.0.1", - "react-router-dom": "^5.2.0", - "react-scripts": "4.0.0", - "react-simple-code-editor": "^0.11.0", - "socket.io-client": "^4.0.0", - "web-vitals": "^0.2.4", - "xmljs2": "^1.0.0" - }, - "devDependencies": { - "@testing-library/jest-dom": "^5.11.10", - "@testing-library/react": "^11.2.6", - "@testing-library/user-event": "^12.8.3", - "better-docs": "^2.3.2", - "eslint": "^7.17.0", - "eslint-config-airbnb": "^18.2.1", - "eslint-config-prettier": "^7.1.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-only-warn": "^1.0.2", - "eslint-plugin-react": "^7.22.0", - "eslint-plugin-react-hooks": "^4.2.0", - "jsdoc": "^3.6.6" - } - }, - "node_modules/@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "node_modules/@ant-design/icons": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.6.2.tgz", - "integrity": "sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==", - "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.0.0", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-util": "^5.9.4" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/@ant-design/icons-svg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz", - "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==" - }, - "node_modules/@ant-design/react-slick": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.3.tgz", - "integrity": "sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg==", - "dependencies": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "lodash": "^4.17.21", - "resize-observer-polyfill": "^1.5.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" - }, - "node_modules/@babel/core": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", - "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", - "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", - "dependencies": { - "@babel/types": "^7.13.16", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", - "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", - "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", - "dependencies": { - "@babel/types": "^7.13.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", - "dependencies": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", - "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", - "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", - "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.17", - "@babel/types": "^7.13.17" - } - }, - "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", - "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", - "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz", - "integrity": "sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", - "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", - "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", - "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", - "dependencies": { - "regenerator-transform": "^0.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/polyfill": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", - "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", - "deprecated": "🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.", - "dev": true, - "dependencies": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", - "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", - "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.15", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.14", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", - "semver": "^6.3.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.17.tgz", - "integrity": "sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.17.tgz", - "integrity": "sha512-RGXINY1YvduBlGrP+vHjJqd/nK7JVpfM4rmZLGMx77WoL3sMrhheA0qxii9VNn1VHnxJLEyxmvCB+Wqc+x/FMw==", - "dependencies": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/traverse": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", - "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.16", - "@babel/types": "^7.13.17", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/types": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", - "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@bpmn-io/extract-process-variables": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@bpmn-io/extract-process-variables/-/extract-process-variables-0.3.0.tgz", - "integrity": "sha512-cZMPBvVUXBn7++ZaOVQQGvhrMnFVcOP218yfYBKUv0EMYjo775ust/ZmfIgWd8llT4myXA6dPz12wcYXUBR1Bg==", - "dependencies": { - "min-dash": "^3.5.2" - }, - "peerDependencies": { - "camunda-bpmn-moddle": "^4.x" - } - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@craco/craco": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.1.1.tgz", - "integrity": "sha512-4irfOM8RgYNhFJzAXyIuM8CZLju2Jh9GdOem8uqM2/cI2xPulQSxZKU/9q3uiSbFUJfQLi3pomVKii6KzWLu3Q==", - "dependencies": { - "cross-spawn": "^7.0.0", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "webpack-merge": "^4.2.2" - }, - "bin": { - "craco": "bin/craco.js" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "react-scripts": "^4.0.0" - } - }, - "node_modules/@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz", - "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "deprecated": "Moved to 'npm install @sideway/address'" - }, - "node_modules/@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "deprecated": "This version has been deprecated and is no longer supported or maintained" - }, - "node_modules/@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "deprecated": "This version has been deprecated and is no longer supported or maintained" - }, - "node_modules/@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "deprecated": "Switch to 'npm install joi'", - "dependencies": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "node_modules/@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "deprecated": "This version has been deprecated and is no longer supported or maintained", - "dependencies": { - "@hapi/hoek": "^8.3.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/reporters/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/reporters/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz", - "integrity": "sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A==", - "dependencies": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.x" - }, - "peerDependencies": { - "@types/webpack": "4.x", - "react-refresh": "^0.8.3", - "sockjs-client": "^1.4.0", - "type-fest": "^0.13.1", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", - "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", - "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", - "dependencies": { - "ejs": "^2.6.1", - "magic-string": "^0.25.0" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.4.0.tgz", - "integrity": "sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg==", - "dependencies": { - "@babel/core": "^7.9.0", - "@babel/plugin-transform-react-constant-elements": "^7.9.0", - "@babel/preset-env": "^7.9.5", - "@babel/preset-react": "^7.9.4", - "@svgr/core": "^5.4.0", - "@svgr/plugin-jsx": "^5.4.0", - "@svgr/plugin-svgo": "^5.4.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@testing-library/dom": { - "version": "7.30.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.30.4.tgz", - "integrity": "sha512-GObDVMaI4ARrZEXaRy4moolNAxWPKvEYNV/fa6Uc2eAzR/t4otS6A7EhrntPBIQLeehL9DbVhscvvv7gd6hWqA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.4", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.12.0.tgz", - "integrity": "sha512-N9Y82b2Z3j6wzIoAqajlKVF1Zt7sOH0pPee0sUHXHc5cv2Fdn23r+vpWm0MBBoGJtPOly5+Bdx1lnc3CD+A+ow==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^4.2.2", - "chalk": "^3.0.0", - "css": "^3.0.0", - "css.escape": "^1.5.1", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/react": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.6.tgz", - "integrity": "sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^7.28.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" - }, - "node_modules/@types/aria-query": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", - "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/babel-types": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", - "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==", - "dev": true - }, - "node_modules/@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "dev": true, - "dependencies": { - "@types/babel-types": "*" - } - }, - "node_modules/@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" - }, - "node_modules/@types/eslint": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz", - "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==" - }, - "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "26.0.22", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz", - "integrity": "sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==", - "dev": true, - "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" - }, - "node_modules/@types/node": { - "version": "14.14.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", - "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" - }, - "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" - }, - "node_modules/@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.9.5", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz", - "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==", - "dev": true, - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/webpack": { - "version": "4.41.27", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.27.tgz", - "integrity": "sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==", - "dependencies": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", - "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", - "dependencies": { - "@typescript-eslint/experimental-utils": "4.22.0", - "@typescript-eslint/scope-manager": "4.22.0", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", - "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", - "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", - "dependencies": { - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "debug": "^4.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", - "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", - "dependencies": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", - "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", - "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", - "dependencies": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", - "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", - "dependencies": { - "@typescript-eslint/types": "4.22.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/align-text/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/antd": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/antd/-/antd-4.15.3.tgz", - "integrity": "sha512-SQdr8FpwubyV8NOrVyYLZGEp7gYLeaV/WXQuMy11EHtk3pBH48T645ts0hhdb1vl7z92+ViWlgHADEjKJVCJaw==", - "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons": "^4.6.2", - "@ant-design/react-slick": "~0.28.1", - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", - "lodash": "^4.17.21", - "moment": "^2.25.3", - "rc-cascader": "~1.4.0", - "rc-checkbox": "~2.3.0", - "rc-collapse": "~3.1.0", - "rc-dialog": "~8.5.1", - "rc-drawer": "~4.3.0", - "rc-dropdown": "~3.2.0", - "rc-field-form": "~1.20.0", - "rc-image": "~5.2.4", - "rc-input-number": "~7.0.1", - "rc-mentions": "~1.5.0", - "rc-menu": "~8.10.0", - "rc-motion": "^2.4.0", - "rc-notification": "~4.5.2", - "rc-pagination": "~3.1.6", - "rc-picker": "~2.5.10", - "rc-progress": "~3.1.0", - "rc-rate": "~2.9.0", - "rc-resize-observer": "^1.0.0", - "rc-select": "~12.1.6", - "rc-slider": "~9.7.1", - "rc-steps": "~4.1.0", - "rc-switch": "~3.2.0", - "rc-table": "~7.13.0", - "rc-tabs": "~11.7.0", - "rc-textarea": "~0.3.0", - "rc-tooltip": "~5.1.0", - "rc-tree": "~4.1.0", - "rc-tree-select": "~4.3.0", - "rc-trigger": "^5.2.1", - "rc-upload": "~4.2.0-alpha.0", - "rc-util": "^5.9.4", - "scroll-into-view-if-needed": "^2.2.25", - "warning": "^4.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ant-design" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/async-validator": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz", - "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/axe-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.4.tgz", - "integrity": "sha512-Pdgfv6iP0gNx9ejRGa3zE7Xgkj/iclXqLfe7BnatdZz0QnLZ3jrRHUVH8wNSdN68w05Sk3ShGTb3ydktMTooig==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "node_modules/babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "eslint": ">= 4.12.1" - } - }, - "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dependencies": { - "babylon": "^6.18.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dependencies": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 6.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/babel-loader/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-import": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.3.tgz", - "integrity": "sha512-1qCWdljJOrDRH/ybaCZuDgySii4yYrtQ8OJQwrcDqdt0y67N30ng3X3nABg6j7gR7qUJgcMa9OMhc4AGViDwWw==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/runtime": "^7.0.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", - "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.0", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", - "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.0", - "core-js-compat": "^3.9.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", - "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", - "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", - "dependencies": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-numeric-separator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-react-display-name": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/runtime": "7.12.1", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dependencies": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/babel-preset-react-app/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/babel-preset-react-app/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/babel-preset-react-app/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/babel-preset-react-app/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/better-docs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/better-docs/-/better-docs-2.3.2.tgz", - "integrity": "sha512-VlbXQgEftaynJSaPa853XB5WqTlPoQQr2TnxIkKi6OsyJJxF42Ke+9SIES/hqTe58aaBnuoDGrIzOso8RdNx6Q==", - "dev": true, - "dependencies": { - "brace": "^0.11.1", - "react-ace": "^6.5.0", - "react-docgen": "^5.3.0", - "react-frame-component": "^4.1.1", - "typescript": "^3.7.5", - "underscore": "^1.9.1", - "vue-docgen-api": "^3.22.0", - "vue2-ace-editor": "^0.0.13" - }, - "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0", - "typescript": "^3.6.4" - } - }, - "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/bpmn-font": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/bpmn-font/-/bpmn-font-0.10.0.tgz", - "integrity": "sha512-y5UhxANjxWFH3hgA/4ATpgiXEJVfn1V6j72ui+iiqf6qQDRS4ScWTdKvpHHRqQ/HR/3Jc8sFSxRcTHHb4E488A==" - }, - "node_modules/bpmn-js": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/bpmn-js/-/bpmn-js-7.5.0.tgz", - "integrity": "sha512-0ANaE6Bikg1GmkcvO7RK0MQPX+EKYKBc+q7OWk39/16NcCdNZ/4UiRcCr9n0u1VUCIDsSU/jJ79TIZFnV5CNjw==", - "dependencies": { - "bpmn-moddle": "^7.0.4", - "css.escape": "^1.5.1", - "diagram-js": "^6.8.2", - "diagram-js-direct-editing": "^1.6.1", - "ids": "^1.0.0", - "inherits": "^2.0.4", - "min-dash": "^3.5.2", - "min-dom": "^3.1.3", - "object-refs": "^0.3.0", - "tiny-svg": "^2.2.2" - } - }, - "node_modules/bpmn-js-cli": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bpmn-js-cli/-/bpmn-js-cli-2.0.2.tgz", - "integrity": "sha512-dYkyJZ6WXoV+DOV4COIERkL8eL93JSs5VWn/IuEl/7QCc3gE38aga/gSYysZ5GnSdsCKRweclrpR2YFhj3+YjA==", - "dependencies": { - "min-dash": "^3.1.0" - }, - "peerDependencies": { - "bpmn-js": "^1.x || ^2.x || ^3.x || ^4.x || ^5.x || ^6.x || ^7.x || ^8.x" - } - }, - "node_modules/bpmn-js-properties-panel": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-0.37.6.tgz", - "integrity": "sha512-1rP9r6ItL1gKqXezXnpr9eVsQtdufH6TNqxUs11Q68CtxeBAs0l1wEHw2f01i9ceHHxItmrZUTndqnASi89EYA==", - "dependencies": { - "@bpmn-io/extract-process-variables": "^0.3.0", - "ids": "^1.0.0", - "inherits": "^2.0.1", - "lodash": "^4.17.20", - "min-dom": "^3.1.3", - "scroll-tabs": "^1.0.1", - "selection-update": "^0.1.2" - }, - "peerDependencies": { - "bpmn-js": "^3.x || ^4.x || ^5.x || ^6.x || ^7.x" - } - }, - "node_modules/bpmn-moddle": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.0.5.tgz", - "integrity": "sha512-3OaoEJCHQdZeRBTmBtDJebXamweW03cgA5ymOZitddMY28Vo1dOwAX/Yg2X375d2QCeC5w/j5gI8V8iVRn12fg==", - "dependencies": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "moddle-xml": "^9.0.5" - } - }, - "node_modules/brace": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", - "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", - "dependencies": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/buffer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", - "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", - "dependencies": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camel-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camunda-bpmn-moddle": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/camunda-bpmn-moddle/-/camunda-bpmn-moddle-4.5.0.tgz", - "integrity": "sha512-g3d2ZaCac52WIXP3kwmYrBEkhm0nnXcWYNj5STDkmiWpDTKUzTj4ZIt38IRpci1Uj3a/rZACvXLnQj8xKFyp/w==", - "dependencies": { - "min-dash": "^3.0.0" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001216", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001216.tgz", - "integrity": "sha512-1uU+ww/n5WCJRwUcc9UH/W6925Se5aNnem/G5QaSDga2HzvjYMs8vRbekGUN/PnTZ7ezTHcxxTEb9fgiMYwH6Q==" - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/catharsis": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" - }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "optional": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", - "optional": true, - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/component-event": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz", - "integrity": "sha1-PeePwoeCOBeH4kvyp8U2vwFCybQ=" - }, - "node_modules/compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dependencies": { - "arity-n": "^1.0.4" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", - "dev": true, - "dependencies": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" - } - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/copy-anything": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", - "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", - "dependencies": { - "is-what": "^3.12.0" - } - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/copy-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.", - "hasInstallScript": true - }, - "node_modules/core-js-compat": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.11.0.tgz", - "integrity": "sha512-3wsN9YZJohOSDCjVB0GequOyHax8zFiogSX3XWLE28M1Ew7dTU57tgHjIylSBKSIouwmLBp3g61sKMz/q3xEGA==", - "dependencies": { - "browserslist": "^4.16.4", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-js-pure": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.11.0.tgz", - "integrity": "sha512-PxEiQGjzC+5qbvE7ZIs5Zn6BynNeZO9zHhrrWmkRff2SZLq0CE/H5LuZOJHhmOQ8L38+eMzEHAmPYWrUtDfuDQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/craco-antd": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/craco-antd/-/craco-antd-1.19.0.tgz", - "integrity": "sha512-MpbF2LQxb/POiR003oOkuAhHwpyRx1w5opyg7SA4/2og/FMRR/2oca/eqKYQ7vre2dOpt64gkQ5xWETktHWCQQ==", - "dependencies": { - "babel-plugin-import": "^1.13.1", - "craco-less": "1.17.0", - "less-vars-to-js": "^1.3.0" - }, - "peerDependencies": { - "@craco/craco": "^5.5.0", - "antd": ">= 3.0.0", - "react-scripts": "^3.4.3" - } - }, - "node_modules/craco-antd/node_modules/craco-less": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/craco-less/-/craco-less-1.17.0.tgz", - "integrity": "sha512-G+GPEKPPKiSvYDsnQWuj1C4CIuaY8w+iHvULHkNf5QWLE0LkPfSRf3frhRDJjFxtkThpLPSLjWndD9kx8bCWzw==", - "dependencies": { - "less": "^3.11.1", - "less-loader": "^6.1.0" - }, - "peerDependencies": { - "@craco/craco": "^5.5.0", - "react-scripts": "^3.3.0" - } - }, - "node_modules/craco-less": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/craco-less/-/craco-less-1.17.1.tgz", - "integrity": "sha512-T6V1aF3+eQZ22gUigHInX/i+ExPbWrnmdAhtuEXc4mOyhneDifmEzZFseq/BdRy1aUEs9s4z26jTxP+1I6P//g==", - "dependencies": { - "less": "^3.11.1", - "less-loader": "^6.1.0" - }, - "peerDependencies": { - "@craco/craco": "^5.5.0", - "react-scripts": "^3.3.0 || ^4.0.0" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, - "node_modules/css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dependencies": { - "postcss": "^7.0.5" - }, - "bin": { - "css-blank-pseudo": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "engines": { - "node": "*" - } - }, - "node_modules/css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dependencies": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "engines": { - "node": ">4" - } - }, - "node_modules/css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "bin": { - "css-has-pseudo": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", - "dependencies": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dependencies": { - "postcss": "^7.0.5" - }, - "bin": { - "css-prefers-color-scheme": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "node_modules/cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", - "dependencies": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", - "dependencies": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/date-fns": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.1.tgz", - "integrity": "sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA==", - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/default-gateway/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/default-gateway/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/default-gateway/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/diagram-js": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-6.8.2.tgz", - "integrity": "sha512-5EKYHjW2mmGsn9/jSenSkm8cScK5sO9eETBRQNIIzgZjxBDJn6eX964L2d7/vrAW9SeuijGUsztL9+NUinSsNg==", - "dependencies": { - "css.escape": "^1.5.1", - "didi": "^4.0.0", - "hammerjs": "^2.0.1", - "inherits": "^2.0.1", - "min-dash": "^3.5.0", - "min-dom": "^3.1.2", - "object-refs": "^0.3.0", - "path-intersection": "^2.2.0", - "tiny-svg": "^2.2.1" - } - }, - "node_modules/diagram-js-direct-editing": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/diagram-js-direct-editing/-/diagram-js-direct-editing-1.6.2.tgz", - "integrity": "sha512-hAiSnt6iETMLHBRsCU+XeATiV7u/rovlAX/l4MnvzW6+VeHqQOn+xFetD6JwxfTHKvT3h9fAQpfMZPOPlRFNlw==", - "dependencies": { - "min-dash": "^3.5.2", - "min-dom": "^3.1.3" - }, - "peerDependencies": { - "diagram-js": "^0.x || ^1.x || ^2.x || ^3.x || ^4.x || ^5.x || ^6.x || ^7.x" - } - }, - "node_modules/didi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/didi/-/didi-4.0.0.tgz", - "integrity": "sha512-AzMElh8mCHOPWPCWfGjoJRla31fMXUT6+287W5ef3IPmtuBcyG9+MkFS7uPP6v3t2Cl086KwWfRB9mESa0OsHQ==" - }, - "node_modules/diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "node_modules/dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz", - "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ==", - "dev": true - }, - "node_modules/dom-align": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.0.tgz", - "integrity": "sha1-EUg2F/dk+GlZdbS9x5sU8IA7Yps=" - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "hasInstallScript": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.720", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", - "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io-client": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.0.1.tgz", - "integrity": "sha512-CQtGN3YwfvbxVwpPugcsHe5rHT4KgT49CEcQppNtu9N7WxbPN0MAG27lGaem7bvtCFtGNLSL+GEqXsFSz36jTg==", - "dependencies": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "dependencies": { - "base64-arraybuffer": "0.1.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/enhanced-resolve/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/enhanced-resolve/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz", - "integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.21", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", - "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^14.2.1", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsx-a11y": "^6.4.1", - "eslint-plugin-react": "^7.21.5", - "eslint-plugin-react-hooks": "^4 || ^3 || ^2.3.0 || ^1.7.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1" - } - }, - "node_modules/eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", - "dependencies": { - "confusing-browser-globals": "^1.0.10" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0", - "@typescript-eslint/parser": "^4.0.0", - "babel-eslint": "^10.0.0", - "eslint": "^7.5.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jest": "^24.0.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.3", - "eslint-plugin-react-hooks": "^4.0.8", - "eslint-plugin-testing-library": "^3.9.0" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - }, - "eslint-plugin-testing-library": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dependencies": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", - "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", - "dependencies": { - "lodash": "^4.17.15", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", - "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/eslint-plugin-jest": { - "version": "24.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", - "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 4", - "eslint": ">=5" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", - "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "aria-query": "^4.2.2", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.0.2", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^3.1.0", - "language-tags": "^1.0.5" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/eslint-plugin-only-warn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.0.2.tgz", - "integrity": "sha512-DCG8vuUynDnyfkm0POT50JoE9VJfbtKf+COHn3q79+ExW4dg9ZWM/hsMWX1mjZqxMjQledL/9TmGipon/vwWmw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", - "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", - "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.3", - "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", - "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^3.10.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^5 || ^6 || ^7" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "dependencies": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", - "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", - "dependencies": { - "@types/eslint": "^7.2.6", - "arrify": "^2.0.1", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dependencies": { - "original": "^1.0.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "node_modules/filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" - }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/flush-write-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", - "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", - "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "engines": { - "node": ">=6.11.5", - "yarn": ">=1.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs-write-stream-atomic/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "optional": true, - "dependencies": { - "delegate": "^3.1.2" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "optional": true - }, - "node_modules/gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dependencies": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-webpack-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ids": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ids/-/ids-1.0.0.tgz", - "integrity": "sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw==" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "node_modules/is-core-module": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", - "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", - "dev": true, - "dependencies": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" - } - }, - "node_modules/is-expression/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", - "dependencies": { - "@jest/core": "^26.6.0", - "import-local": "^3.0.2", - "jest-cli": "^26.6.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-circus": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", - "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", - "@types/babel__traverse": "^7.0.4", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^26.6.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-config/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", - "dependencies": { - "@jest/types": "^26.6.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-resolve/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-runner/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runtime/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-runtime/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-snapshot/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-snapshot/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", - "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^26.0.0", - "jest-watcher": "^26.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "jest": "^26.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", - "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", - "dev": true, - "dependencies": { - "xmlcreate": "^2.0.3" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsdoc": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz", - "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.9.4", - "bluebird": "^3.7.2", - "catharsis": "^0.8.11", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.1", - "klaw": "^3.0.0", - "markdown-it": "^10.0.0", - "markdown-it-anchor": "^5.2.7", - "marked": "^0.8.2", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "taffydb": "2.6.2", - "underscore": "~1.10.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=8.15.0" - } - }, - "node_modules/jsdoc/node_modules/underscore": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", - "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", - "dev": true - }, - "node_modules/jsdom": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", - "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.1.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.4", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.1.tgz", - "integrity": "sha512-z716cpm5TX4uzOzILx8PavOE6C6DKshHDw1aQN52M/yNSqE9s5O8SMfyhCCfCJ3HmTL0NkVOi+8a/55T7YB3bg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", - "dependencies": { - "string-convert": "^0.2.0" - } - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "dev": true, - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "node_modules/jstransformer/node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", - "dependencies": { - "array-includes": "^3.1.2", - "object.assign": "^4.1.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dependencies": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/less": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", - "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", - "dependencies": { - "copy-anything": "^2.0.1", - "tslib": "^1.10.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "native-request": "^1.0.5", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz", - "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==", - "dependencies": { - "clone": "^2.1.2", - "less": "^3.11.3", - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/less-vars-to-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/less-vars-to-js/-/less-vars-to-js-1.3.0.tgz", - "integrity": "sha512-xeiLLn/IMCGtdyCkYQnW8UuzoW2oYMCKg9boZRaGI58fLz5r90bNJDlqGzmVt/1Uqk75/DxIVtQSNCMkE5fRZQ==", - "dependencies": { - "strip-json-comments": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/less-vars-to-js/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", - "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", - "dev": true, - "peerDependencies": { - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", - "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 8.16.2" - } - }, - "node_modules/matches-selector": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", - "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA==" - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dependencies": { - "mime-db": "1.47.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-dash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.7.0.tgz", - "integrity": "sha512-IlEbbItQU7tipoa4aAWocSuhR76jKqQG/N2+/Mh7d+BLZ3UmQl57ppKhziPY/TXBGps9+M8BC1c7AzqcYLp5BA==" - }, - "node_modules/min-dom": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.1.3.tgz", - "integrity": "sha512-Lbi1NZjLV9Hg6/bEe2Lfk2Fzsv1MwheR61whqTLP+FxLndYo9TxpksEgM5Kr1khjfCtFTMr0waeEfwIpStkRdw==", - "dependencies": { - "component-event": "^0.1.4", - "domify": "^1.3.1", - "indexof": "0.0.1", - "matches-selector": "^1.2.0" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", - "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", - "dependencies": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/mini-store": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.6.tgz", - "integrity": "sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==", - "dependencies": { - "hoist-non-react-statics": "^3.3.2", - "shallowequal": "^1.0.2" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/moddle": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.2.tgz", - "integrity": "sha512-nBEyKt7sDw6MlM6e85lTCEXButw+p7hubEoRo/JyX+dBzDcGjDoktPuby9QE+ylW1ABZqNvRy8pK0h+23tIW2g==", - "dependencies": { - "min-dash": "^3.0.0" - } - }, - "node_modules/moddle-xml": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.5.tgz", - "integrity": "sha512-1t9N35ZMQZTYZmRDoh1mBVd0XwLB34BkBywNJ0+YlLLYxaDBjFR/I+fqwsY746ayYPBz6yNRg8JpLyFgNF+eHg==", - "dependencies": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "saxen": "^8.1.2" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/move-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "optional": true - }, - "node_modules/native-url": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", - "dependencies": { - "querystring": "^0.2.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/node-libs-browser/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-refs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.3.0.tgz", - "integrity": "sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==" - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", - "dependencies": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dependencies": { - "retry": "^0.12.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parallel-transform/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/parallel-transform/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-intersection": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-2.2.1.tgz", - "integrity": "sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "dependencies": { - "ts-pnp": "^1.1.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dependencies": { - "postcss": "^7" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "browserslist": "^4" - } - }, - "node_modules/postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dependencies": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dependencies": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dependencies": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-colormin/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dependencies": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-selectors/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dependencies": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "dependencies": { - "postcss": "^7.0.26" - } - }, - "node_modules/postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/postcss-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dependencies": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dependencies": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dependencies": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dependencies": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dependencies": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dependencies": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-safe-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", - "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", - "dependencies": { - "postcss": "^8.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "8.2.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.12.tgz", - "integrity": "sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ==", - "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.22", - "source-map": "^0.6.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz", - "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-svgo/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dependencies": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "node_modules/postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=6.14.4" - } - }, - "node_modules/postcss/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/postcss/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/postcss/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/prismjs": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", - "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", - "optionalDependencies": { - "clipboard": "^2.0.0" - } - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "node_modules/promise-polyfill": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", - "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", - "dev": true, - "dependencies": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" - } - }, - "node_modules/pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", - "dev": true, - "dependencies": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" - } - }, - "node_modules/pug-code-gen": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", - "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", - "dev": true, - "dependencies": { - "constantinople": "^3.1.2", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" - } - }, - "node_modules/pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", - "dev": true - }, - "node_modules/pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", - "dev": true, - "dependencies": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", - "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" - } - }, - "node_modules/pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", - "dev": true, - "dependencies": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" - } - }, - "node_modules/pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", - "dev": true, - "dependencies": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" - } - }, - "node_modules/pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" - } - }, - "node_modules/pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", - "dev": true, - "dependencies": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" - } - }, - "node_modules/pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", - "dev": true - }, - "node_modules/pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", - "dev": true, - "dependencies": { - "pug-error": "^1.3.3" - } - }, - "node_modules/pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc-align": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz", - "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "dom-align": "^1.7.0", - "rc-util": "^5.3.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-cascader": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.2.tgz", - "integrity": "sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-checkbox": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-collapse": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.0.tgz", - "integrity": "sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.2.1", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-dialog": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz", - "integrity": "sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.6.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.3.1.tgz", - "integrity": "sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.7.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-dropdown": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz", - "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-trigger": "^5.0.4" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-field-form": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.0.tgz", - "integrity": "sha512-jkzsIfXR7ywEYdeAtktt1aLff88wxIPDLpq7KShHNl4wlsWrCE+TzkXBfjvVzYOVZt5GGrD8YDqNO/q6eaR/eA==", - "dependencies": { - "@babel/runtime": "^7.8.4", - "async-validator": "^3.0.3", - "rc-util": "^5.8.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">= 16.9.0", - "react-dom": ">= 16.9.0" - } - }, - "node_modules/rc-image": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.4.tgz", - "integrity": "sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-dialog": "~8.5.0", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-input-number": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.0.6.tgz", - "integrity": "sha512-J5DIoCKIunoPb16FEghaEOyNDuZXD5F9LxLNcqd31z/0e37XtuHgo4QF/TonKLsESwdg7UAzWhiD0K6PPrN3YQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.9.8" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-mentions": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.5.3.tgz", - "integrity": "sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-menu": "^8.0.1", - "rc-textarea": "^0.3.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-menu": { - "version": "8.10.7", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.10.7.tgz", - "integrity": "sha512-m/ypV7OjkkUsMdutzMUxEI8tWyi0Y1TQ5YkSDk7k2uv2aCKkHYEoDKsDAfcPeejo3HMo2z5unWE+jD+dCphraw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "mini-store": "^3.0.1", - "rc-motion": "^2.0.1", - "rc-trigger": "^5.1.2", - "rc-util": "^5.7.0", - "resize-observer-polyfill": "^1.5.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-motion": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.3.tgz", - "integrity": "sha512-GZLLFXHl/VqTfI7bSZNNZozcblNmDka1AAoQig7EZ6s0rWg5y0RlgrcHWO+W+nrOVbYfJDxoaQUoP2fEmvCWmA==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.2.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-notification": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.5.tgz", - "integrity": "sha512-YIfhTSw+h5GsSdgMnuMx24wqiPlg3FeamuOlkh9RkyHx+SeZVAKzQ0juy2NGvPEF2hDWi5xTqxUqLdo0L2AmGg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.2.0", - "rc-util": "^5.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-overflow": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.1.1.tgz", - "integrity": "sha512-bkGrxvWtz6xQfxBPBQcN8xOEHFCeG0R4pfLAku6kFLQF9NPMTt5HvT+Bq0+stqom9eI3WRlun6RPzfjTamPwew==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-pagination": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.6.tgz", - "integrity": "sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-picker": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.10.tgz", - "integrity": "sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "date-fns": "^2.15.0", - "moment": "^2.24.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "dayjs": "^1.8.30", - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-progress": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.3.tgz", - "integrity": "sha512-Jl4fzbBExHYMoC6HBPzel0a9VmhcSXx24LVt/mdhDM90MuzoMCJjXZAlhA0V0CJi+SKjMhfBoIQ6Lla1nD4QNw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-rate": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz", - "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-resize-observer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz", - "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-select": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-12.1.10.tgz", - "integrity": "sha512-LQdUhYncvcULlrNcAShYicc1obPtnNK7/rvCD+YCm0b2BLLYxl3M3b/HOX6o+ppPej+yZulkUPeU6gcgcp9nag==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.0.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.9.8", - "rc-virtual-list": "^3.2.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-slider": { - "version": "9.7.2", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.2.tgz", - "integrity": "sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-tooltip": "^5.0.1", - "rc-util": "^5.0.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-steps": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.3.tgz", - "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "classnames": "^2.2.3", - "rc-util": "^5.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-switch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", - "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-table": { - "version": "7.13.3", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.13.3.tgz", - "integrity": "sha512-oP4fknjvKCZAaiDnvj+yzBaWcg+JYjkASbeWonU1BbrLcomkpKvMUgPODNEzg0QdXA9OGW0PO86h4goDSW06Kg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tabs": { - "version": "11.7.3", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.3.tgz", - "integrity": "sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "^3.1.3", - "rc-menu": "^8.6.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.5.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-textarea": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.4.tgz", - "integrity": "sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.7.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tooltip": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz", - "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "rc-trigger": "^5.0.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tree": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz", - "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.0.0", - "rc-virtual-list": "^3.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-tree-select": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.2.tgz", - "integrity": "sha512-tkouzhl8OpbTg4C9tVuP8nJ5jiZS7/wiusOIcFVgswhs1V3Jc+XHMKpLhR01egJ1bgsW1A6VrVCz3udxtdJSDA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "^12.0.0", - "rc-tree": "^4.0.0", - "rc-util": "^5.0.5" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-trigger": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.5.tgz", - "integrity": "sha512-RlF5RpWqK+JeiFeQVOzwjLFzpNe2FowoXc/42azz+20wr/bYF1Q/MwprUK+3+vs/oFhLC0ht3/NlrslAo/OoWA==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-align": "^4.0.0", - "rc-motion": "^2.0.0", - "rc-util": "^5.5.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-upload": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.2.0.tgz", - "integrity": "sha512-BXtvBs1PnwLjaUzBBU5z4yb9NMSaxc6mUIoPmS9LUAzaTz12L3TLrwu+8dnopYUiyLmYFS3LEO7aUfEWBqJfSA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-util": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.10.1.tgz", - "integrity": "sha512-Mr3lpl6PYL/wr16t5p8BJVN/sb8+x9U2pf81ijoozzNOb5oTg/meeBnoPuiEaxHt1zTDRokZ5+V8xoErTjP2AA==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-util/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/rc-virtual-list": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz", - "integrity": "sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==", - "dependencies": { - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.0.7" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-ace": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-6.6.0.tgz", - "integrity": "sha512-Jehhp8bxa8kqiXk07Jzy+uD5qZMBwo43O+raniGHjdX7Qk93xFkKaAz8LxtUVZPJGlRnV5ODMNj0qHwDSN+PBw==", - "dev": true, - "dependencies": { - "@babel/polyfill": "^7.4.4", - "brace": "^0.11.1", - "diff-match-patch": "^1.0.4", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", - "dependencies": { - "core-js": "^3.6.5", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "whatwg-fetch": "^3.4.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-app-polyfill/node_modules/core-js": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.11.0.tgz", - "integrity": "sha512-bd79DPpx+1Ilh9+30aT5O1sgpQd4Ttg8oqkqi51ZzhedMM1omD2e6IOF48Z/DzDCZ2svp49tN/3vneTK6ZBkXw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", - "dependencies": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-dev-utils/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", - "dependencies": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/react-docgen": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.3.1.tgz", - "integrity": "sha512-YG7YujVTwlLslr2Ny8nQiUfbBuEwKsLHJdQTSdEga1eY/nRFh/7LjCWUn6ogYhu2WDKg4z+6W/BJtUi+DPUIlA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@babel/runtime": "^7.7.6", - "ast-types": "^0.14.2", - "commander": "^2.19.0", - "doctrine": "^3.0.0", - "neo-async": "^2.6.1", - "node-dir": "^0.1.10", - "strip-indent": "^3.0.0" - }, - "bin": { - "react-docgen": "bin/react-docgen.js" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" - }, - "node_modules/react-frame-component": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/react-frame-component/-/react-frame-component-4.1.3.tgz", - "integrity": "sha512-4PurhctiqnmC1F5prPZ+LdsalH7pZ3SFA5xoc0HBe8mSHctdLLt4Cr2WXfXOoajHBYq/yiipp9zOgx+vy8GiEA==", - "dev": true, - "peerDependencies": { - "prop-types": "^15.5.9", - "react": ">= 16.3", - "react-dom": ">= 16.3" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-refresh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-scripts": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.0.tgz", - "integrity": "sha512-icJ/ctwV5XwITUOupBP9TUVGdWOqqZ0H08tbJ1kVC5VpNWYzEZ3e/x8axhV15ZXRsixLo27snwQE7B6Zd9J2Tg==", - "dependencies": { - "@babel/core": "7.12.3", - "@pmmmwh/react-refresh-webpack-plugin": "0.4.2", - "@svgr/webpack": "5.4.0", - "@typescript-eslint/eslint-plugin": "^4.5.0", - "@typescript-eslint/parser": "^4.5.0", - "babel-eslint": "^10.1.0", - "babel-jest": "^26.6.0", - "babel-loader": "8.1.0", - "babel-plugin-named-asset-import": "^0.3.7", - "babel-preset-react-app": "^10.0.0", - "bfj": "^7.0.2", - "camelcase": "^6.1.0", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "4.3.0", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^7.11.0", - "eslint-config-react-app": "^6.0.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jest": "^24.1.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.21.5", - "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^3.9.2", - "eslint-webpack-plugin": "^2.1.0", - "file-loader": "6.1.1", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "4.5.0", - "identity-obj-proxy": "3.0.0", - "jest": "26.6.0", - "jest-circus": "26.6.0", - "jest-resolve": "26.6.0", - "jest-watch-typeahead": "0.6.1", - "mini-css-extract-plugin": "0.11.3", - "optimize-css-assets-webpack-plugin": "5.0.4", - "pnp-webpack-plugin": "1.6.4", - "postcss-flexbugs-fixes": "4.2.1", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "5.0.2", - "react-app-polyfill": "^2.0.0", - "react-dev-utils": "^11.0.0", - "react-refresh": "^0.8.3", - "resolve": "1.18.1", - "resolve-url-loader": "^3.1.2", - "sass-loader": "8.0.2", - "semver": "7.3.2", - "style-loader": "1.3.0", - "terser-webpack-plugin": "4.2.3", - "ts-pnp": "1.2.0", - "url-loader": "4.1.1", - "webpack": "4.44.2", - "webpack-dev-server": "3.11.0", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "5.1.4" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.1.3" - }, - "peerDependencies": { - "typescript": "^3.2.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/react-scripts/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/react-scripts/node_modules/resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", - "dependencies": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-simple-code-editor": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz", - "integrity": "sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==", - "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recast": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", - "integrity": "sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==", - "dev": true, - "dependencies": { - "ast-types": "0.12.4", - "esprima": "~4.0.0", - "private": "^0.1.8", - "source-map": "~0.6.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/ast-types": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", - "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dependencies": { - "regenerate": "^1.4.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", - "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", - "dependencies": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/resolve-url-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/resolve-url-loader/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/resolve-url-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url-loader/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/resolve-url-loader/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dependencies": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "node_modules/rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, - "node_modules/rework/node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" - }, - "node_modules/rework/node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "node_modules/rework/node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", - "dependencies": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - }, - "bin": { - "rollup": "dist/bin/rollup" - } - }, - "node_modules/rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "@babel/core": "7 || ^7.0.0-rc.2", - "rollup": ">=0.60.0 <3" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", - "dependencies": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", - "serialize-javascript": "^4.0.0", - "terser": "^4.6.2" - }, - "peerDependencies": { - "rollup": ">=0.66.0 <3" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" - }, - "node_modules/sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dependencies": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0", - "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/sass-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/sass-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/sass-loader/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxen": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz", - "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scroll-into-view-if-needed": { - "version": "2.2.28", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz", - "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==", - "dependencies": { - "compute-scroll-into-view": "^1.0.17" - } - }, - "node_modules/scroll-tabs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/scroll-tabs/-/scroll-tabs-1.0.1.tgz", - "integrity": "sha512-W4xjEwNS4QAyQnaJ450vQTcKpbnalBAfsTDV926WrxEMOqjyj2To8uv2d0Cp0oxMdk5TkygtzXmctPNc2zgBcg==", - "dependencies": { - "min-dash": "^3.1.0", - "min-dom": "^3.1.0", - "mitt": "^1.1.3" - } - }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "optional": true - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "node_modules/selection-update": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/selection-update/-/selection-update-0.1.2.tgz", - "integrity": "sha1-gDoETcxu2rWjrmSPXwNX6JrWa5Y=" - }, - "node_modules/selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "optional": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/socket.io-client": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.0.1.tgz", - "integrity": "sha512-6AkaEG5zrVuSVW294cH1chioag9i1OqnCYjKwTc3EBGXbnyb98Lw7yMa40ifLjFj3y6fsFKsd0llbUZUCRf3Qw==", - "dependencies": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.0.0", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-client/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", - "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "dependencies": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "node_modules/sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dependencies": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/sockjs-client/node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sockjs-client/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-http/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dependencies": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/table": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.5.1.tgz", - "integrity": "sha512-xGDXWTBJxahkzPQCsn1S9ESHEenU7TbMD5Iv4FeopXv/XwJyWatFjfbor+6ipI10/MNPXBYUamYukOrbPZ9L/w==", - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", - "dev": true - }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", - "dependencies": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", - "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "optional": true - }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "node_modules/tiny-svg": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.2.tgz", - "integrity": "sha512-u6zCuMkDR/3VAh83X7hDRn/pi0XhwG2ycuNS0cTFtQjGdOG2tSvEb8ds65VeGWc3H6PUjJKeunueXqgkZqtMsg==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", - "dev": true - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/ts-map": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-map/-/ts-map-1.0.3.tgz", - "integrity": "sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==", - "dev": true - }, - "node_modules/ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/uglify-js/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-js/node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-js/node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/url/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vue-docgen-api": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-3.26.0.tgz", - "integrity": "sha512-ujdg4i5ZI/wE46RZQMFzKnDGyhEuPCu+fMA86CAd9EIek/6+OqraSVBm5ZkLrbEd5f8xxdnqMU4yiSGHHeao/Q==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.2.3", - "@babel/types": "^7.0.0", - "ast-types": "^0.12.2", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.5", - "pug": "^2.0.3", - "recast": "^0.17.3", - "ts-map": "^1.0.3", - "typescript": "^3.2.2", - "vue-template-compiler": "^2.0.0" - } - }, - "node_modules/vue-docgen-api/node_modules/ast-types": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", - "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/vue-docgen-api/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/vue-docgen-api/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/vue-template-compiler": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", - "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "node_modules/vue2-ace-editor": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/vue2-ace-editor/-/vue2-ace-editor-0.0.13.tgz", - "integrity": "sha512-uQICyvJzYNix16xeYjNAINuNUQhPbqMR7UQsJeI+ycpEd2otsiNNU73jcZqHkpjuz0uaHDHnrpzQuI/RApsKXA==", - "dev": true, - "dependencies": { - "brace": "^0.11.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-vitals": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", - "integrity": "sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==" - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "dependencies": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/webpack-dev-server/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/webpack-dev-server/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/webpack-dev-server/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dependencies": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "2 || 3 || 4" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/webpack/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/webpack/node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dependencies": { - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "dev": true, - "dependencies": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - } - }, - "node_modules/with/node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/with/node_modules/acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "dependencies": { - "acorn": "^4.0.4" - } - }, - "node_modules/with/node_modules/acorn-globals/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-build": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", - "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", - "dependencies": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/runtime": "^7.8.4", - "@hapi/joi": "^15.1.0", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-replace": "^2.3.1", - "@surma/rollup-plugin-off-main-thread": "^1.1.1", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.6", - "lodash.template": "^4.5.0", - "pretty-bytes": "^5.3.0", - "rollup": "^1.31.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-terser": "^5.3.1", - "source-map": "^0.7.3", - "source-map-url": "^0.4.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "tempy": "^0.3.0", - "upath": "^1.2.0", - "workbox-background-sync": "^5.1.4", - "workbox-broadcast-update": "^5.1.4", - "workbox-cacheable-response": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-expiration": "^5.1.4", - "workbox-google-analytics": "^5.1.4", - "workbox-navigation-preload": "^5.1.4", - "workbox-precaching": "^5.1.4", - "workbox-range-requests": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4", - "workbox-streams": "^5.1.4", - "workbox-sw": "^5.1.4", - "workbox-window": "^5.1.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/workbox-build/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-core": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" - }, - "node_modules/workbox-expiration": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-google-analytics": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", - "dependencies": { - "workbox-background-sync": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-precaching": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-range-requests": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-routing": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/workbox-strategies": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", - "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" - } - }, - "node_modules/workbox-streams": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", - "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" - } - }, - "node_modules/workbox-sw": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", - "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "fast-json-stable-stringify": "^2.0.0", - "source-map-url": "^0.4.0", - "upath": "^1.1.2", - "webpack-sources": "^1.3.0", - "workbox-build": "^5.1.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/workbox-window": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", - "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", - "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dependencies": { - "microevent.ts": "~0.1.1" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xmlcreate": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", - "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", - "dev": true - }, - "node_modules/xmljs2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xmljs2/-/xmljs2-1.0.0.tgz", - "integrity": "sha512-tFNC4K//tqM+2haB1P1j/tcdTJMNQi3GxrbjYD/779yFfN7L84sh/hAbfAyOhSchcnC4B9dGXkH+3vVdUsFq2g==", - "dependencies": { - "promise-polyfill": "7.1.2", - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { "@ant-design/colors": { "version": "6.0.0", @@ -26102,6 +2213,12 @@ "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", "dev": true }, + "@types/babel-types": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", + "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==", + "dev": true + }, "@types/babel__core": { "version": "7.1.14", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", @@ -26139,12 +2256,6 @@ "@babel/types": "^7.3.0" } }, - "@types/babel-types": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", - "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==", - "dev": true - }, "@types/babylon": { "version": "6.16.5", "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", @@ -26668,8 +2779,7 @@ "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "requires": {} + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" }, "acorn-walk": { "version": "7.2.0", @@ -26713,14 +2823,12 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "requires": {} + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "align-text": { "version": "0.1.4", @@ -27275,8 +3383,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", - "requires": {} + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, "babel-plugin-polyfill-corejs2": { "version": "0.2.0", @@ -27677,6 +3784,7 @@ "react-ace": "^6.5.0", "react-docgen": "^5.3.0", "react-frame-component": "^4.1.1", + "typescript": "^3.7.5", "underscore": "^1.9.1", "vue-docgen-api": "^3.22.0", "vue2-ace-editor": "^0.0.13" @@ -30155,8 +6263,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-config-react-app": { "version": "6.0.0", @@ -30302,8 +6409,7 @@ "eslint-plugin-react-hooks": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", - "requires": {} + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" }, "eslint-plugin-testing-library": { "version": "3.10.2", @@ -33072,8 +9178,7 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "26.0.0", @@ -34265,8 +10370,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", - "dev": true, - "requires": {} + "dev": true }, "marked": { "version": "0.8.2", @@ -37629,8 +13733,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/react-frame-component/-/react-frame-component-4.1.3.tgz", "integrity": "sha512-4PurhctiqnmC1F5prPZ+LdsalH7pZ3SFA5xoc0HBe8mSHctdLLt4Cr2WXfXOoajHBYq/yiipp9zOgx+vy8GiEA==", - "dev": true, - "requires": {} + "dev": true }, "react-is": { "version": "17.0.2", @@ -37812,8 +13915,7 @@ "react-simple-code-editor": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz", - "integrity": "sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==", - "requires": {} + "integrity": "sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==" }, "read-pkg": { "version": "2.0.0", @@ -39694,21 +15796,6 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", @@ -39777,6 +15864,21 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -40507,7 +16609,8 @@ "typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==" + "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "dev": true }, "uc.micro": { "version": "1.0.6", @@ -41982,14 +18085,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -42015,6 +18110,14 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -42535,8 +18638,7 @@ "ws": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "requires": {} + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==" }, "xml-name-validator": { "version": "3.0.0", diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js index 8ba8b49e..28336624 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js @@ -10,7 +10,6 @@ import RobotOverview from './RobotOverview'; import '@testing-library/jest-dom'; const USER_ID = '80625d115100a2ee8d8e695b'; -const NEW_ROBOT_NAME = 'New Robot'; window.matchMedia = window.matchMedia || diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js index 0387360e..923b749a 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js @@ -1,4 +1,5 @@ -const parser = require('./bpmnToSsotParsing.js'); +/* eslint-disable no-undef */ +import { parseBpmnToSsot } from './bpmnToSsotParsing'; const BPMN_XML = { xml: 'Flow_0m7u6buFlow_0m7u6buFlow_08r9hfxFlow_08r9hfxFlow_1lycczuFlow_1lycczuFlow_19rmn01Flow_19rmn01', @@ -9,7 +10,7 @@ describe('Parsing Tests', () => { test('Parser testing', async () => { // expect.assertions(1); sessionStorage.setItem('robotName', 'AwesomeTestRobot'); - const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); + const Ssot = await parseBpmnToSsot(BPMN_XML, ROBOT_ID); expect(Ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); expect(Ssot).toHaveProperty('starterId', 'Event_1wm4a0f'); diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index f94a0a8b..905ee6b5 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ /* eslint-disable import/first */ import { correctSettingsSection, From 25021b8e471ce61b74fec4cb06c0fed9c17ed6c8 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 25 May 2021 17:46:17 +0200 Subject: [PATCH 085/149] Fix es lint warning undefined jest calls Co-authored-by: Sandro Sp --- frontend/.eslintrc.json | 3 ++- .../robotExecution.test.js | 1 - .../modelerSidebarFunctionality.test.js | 1 - .../modelerSidebarFunctionalityTestingUtils.js | 1 - .../src/components/pages/RobotOverview/RobotOverview.test.js | 1 - .../utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js | 1 - .../robotCodeToSsotParsing/robotCodeToSsotParsing.test.js | 1 - server/.eslintrc.json | 3 ++- server/api/models/robotJobModel.test.js | 2 +- server/api/models/rpaTaskModel.test.js | 1 - server/api/models/singleSourceOfTruthModel.test.js | 1 - server/api/models/userAccessObjectModel.test.js | 1 - server/api/routes/functionalities/functionalities.test.js | 1 - server/api/routes/robots/robots.test.js | 1 - server/api/routes/robots/rpaParameters/rpaParameters.test.js | 1 - server/api/routes/users/users.test.js | 1 - server/socket/socketHelper.test.js | 1 - .../ssotToRobotParsing/__tests__/SsotToRobotParser.test.js | 1 - 18 files changed, 5 insertions(+), 18 deletions(-) diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index e384903d..6e2073a5 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -1,7 +1,8 @@ { "env": { "browser": true, - "es2021": true + "es2021": true, + "jest": true }, "extends": [ "plugin:react/recommended", diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js index ac47f58a..0e921a60 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotExecution.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ import { configuredRobotParamsCorrectly, configuredRobotActivitesCorrectly, diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index faaa5c8b..da2022a6 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -1,6 +1,5 @@ /* eslint-disable no-shadow */ /* eslint-disable import/first */ -/* eslint-disable no-undef */ jest.mock('../../../../../api/routes/robots/robots'); jest.mock('./downloadStringAsFile'); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js index f1ee9197..0cdf6502 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionalityTestingUtils.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ const MOCK_ROBOT_ID = '0123456789abc0815'; const MOCK_CURRENT_ELEMENT_ID = '123450815'; const MOCK_ROBOT_NAME = 'testRobotFromTest'; diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js index 28336624..35e0f6bb 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js @@ -1,7 +1,6 @@ /* eslint-disable react/jsx-filename-extension */ /* eslint-disable func-names */ /* eslint-disable object-shorthand */ -/* eslint-disable no-undef */ import React from 'react'; import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js index 923b749a..c62260a7 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ import { parseBpmnToSsot } from './bpmnToSsotParsing'; const BPMN_XML = { diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index 905ee6b5..f94a0a8b 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable import/first */ import { correctSettingsSection, diff --git a/server/.eslintrc.json b/server/.eslintrc.json index e0d4ac0d..a42759e2 100644 --- a/server/.eslintrc.json +++ b/server/.eslintrc.json @@ -1,7 +1,8 @@ { "env": { "es2021": true, - "node": true + "node": true, + "jest": true }, "extends": [ "plugin:react/recommended", diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index 25527427..2a4193f3 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -1,5 +1,5 @@ /* eslint-disable no-unused-expressions */ -/* eslint-disable no-undef */ + const mongoose = require('mongoose'); const { expect } = require('chai'); const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); diff --git a/server/api/models/rpaTaskModel.test.js b/server/api/models/rpaTaskModel.test.js index 9512e20c..abab6181 100644 --- a/server/api/models/rpaTaskModel.test.js +++ b/server/api/models/rpaTaskModel.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); diff --git a/server/api/models/singleSourceOfTruthModel.test.js b/server/api/models/singleSourceOfTruthModel.test.js index ae6f99ae..53a8abd2 100644 --- a/server/api/models/singleSourceOfTruthModel.test.js +++ b/server/api/models/singleSourceOfTruthModel.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); diff --git a/server/api/models/userAccessObjectModel.test.js b/server/api/models/userAccessObjectModel.test.js index 2c9466bf..92d4dcb9 100644 --- a/server/api/models/userAccessObjectModel.test.js +++ b/server/api/models/userAccessObjectModel.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ const mongoose = require('mongoose'); const { expect } = require('chai'); const dbHandler = require('../../utils/testing/testDatabaseHandler.js'); diff --git a/server/api/routes/functionalities/functionalities.test.js b/server/api/routes/functionalities/functionalities.test.js index cff57397..d509a4d1 100644 --- a/server/api/routes/functionalities/functionalities.test.js +++ b/server/api/routes/functionalities/functionalities.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const httpMocks = require('node-mocks-http'); const dbHandler = require('../../../utils/testing/testDatabaseHandler'); diff --git a/server/api/routes/robots/robots.test.js b/server/api/routes/robots/robots.test.js index 74f03950..05b17d3c 100644 --- a/server/api/routes/robots/robots.test.js +++ b/server/api/routes/robots/robots.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); diff --git a/server/api/routes/robots/rpaParameters/rpaParameters.test.js b/server/api/routes/robots/rpaParameters/rpaParameters.test.js index 14261d6c..19ef2baa 100644 --- a/server/api/routes/robots/rpaParameters/rpaParameters.test.js +++ b/server/api/routes/robots/rpaParameters/rpaParameters.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index 3e74e896..cd9784de 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const httpMocks = require('node-mocks-http'); diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index 63b33f30..938cabb2 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ /* eslint-disable no-underscore-dangle */ const mongoose = require('mongoose'); const dbHandler = require('../utils/testing/testDatabaseHandler'); diff --git a/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js index 85c2c8cc..5671c4b3 100644 --- a/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js +++ b/server/utils/ssotToRobotParsing/__tests__/SsotToRobotParser.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-undef */ const parser = require('../ssotToRobotParser'); const testSsot = require('./SsotForTesting.json'); const dbHandler = require('../../testing/testDatabaseHandler'); From f219faf2c3c708624d68a6889bca15792d17da08 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 15:24:32 +0200 Subject: [PATCH 086/149] Revert "adapted wiki titles" This reverts commit 8b82d849eaa7c2adba9989656333f694cb4c67de. --- wiki/Documentation-Folder-Structure.md | 88 +- wiki/Documentation-Single-Source-of-Truth.md | 1152 +++++++++--------- wiki/How-To-Style-Using-CSS.md | 830 ++++++------- wiki/How-To-Write-Code-Documentation.md | 174 +-- wiki/How-To-Write-Tests.md | 272 ++--- wiki/Team-Scrum-Process.md | 146 +-- 6 files changed, 1331 insertions(+), 1331 deletions(-) diff --git a/wiki/Documentation-Folder-Structure.md b/wiki/Documentation-Folder-Structure.md index 1b9d1cdc..a7f95e46 100644 --- a/wiki/Documentation-Folder-Structure.md +++ b/wiki/Documentation-Folder-Structure.md @@ -1,44 +1,44 @@ -# General - -There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: - -- A **frontend/** folder with its own package.json. There you can find everything regarding the React frontend. -- A **server/** folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. -- A **wiki/** folder which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. -- A **.github/** folder which contains all workflows, our issue & pull request templates as well as some notes for the open source project. - -The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). - -## Server - -The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). -The central file here is the **server.js**. Here all the different routers are being used. - -- **api/**: Contains the routes, models and controllers of our API. -- **socket/**: Contains the socket manager who provides the socket rooms for communication -- **utils/**: Helper functions or files like the SsotToRobotParser, the openApiDocumentation or some testing files - -## Frontend - -On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. -The **public/** folder contains the known meta information of a web page, as well as the favicon. -Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: - -- **api/**: API call related functions. -- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. - Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. - In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. -- **layout/**: Contains our corporate design and customized theme. -- **resources/**: Contains images, fonts and other static files. -- **utils/**: Contains the following subfolders: - - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests - - **sessionStorage/**: Contains all the helper files we need to interact with the session storage - - **socket/**: Contains the socket connection file - -# Naming conventions - -- All components are saved as .jsx files (including index.jsx and App.jsx) -- All non-component JavaScript files are saved as .js -- Component names are written in _PascalCase_ -- Non-component JavaScript files are written in _camelCase_ -- The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. +# General + +There is a clear separation of the server side of the application and the client side (`frontend`). Therefore, next to the README and some config files, there are only four folders in the top structure: + +- A **frontend/** folder with its own package.json. There you can find everything regarding the React frontend. +- A **server/** folder with its own package.json. There you can find everything regarding the Node backend and the communication with the database. +- A **wiki/** folder which contains all wiki-documents as Markdown file. The pages can be edited in this folder and will be deployed to the wiki on merge to the `main` branch. +- A **.github/** folder which contains all workflows, our issue & pull request templates as well as some notes for the open source project. + +The local client which is required to run the created robots is located in a [separate repository](https://github.com/bptlab/ark_automate_local). + +## Server + +The basic structure is explained [here](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/routes). +The central file here is the **server.js**. Here all the different routers are being used. + +- **api/**: Contains the routes, models and controllers of our API. +- **socket/**: Contains the socket manager who provides the socket rooms for communication +- **utils/**: Helper functions or files like the SsotToRobotParser, the openApiDocumentation or some testing files + +## Frontend + +On the top level there are only two folders next to the package.json and package-lock.json as well as some more config files. +The **public/** folder contains the known meta information of a web page, as well as the favicon. +Let's focus on the **src/** folder. On the highest level the relevant file is the **index.js**. Here our single page react application gets rendered. Also, there are many folders on the highest level within the src folder: + +- **api/**: API call related functions. +- **components/**: Stateful and stateless components. On the highest level the relevant file is the App.js. It is the one component that is being rendered in the end and that includes all the other components. In general the test and CSS file for a component are saved together with the component in one folder that contains just these files. + Next to the App.js there is a folder in the `components/` folder that contains all the pages of the application. In addition, the `multiPageComponents/` folder contains all components that are used by several pages like the navigation bar that gets imported from each page. + In the pages folder, a subfolder is created for each page. the following folder structure is done logically hierarchically according to the order of imports. Also some functionalities of React components are outsourced to keep the pure `.jsx` files as small as possible. +- **layout/**: Contains our corporate design and customized theme. +- **resources/**: Contains images, fonts and other static files. +- **utils/**: Contains the following subfolders: + - **parser/**: Contains our three parsers, which are stored in the frontend. Each parser has its own subfolder that also contains its tests + - **sessionStorage/**: Contains all the helper files we need to interact with the session storage + - **socket/**: Contains the socket connection file + +# Naming conventions + +- All components are saved as .jsx files (including index.jsx and App.jsx) +- All non-component JavaScript files are saved as .js +- Component names are written in _PascalCase_ +- Non-component JavaScript files are written in _camelCase_ +- The folders that directly wrap the component, and it's test and CSS files are also written in _PascalCase_ and have the same name as the wrapped component. diff --git a/wiki/Documentation-Single-Source-of-Truth.md b/wiki/Documentation-Single-Source-of-Truth.md index 05a9ac92..dea7251f 100644 --- a/wiki/Documentation-Single-Source-of-Truth.md +++ b/wiki/Documentation-Single-Source-of-Truth.md @@ -1,576 +1,576 @@ -# Single Source of Truth - -## What do we need a SSoT for? - -The goal of Ark_automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. -The user selects the modeling language he/she prefers and starts modeling the behavior of the robot (at least for now the user has to pre-select the modeling language). At the same time, the user can view/change the .robot code of the bot and/or update attributes via the property panel. -To achieve that we need a single-source-of-truth(SSoT) for each robot. In the SSoT all necessary information is saved so that changes can be automatically applied to every interface. - -### Which frontends do we want to support? - -- definitely have to be implemented: BPMN editor, robot framework code editor -- optional (planned) are: Google BLOCKLY -- in the long run we are open for other modelling languages - -(_We want to support all modelling languages that can be rendered into an edge and node model_) - -Observation: All frontends that represent "executable program code" can be represented as a graph. - -### Analysis: What can Robot Framework support? - -- Linear flow (sequences) -- Branching -- Loops (For+While) - **Does not support** try-catch constructs - -## How is the SSoT going to be included in the product? - -The SSoT itself will be stored on the server-side of the product. It will support multiple use cases shown in the following image: -![SSoT in product](https://i.imgur.com/jViSHTQ.png) -With a change of one of the interfaces on the frontend-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. - -### We have agreed on the following - -- **Saving the SSoT** - the local SSOT is pushed into the DB in certain time intervals (or trigger like "change tab") - the SSoT stores only the logic behind the modeling interfaces - (the visual representation is "rendered" from the graph) -- Only those features of the modelling languages are allowed that **are supported by Robot Framework**. - Parallelism is not supported - No gateways other than an XOR split are recorded in the SSOT. - ( => non-interrupting events are not supported) - Exception handling is not supported - (=> therefore we do not support intermediate events in BPMN) -- **Front-end rendering** - - requires extensive programming - - may cause the programmer to see his model differently from the way he saved it - - Hard-coded values required for frontend rendering are stored in a `config.json` - -### FAQ: - -1. **Do we store information about each model in the SSoT or do we "render" each model from the SSoT without having specific model information stored in the SSoT?** - 1. we render each model from our "logical graph". - 2. no modelling-interface-specific values are therefore stored. - 3. missing attributes needed to create a modelling visualisation have to be assumed or calculated with default values -2. **Do we use the XML as SSOT?** - No, we render the models from the SSOT. For e.g. BPMN we render SSOT to XML to BPMN. -3. **How do we store the edges from BPMN?** - Implicitly through the successor/predecessor relationships. The exact waypoints have to be "calculated" -4. **What are the consequences of not saving modelling attributes for our project? (BPMN specific)** - exact arrangement in the interface is not maintained; - however: support for adherence to the standard (automatic pretty print) - Logic for updating SSoT after deleting (and adding) is needed. - Config files with sizes, colours, symbols etc. are needed for each modelling interface - -## Concept for applying the SSoT - -**Note: SSoT should be closer to basic programming constructs than to a BPMN model. -Therefore: All interfaces are rendered into a graph model where the nodes are defined by the following tags: 'INSTRUCTION', 'BRANCH', 'CASE' and 'MARKER'. These tags represent the basic programming constructs that can also be used in the **Robot Framework\*\*. - -### Overview - -| SSoT tag | BPMN representation | Code representation | ArkA 0.3 | ArkA 1.0 | -| :---------: | :----------------------------: | :------------------: | :----------------: | :----------------: | -| INSTRUCTION | Activity | "one line of code" | :heavy_check_mark: | :heavy_check_mark: | -| CASE | XOR-Gateway | Branching (IF, CASE) | :x: | :heavy_check_mark: | -| LOOP | XOR-Split & Join (Combination) | Loop (FOR, WHILE) | :x: | :heavy_check_mark: | -| MARKER | Start & End Event | - | :heavy_check_mark: | :heavy_check_mark: | -| _EXCEPTION_ | _intermediate Event_ | _TRY-CATCH_ | :x: | :x: | - -**Special features for events:** -**Timers:** In the long term, timers are to be represented in BPMN as intermediate events. At the moment, a "sleep event" (to pause execution) is to be defined as an instruction with an RPA action as an example. - -**Event types:** are not stored. Events therefore always appear as "empty circles". They are also not linkable with logic. For example, if an end event is to send a mail, please model this construct as 'Activity: Send Mail' and 'End Event'. -No intermediate events are currently supported. - -### Overview SSOT hierarchy - -![](https://i.imgur.com/7yOqDZv.png) - -### Component: HEADER - -User information about a robot (creator, released for etc.) is stored in an additional file in the database. - -**SSoT** - -```json -{ - "_id": "6045eccfa9a07940e5763f0b", - "starterId": "exampleID", - "robotName": "exampleRobot", - "elements": [ - { - /* Here start the nodes of the graph */ - } - ] -} -``` - -### Element: INSTRUCTION - -**SSoT** - -```json -{ - "type": "INSTRUCTION", - "name": "exampleName", - "id": "exampleId", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"], - "rpaApplication": "e.g. Excel.Files", - "rpaTask": "e.g. Open Workbook" -} -``` - -**parameter object extending the INSTRUCTION:** - -```json -{ - "robotId": "604f537ed699a2eb47274184", - "activityId": "Activity_47II", - "outputValue": "exampleId", - "rpaParameters": [ - { - "name": "Filename", - "type": "Boolean", - "value": "", - "requireUserInput": true, - "infoText": "The name of the file", - "isRequired": true, - "index": 0 - }, - { - "name": "Path", - "value": "C:/RPA-folder/", - "type": "Boolean", - "requireUserInput": false, - "infoText": "The path where the file is located on the machine", - "isRequired": true, - "index": 1 - } - ] -} -``` - -**attribute object extending the INSTRUCTION:** - -```json -{ - "robotId": "604f537ed699a2eb47274184", - "activityId": "Activity_47II", - "rpaApplication": "Excel.Files", - "rpaTask": "Open Workbook" -} -``` - -**BPMN requires:** - -- id :heavy_check_mark: -- label -> name :heavy_check_mark: -- predecessor :heavy_check_mark: -- successor :heavy_check_mark: -- ~~position~~ -> calculated :heavy_check_mark: -- ~~size~~ -> `config.json` :heavy_check_mark: -- _RPA-Task & Application & Parameters_ :heavy_check_mark: - -By using separate external objects we allow for a more consistent updating of the ssot, since it is only required to carry the information about the name of single elements, as well as their predecessors and successors. -Splitting the required information again into parameter and attributes has benefits when working with only one of the both in situations where many of those objects are needed, but only the attribute or parameter information is needed at that point. - -### Element: CASE - -**SSoT stores** - -- predecessor node, Successor node -- name, ID -- default successor node -- conditions (for each successor node) = IF condition - -```json -{ - "type": "CASE", - "name": "", - "id": "exampleId", - "predecessorIds": ["randomId3"], - "successorIds": ["randomId", "randomId2, randomId3"], - "default_successorIds": "randomId", - "conditions": { - "X+1==3": "randomID", - "X-1==3": "randomID2" - } -} -``` - -**BPMN requires** - -- predecessor node :heavy_check_mark: -- successor node :heavy_check_mark: -- label (name) :heavy_check_mark: -- default successor node :heavy_check_mark: -- conditions (texts at the Path to each successor node) :heavy_check_mark: - -### Element: LOOP - -**SSoT stores** - -- id, text (label) -- predecessor and successor nodes of the loop -- loop termination condition -- predecessor node of the loop body end -- successor node of the loop body start - -```json -{ - "type": "LOOP", - "id": "exampleId", - "loop_condition": "X > 5", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"], - "loop_body_predecessorIds": ["randomId"], - "loop_body_successorIds": ["randomId"] -} -``` - -### Element: MARKER - -**SSoT stores** - -- id, text (label) -- predecessor node -- successor node - -```json -{ - "type": "MARKER", - "id": "exampleId", - "name": "Wait 5 seconds", - "predecessorIds": ["randomId"], - "successorIds": ["randomId"] -} -``` - -**BPMN requires** - -- label :heavy_check_mark: -- event type1: Start, End :heavy_check_mark: - - start = Event without incoming edge - - end = Event without outgoing edge -- event type2: timer event, message event etc. :thought_balloon: - - all events are always rendered as "neutral events" (empty circle). - ---- - -## Example parsing from BPMN xml to SSOT - -Modelled process -![](https://i.imgur.com/rMsmw1g.png) - - - - - - - - - - -
BPMN Json SSOT
- -```json -{ - "_declaration": { - "_attributes": { - "version": "1.0", - "encoding": "UTF-8" - } - }, - "bpmn2:definitions": { - "_attributes": { - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "xmlns:bpmn2": "http://www.omg.org/spec/BPMN/20100524/MODEL", - "xmlns:bpmndi": "http://www.omg.org/spec/BPMN/20100524/DI", - "xmlns:dc": "http://www.omg.org/spec/DD/20100524/DC", - "xmlns:arkRPA": "http://magic", - "xmlns:di": "http://www.omg.org/spec/DD/20100524/DI", - "id": "sample-diagram", - "targetNamespace": "http://bpmn.io/schema/bpmn", - "xsi:schemaLocation": "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" - }, - "bpmn2:collaboration": { - "_attributes": { - "id": "Collaboration_0czsqyr" - }, - "bpmn2:participant": { - "_attributes": { - "id": "Participant_0cyhvx8", - "processRef": "Process_1" - } - } - }, - "bpmn2:process": { - "_attributes": { - "id": "Process_1", - "isExecutable": "false" - }, - "bpmn2:task": [ - { - "_attributes": { - "id": "Activity_0a128t6", - "name": "#+# First activity" - }, - "bpmn2:incoming": { - "_text": "Flow_1bewk1i" - }, - "bpmn2:outgoing": { - "_text": "Flow_0sg07kn" - } - }, - { - "_attributes": { - "id": "Activity_0ascvdr", - "name": "#+#+# RPA Activity" - }, - "bpmn2:incoming": { - "_text": "Flow_0sg07kn" - }, - "bpmn2:outgoing": { - "_text": "Flow_1hwcghk" - } - } - ], - "bpmn2:sequenceFlow": [ - { - "_attributes": { - "id": "Flow_1bewk1i", - "sourceRef": "StartEvent_1", - "targetRef": "Activity_0a128t6" - } - }, - { - "_attributes": { - "id": "Flow_0sg07kn", - "sourceRef": "Activity_0a128t6", - "targetRef": "Activity_0ascvdr" - } - }, - { - "_attributes": { - "id": "Flow_1hwcghk", - "sourceRef": "Activity_0ascvdr", - "targetRef": "Event_0wghmrz" - } - } - ], - "bpmn2:endEvent": { - "_attributes": { - "id": "Event_0wghmrz" - }, - "bpmn2:incoming": { - "_text": "Flow_1hwcghk" - } - }, - "bpmn2:startEvent": { - "_attributes": { - "id": "StartEvent_1" - }, - "bpmn2:outgoing": { - "_text": "Flow_1bewk1i" - } - } - }, - "bpmndi:BPMNDiagram": { - "_attributes": { - "id": "BPMNDiagram_1" - }, - "bpmndi:BPMNPlane": { - "_attributes": { - "id": "BPMNPlane_1", - "bpmnElement": "Collaboration_0czsqyr" - }, - "bpmndi:BPMNShape": [ - { - "_attributes": { - "id": "Participant_0cyhvx8_di", - "bpmnElement": "Participant_0cyhvx8", - "isHorizontal": "true" - }, - "dc:Bounds": { - "_attributes": { - "x": "130", - "y": "220", - "width": "710", - "height": "250" - } - } - }, - { - "_attributes": { - "id": "Activity_0a128t6_di", - "bpmnElement": "Activity_0a128t6" - }, - "dc:Bounds": { - "_attributes": { - "x": "340", - "y": "280", - "width": "100", - "height": "80" - } - } - }, - { - "_attributes": { - "id": "Activity_0ascvdr_di", - "bpmnElement": "Activity_0ascvdr" - }, - "dc:Bounds": { - "_attributes": { - "x": "500", - "y": "280", - "width": "100", - "height": "80" - } - } - }, - { - "_attributes": { - "id": "Event_0wghmrz_di", - "bpmnElement": "Event_0wghmrz" - }, - "dc:Bounds": { - "_attributes": { - "x": "662", - "y": "392", - "width": "36", - "height": "36" - } - } - }, - { - "_attributes": { - "id": "_BPMNShape_StartEvent_2", - "bpmnElement": "StartEvent_1" - }, - "dc:Bounds": { - "_attributes": { - "x": "212", - "y": "302", - "width": "36", - "height": "36" - } - } - } - ], - "bpmndi:BPMNEdge": [ - { - "_attributes": { - "id": "Flow_1bewk1i_di", - "bpmnElement": "Flow_1bewk1i" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "248", - "y": "320" - } - }, - { - "_attributes": { - "x": "340", - "y": "320" - } - } - ] - }, - { - "_attributes": { - "id": "Flow_0sg07kn_di", - "bpmnElement": "Flow_0sg07kn" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "440", - "y": "320" - } - }, - { - "_attributes": { - "x": "500", - "y": "320" - } - } - ] - }, - { - "_attributes": { - "id": "Flow_1hwcghk_di", - "bpmnElement": "Flow_1hwcghk" - }, - "di:waypoint": [ - { - "_attributes": { - "x": "600", - "y": "320" - } - }, - { - "_attributes": { - "x": "631", - "y": "320" - } - }, - { - "_attributes": { - "x": "631", - "y": "410" - } - }, - { - "_attributes": { - "x": "662", - "y": "410" - } - } - ] - } - ] - } - } - } -} -``` - - - -```json - "_id": "6045eccfa9a07940e5763f0b", - "starterId": "exampleID", - "robotName": "exampleRobot", - "elements": [ - { - "type": "MARKER", - "name": "", - "id": "StartEvent_1", - "predecessorIds": [], - "successorIds": ["Activity_0a128t6"], - }, - // first activity - { - "type": "INSTRUCTION", - "name": "#+# First activity", - "id": "Activity_0a128t6", - "predecessorIds": ["StartEvent_1"], - "successorIds": ["Activity_0ascvdr"] - }, - // second activity - { - "type": "INSTRUCTION", - "name": "#+#+# RPA Activity", - "id": "Activity_0ascvdr", - "predecessorIds": ["Activity_0a128t6"], - "successorIds": ["Event_0wghmrz"] - }, - // Endevent - { - "type": "MARKER", - "name": "", - "id": "Event_0wghmrz", - "predecessorIds": ["Activity_0a128t6"], - "successorIds": [], - } - ] -} -``` - -
+# Single Source of Truth + +## What do we need a SSoT for? + +The goal of Ark_automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. +The user selects the modeling language he/she prefers and starts modeling the behavior of the robot (at least for now the user has to pre-select the modeling language). At the same time, the user can view/change the .robot code of the bot and/or update attributes via the property panel. +To achieve that we need a single-source-of-truth(SSoT) for each robot. In the SSoT all necessary information is saved so that changes can be automatically applied to every interface. + +### Which frontends do we want to support? + +- definitely have to be implemented: BPMN editor, robot framework code editor +- optional (planned) are: Google BLOCKLY +- in the long run we are open for other modelling languages + +(_We want to support all modelling languages that can be rendered into an edge and node model_) + +Observation: All frontends that represent "executable program code" can be represented as a graph. + +### Analysis: What can Robot Framework support? + +- Linear flow (sequences) +- Branching +- Loops (For+While) + **Does not support** try-catch constructs + +## How is the SSoT going to be included in the product? + +The SSoT itself will be stored on the server-side of the product. It will support multiple use cases shown in the following image: +![SSoT in product](https://i.imgur.com/jViSHTQ.png) +With a change of one of the interfaces on the frontend-side (e.g. type in a new name in the side panel) the new data will be sent to the SSoT via HTTP and the SSoT on the server side will be updated. Once the SSoT gets updated all the other interfaces update accordingly as they are dependent on the SSoT data. + +### We have agreed on the following + +- **Saving the SSoT** - the local SSOT is pushed into the DB in certain time intervals (or trigger like "change tab") - the SSoT stores only the logic behind the modeling interfaces + (the visual representation is "rendered" from the graph) +- Only those features of the modelling languages are allowed that **are supported by Robot Framework**. - Parallelism is not supported - No gateways other than an XOR split are recorded in the SSOT. + ( => non-interrupting events are not supported) - Exception handling is not supported + (=> therefore we do not support intermediate events in BPMN) +- **Front-end rendering** + - requires extensive programming + - may cause the programmer to see his model differently from the way he saved it + - Hard-coded values required for frontend rendering are stored in a `config.json` + +### FAQ: + +1. **Do we store information about each model in the SSoT or do we "render" each model from the SSoT without having specific model information stored in the SSoT?** + 1. we render each model from our "logical graph". + 2. no modelling-interface-specific values are therefore stored. + 3. missing attributes needed to create a modelling visualisation have to be assumed or calculated with default values +2. **Do we use the XML as SSOT?** + No, we render the models from the SSOT. For e.g. BPMN we render SSOT to XML to BPMN. +3. **How do we store the edges from BPMN?** + Implicitly through the successor/predecessor relationships. The exact waypoints have to be "calculated" +4. **What are the consequences of not saving modelling attributes for our project? (BPMN specific)** - exact arrangement in the interface is not maintained; + however: support for adherence to the standard (automatic pretty print) - Logic for updating SSoT after deleting (and adding) is needed. - Config files with sizes, colours, symbols etc. are needed for each modelling interface + +## Concept for applying the SSoT + +**Note: SSoT should be closer to basic programming constructs than to a BPMN model. +Therefore: All interfaces are rendered into a graph model where the nodes are defined by the following tags: 'INSTRUCTION', 'BRANCH', 'CASE' and 'MARKER'. These tags represent the basic programming constructs that can also be used in the **Robot Framework\*\*. + +### Overview + +| SSoT tag | BPMN representation | Code representation | ArkA 0.3 | ArkA 1.0 | +| :---------: | :----------------------------: | :------------------: | :----------------: | :----------------: | +| INSTRUCTION | Activity | "one line of code" | :heavy_check_mark: | :heavy_check_mark: | +| CASE | XOR-Gateway | Branching (IF, CASE) | :x: | :heavy_check_mark: | +| LOOP | XOR-Split & Join (Combination) | Loop (FOR, WHILE) | :x: | :heavy_check_mark: | +| MARKER | Start & End Event | - | :heavy_check_mark: | :heavy_check_mark: | +| _EXCEPTION_ | _intermediate Event_ | _TRY-CATCH_ | :x: | :x: | + +**Special features for events:** +**Timers:** In the long term, timers are to be represented in BPMN as intermediate events. At the moment, a "sleep event" (to pause execution) is to be defined as an instruction with an RPA action as an example. + +**Event types:** are not stored. Events therefore always appear as "empty circles". They are also not linkable with logic. For example, if an end event is to send a mail, please model this construct as 'Activity: Send Mail' and 'End Event'. +No intermediate events are currently supported. + +### Overview SSOT hierarchy + +![](https://i.imgur.com/7yOqDZv.png) + +### Component: HEADER + +User information about a robot (creator, released for etc.) is stored in an additional file in the database. + +**SSoT** + +```json +{ + "_id": "6045eccfa9a07940e5763f0b", + "starterId": "exampleID", + "robotName": "exampleRobot", + "elements": [ + { + /* Here start the nodes of the graph */ + } + ] +} +``` + +### Element: INSTRUCTION + +**SSoT** + +```json +{ + "type": "INSTRUCTION", + "name": "exampleName", + "id": "exampleId", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"], + "rpaApplication": "e.g. Excel.Files", + "rpaTask": "e.g. Open Workbook" +} +``` + +**parameter object extending the INSTRUCTION:** + +```json +{ + "robotId": "604f537ed699a2eb47274184", + "activityId": "Activity_47II", + "outputValue": "exampleId", + "rpaParameters": [ + { + "name": "Filename", + "type": "Boolean", + "value": "", + "requireUserInput": true, + "infoText": "The name of the file", + "isRequired": true, + "index": 0 + }, + { + "name": "Path", + "value": "C:/RPA-folder/", + "type": "Boolean", + "requireUserInput": false, + "infoText": "The path where the file is located on the machine", + "isRequired": true, + "index": 1 + } + ] +} +``` + +**attribute object extending the INSTRUCTION:** + +```json +{ + "robotId": "604f537ed699a2eb47274184", + "activityId": "Activity_47II", + "rpaApplication": "Excel.Files", + "rpaTask": "Open Workbook" +} +``` + +**BPMN requires:** + +- id :heavy_check_mark: +- label -> name :heavy_check_mark: +- predecessor :heavy_check_mark: +- successor :heavy_check_mark: +- ~~position~~ -> calculated :heavy_check_mark: +- ~~size~~ -> `config.json` :heavy_check_mark: +- _RPA-Task & Application & Parameters_ :heavy_check_mark: + +By using separate external objects we allow for a more consistent updating of the ssot, since it is only required to carry the information about the name of single elements, as well as their predecessors and successors. +Splitting the required information again into parameter and attributes has benefits when working with only one of the both in situations where many of those objects are needed, but only the attribute or parameter information is needed at that point. + +### Element: CASE + +**SSoT stores** + +- predecessor node, Successor node +- name, ID +- default successor node +- conditions (for each successor node) = IF condition + +```json +{ + "type": "CASE", + "name": "", + "id": "exampleId", + "predecessorIds": ["randomId3"], + "successorIds": ["randomId", "randomId2, randomId3"], + "default_successorIds": "randomId", + "conditions": { + "X+1==3": "randomID", + "X-1==3": "randomID2" + } +} +``` + +**BPMN requires** + +- predecessor node :heavy_check_mark: +- successor node :heavy_check_mark: +- label (name) :heavy_check_mark: +- default successor node :heavy_check_mark: +- conditions (texts at the Path to each successor node) :heavy_check_mark: + +### Element: LOOP + +**SSoT stores** + +- id, text (label) +- predecessor and successor nodes of the loop +- loop termination condition +- predecessor node of the loop body end +- successor node of the loop body start + +```json +{ + "type": "LOOP", + "id": "exampleId", + "loop_condition": "X > 5", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"], + "loop_body_predecessorIds": ["randomId"], + "loop_body_successorIds": ["randomId"] +} +``` + +### Element: MARKER + +**SSoT stores** + +- id, text (label) +- predecessor node +- successor node + +```json +{ + "type": "MARKER", + "id": "exampleId", + "name": "Wait 5 seconds", + "predecessorIds": ["randomId"], + "successorIds": ["randomId"] +} +``` + +**BPMN requires** + +- label :heavy_check_mark: +- event type1: Start, End :heavy_check_mark: + - start = Event without incoming edge + - end = Event without outgoing edge +- event type2: timer event, message event etc. :thought_balloon: + - all events are always rendered as "neutral events" (empty circle). + +--- + +## Example parsing from BPMN xml to SSOT + +Modelled process +![](https://i.imgur.com/rMsmw1g.png) + + + + + + + + + + +
BPMN Json SSOT
+ +```json +{ + "_declaration": { + "_attributes": { + "version": "1.0", + "encoding": "UTF-8" + } + }, + "bpmn2:definitions": { + "_attributes": { + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:bpmn2": "http://www.omg.org/spec/BPMN/20100524/MODEL", + "xmlns:bpmndi": "http://www.omg.org/spec/BPMN/20100524/DI", + "xmlns:dc": "http://www.omg.org/spec/DD/20100524/DC", + "xmlns:arkRPA": "http://magic", + "xmlns:di": "http://www.omg.org/spec/DD/20100524/DI", + "id": "sample-diagram", + "targetNamespace": "http://bpmn.io/schema/bpmn", + "xsi:schemaLocation": "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" + }, + "bpmn2:collaboration": { + "_attributes": { + "id": "Collaboration_0czsqyr" + }, + "bpmn2:participant": { + "_attributes": { + "id": "Participant_0cyhvx8", + "processRef": "Process_1" + } + } + }, + "bpmn2:process": { + "_attributes": { + "id": "Process_1", + "isExecutable": "false" + }, + "bpmn2:task": [ + { + "_attributes": { + "id": "Activity_0a128t6", + "name": "#+# First activity" + }, + "bpmn2:incoming": { + "_text": "Flow_1bewk1i" + }, + "bpmn2:outgoing": { + "_text": "Flow_0sg07kn" + } + }, + { + "_attributes": { + "id": "Activity_0ascvdr", + "name": "#+#+# RPA Activity" + }, + "bpmn2:incoming": { + "_text": "Flow_0sg07kn" + }, + "bpmn2:outgoing": { + "_text": "Flow_1hwcghk" + } + } + ], + "bpmn2:sequenceFlow": [ + { + "_attributes": { + "id": "Flow_1bewk1i", + "sourceRef": "StartEvent_1", + "targetRef": "Activity_0a128t6" + } + }, + { + "_attributes": { + "id": "Flow_0sg07kn", + "sourceRef": "Activity_0a128t6", + "targetRef": "Activity_0ascvdr" + } + }, + { + "_attributes": { + "id": "Flow_1hwcghk", + "sourceRef": "Activity_0ascvdr", + "targetRef": "Event_0wghmrz" + } + } + ], + "bpmn2:endEvent": { + "_attributes": { + "id": "Event_0wghmrz" + }, + "bpmn2:incoming": { + "_text": "Flow_1hwcghk" + } + }, + "bpmn2:startEvent": { + "_attributes": { + "id": "StartEvent_1" + }, + "bpmn2:outgoing": { + "_text": "Flow_1bewk1i" + } + } + }, + "bpmndi:BPMNDiagram": { + "_attributes": { + "id": "BPMNDiagram_1" + }, + "bpmndi:BPMNPlane": { + "_attributes": { + "id": "BPMNPlane_1", + "bpmnElement": "Collaboration_0czsqyr" + }, + "bpmndi:BPMNShape": [ + { + "_attributes": { + "id": "Participant_0cyhvx8_di", + "bpmnElement": "Participant_0cyhvx8", + "isHorizontal": "true" + }, + "dc:Bounds": { + "_attributes": { + "x": "130", + "y": "220", + "width": "710", + "height": "250" + } + } + }, + { + "_attributes": { + "id": "Activity_0a128t6_di", + "bpmnElement": "Activity_0a128t6" + }, + "dc:Bounds": { + "_attributes": { + "x": "340", + "y": "280", + "width": "100", + "height": "80" + } + } + }, + { + "_attributes": { + "id": "Activity_0ascvdr_di", + "bpmnElement": "Activity_0ascvdr" + }, + "dc:Bounds": { + "_attributes": { + "x": "500", + "y": "280", + "width": "100", + "height": "80" + } + } + }, + { + "_attributes": { + "id": "Event_0wghmrz_di", + "bpmnElement": "Event_0wghmrz" + }, + "dc:Bounds": { + "_attributes": { + "x": "662", + "y": "392", + "width": "36", + "height": "36" + } + } + }, + { + "_attributes": { + "id": "_BPMNShape_StartEvent_2", + "bpmnElement": "StartEvent_1" + }, + "dc:Bounds": { + "_attributes": { + "x": "212", + "y": "302", + "width": "36", + "height": "36" + } + } + } + ], + "bpmndi:BPMNEdge": [ + { + "_attributes": { + "id": "Flow_1bewk1i_di", + "bpmnElement": "Flow_1bewk1i" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "248", + "y": "320" + } + }, + { + "_attributes": { + "x": "340", + "y": "320" + } + } + ] + }, + { + "_attributes": { + "id": "Flow_0sg07kn_di", + "bpmnElement": "Flow_0sg07kn" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "440", + "y": "320" + } + }, + { + "_attributes": { + "x": "500", + "y": "320" + } + } + ] + }, + { + "_attributes": { + "id": "Flow_1hwcghk_di", + "bpmnElement": "Flow_1hwcghk" + }, + "di:waypoint": [ + { + "_attributes": { + "x": "600", + "y": "320" + } + }, + { + "_attributes": { + "x": "631", + "y": "320" + } + }, + { + "_attributes": { + "x": "631", + "y": "410" + } + }, + { + "_attributes": { + "x": "662", + "y": "410" + } + } + ] + } + ] + } + } + } +} +``` + + + +```json + "_id": "6045eccfa9a07940e5763f0b", + "starterId": "exampleID", + "robotName": "exampleRobot", + "elements": [ + { + "type": "MARKER", + "name": "", + "id": "StartEvent_1", + "predecessorIds": [], + "successorIds": ["Activity_0a128t6"], + }, + // first activity + { + "type": "INSTRUCTION", + "name": "#+# First activity", + "id": "Activity_0a128t6", + "predecessorIds": ["StartEvent_1"], + "successorIds": ["Activity_0ascvdr"] + }, + // second activity + { + "type": "INSTRUCTION", + "name": "#+#+# RPA Activity", + "id": "Activity_0ascvdr", + "predecessorIds": ["Activity_0a128t6"], + "successorIds": ["Event_0wghmrz"] + }, + // Endevent + { + "type": "MARKER", + "name": "", + "id": "Event_0wghmrz", + "predecessorIds": ["Activity_0a128t6"], + "successorIds": [], + } + ] +} +``` + +
diff --git a/wiki/How-To-Style-Using-CSS.md b/wiki/How-To-Style-Using-CSS.md index 793a03a4..274ef95c 100644 --- a/wiki/How-To-Style-Using-CSS.md +++ b/wiki/How-To-Style-Using-CSS.md @@ -1,415 +1,415 @@ -# How to style components using CSS - -## CSS general info - -- CSS = Cascading Style Sheets -- Only purpose is to style and animate markup language (HTML) -- Because we are rendering our React app in `HTML`, we can therefore also style all components of the app - -## Getting started with CSS - -
How to use CSS -

- -**1. Use Inline CSS** -Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. - -```html - -``` - -**2. Use Internal CSS** -In the tag open a \ tag. There you can specifiy the html component affected and the styling that should be applied to it. For example: - -```html - - - -``` - -**3. Use External CSS** -Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. -`` - -Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp - -### How to debug CSS - -Use the dev tools of your browser and check out the Style tab regarding your selected object. -![](https://i.imgur.com/OkpU7fx.png) - -

- -
Anatomy of CSS Syntax -

- -```html -selector { property: value; } // Example h1 { color: red; } -``` - -**Selector:** Who do you want to change? -**Property:** What do you want to change? -**Value:** How do you want it to be changed? - -### About CSS Selectors - -**Which properties can I change?** -Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index - -#### Selector: CSS Classes - -You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -.title { - color: red; -} -``` - -#### Selector: HTML IDs. - -You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -#MyTitle { - color: red; -} -``` - -#### Selector: Pseudo classes - -Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) - -```HTML -h1:hover{ - color= blue; -} -``` - -#### CSS Rule priority - -Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values - -

- -
Best practices -

- -- Write CSS Rules like this, starting the properties in a new line - -```html -h1 { color: red; font-size : 200px; } -``` - -- Alphabetically sort the selectors -- Use rem as font size unit -

- -## Using CSS in React - -
Styling Options -

- -### Inline Styling - -To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. - -```jsx -class MyHeader extends React.Component { - render() { - return ( -

-

Hello Style!

-

Add a little style!

-
- ); - } -} -``` - -> Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. - -### Using external stylesheets - -Write your CSS styling in a separate .css file and import it. -**./App.jsx** - -```jsx -import React from 'react'; -import ReactDOM from 'react-dom'; -import './App.css'; - -class MyHeader extends React.Component { - render() { -
- -## How to use AntD? - -
Basics about AntD -

- -To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. - -Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` - -Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. - -```jsx -import React from 'react'; -import { Button } from 'antd'; - -const TestButton = () => ( - <> - - -); - -export default TestButton; -``` - -

- -
AntD-Components -

- -**Frequently used Components** - -- for button see: [Button](https://ant.design/components/button/) -- for normal text & headings see: [Typography](https://ant.design/components/typography/) -- for input fields see: [Input](https://ant.design/components/input/) - -**About AntD Layout & Grid** -**AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. -For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). - -**AntD Grid** - -- As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. -- Your content elements should be placed directly in the col, and the only col should be placed directly in a row. -- The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. -- If the sum of col spans in a row is more than 24, then the overflowing col as a whole will start a new line arrangement. -- You can align Elements in the Grid horizontally and vertically and add Gutter (kind of margin between the boxes) which should always be preferred to the traditional alignment using CSS! - -```jsx -import { Row, Col } from 'antd'; - -ReactDOM.render( - <> - - col1 - col2 - - - col1 - col2 - col3 - - , - mountNode -); -``` - -> This will return two rows. The first row contains two columns, the second row contains three columns. -> -> **AntD Space** -> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons, horizontally aligned with space between the buttons. -> -> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. - -The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. - -**Link to the Documentation**. -For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. - -

- -# How to apply CSS in this Project - -## Use of styles via CSS - -In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: - -- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. -- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. - -### Basic rules for styling: - -
See the rules -

- -- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. -- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style -- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose -- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component - -

- -### CSS vs. CSS modules - -
When to use what? -

- -In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. -For example when you define the following style... - -```css -.button { - background-color: red; -} -``` - -... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. - -If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: - -```jsx -import styles from './Example.module.css'; -``` - -Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: - -```css -.button { - background-color: green; -} -``` - -In the file we would include the style in the following way: - -```jsx - -``` - -

- -### Conventions - -
We agreed on -

- -- naming: - For the naming of classes and ids please use **hyphens** consistently. - For example, don't call the class `buttonBackground` and instead call it `button-background`. -- sizing: - Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) - -

- ---- - -## Homework (take approx. 1h) - -1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) -2. Click through [this tutorial](https://de.learnlayout.com) -3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) -4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) - -## Further Reading. - -For more games to learn CSS checkout https://codepip.com/games/ -Take a look at this website https://css-tricks.com/ -For the style guide issue https://24ways.org/2011/front-end-style-guides +# How to style components using CSS + +## CSS general info + +- CSS = Cascading Style Sheets +- Only purpose is to style and animate markup language (HTML) +- Because we are rendering our React app in `HTML`, we can therefore also style all components of the app + +## Getting started with CSS + +
How to use CSS +

+ +**1. Use Inline CSS** +Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. + +```html + +``` + +**2. Use Internal CSS** +In the tag open a \ tag. There you can specifiy the html component affected and the styling that should be applied to it. For example: + +```html + + + +``` + +**3. Use External CSS** +Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. +`` + +Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp + +### How to debug CSS + +Use the dev tools of your browser and check out the Style tab regarding your selected object. +![](https://i.imgur.com/OkpU7fx.png) + +

+ +
Anatomy of CSS Syntax +

+ +```html +selector { property: value; } // Example h1 { color: red; } +``` + +**Selector:** Who do you want to change? +**Property:** What do you want to change? +**Value:** How do you want it to be changed? + +### About CSS Selectors + +**Which properties can I change?** +Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index + +#### Selector: CSS Classes + +You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. +**Html** + +```html +

Helloo

+``` + +**CSS** + +``` +.title { + color: red; +} +``` + +#### Selector: HTML IDs. + +You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. +**Html** + +```html +

Helloo

+``` + +**CSS** + +``` +#MyTitle { + color: red; +} +``` + +#### Selector: Pseudo classes + +Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) + +```HTML +h1:hover{ + color= blue; +} +``` + +#### CSS Rule priority + +Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values + +

+ +
Best practices +

+ +- Write CSS Rules like this, starting the properties in a new line + +```html +h1 { color: red; font-size : 200px; } +``` + +- Alphabetically sort the selectors +- Use rem as font size unit +

+ +## Using CSS in React + +
Styling Options +

+ +### Inline Styling + +To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. + +```jsx +class MyHeader extends React.Component { + render() { + return ( +

+

Hello Style!

+

Add a little style!

+
+ ); + } +} +``` + +> Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. + +### Using external stylesheets + +Write your CSS styling in a separate .css file and import it. +**./App.jsx** + +```jsx +import React from 'react'; +import ReactDOM from 'react-dom'; +import './App.css'; + +class MyHeader extends React.Component { + render() { +
+ +## How to use AntD? + +
Basics about AntD +

+ +To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. + +Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` + +Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. + +```jsx +import React from 'react'; +import { Button } from 'antd'; + +const TestButton = () => ( + <> + + +); + +export default TestButton; +``` + +

+ +
AntD-Components +

+ +**Frequently used Components** + +- for button see: [Button](https://ant.design/components/button/) +- for normal text & headings see: [Typography](https://ant.design/components/typography/) +- for input fields see: [Input](https://ant.design/components/input/) + +**About AntD Layout & Grid** +**AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. +For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). + +**AntD Grid** + +- As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. +- Your content elements should be placed directly in the col, and the only col should be placed directly in a row. +- The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. +- If the sum of col spans in a row is more than 24, then the overflowing col as a whole will start a new line arrangement. +- You can align Elements in the Grid horizontally and vertically and add Gutter (kind of margin between the boxes) which should always be preferred to the traditional alignment using CSS! + +```jsx +import { Row, Col } from 'antd'; + +ReactDOM.render( + <> + + col1 + col2 + + + col1 + col2 + col3 + + , + mountNode +); +``` + +> This will return two rows. The first row contains two columns, the second row contains three columns. +> +> **AntD Space** +> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. + +```jsx +import { Button, Space } from 'antd'; + +function SpaceDemo() { + return ( + + + + + ); +} + +ReactDOM.render(, mountNode); +``` + +> This will return two Buttons, horizontally aligned with space between the buttons. +> +> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. + +The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. + +```jsx +import { Button, Space } from 'antd'; + +function SpaceDemo() { + return ( + + + + + ); +} + +ReactDOM.render(, mountNode); +``` + +> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. + +**Link to the Documentation**. +For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. + +

+ +# How to apply CSS in this Project + +## Use of styles via CSS + +In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: + +- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. +- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. + +### Basic rules for styling: + +
See the rules +

+ +- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. +- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style +- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose +- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component + +

+ +### CSS vs. CSS modules + +
When to use what? +

+ +In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. +For example when you define the following style... + +```css +.button { + background-color: red; +} +``` + +... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. + +If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: + +```jsx +import styles from './Example.module.css'; +``` + +Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: + +```css +.button { + background-color: green; +} +``` + +In the file we would include the style in the following way: + +```jsx + +``` + +

+ +### Conventions + +
We agreed on +

+ +- naming: + For the naming of classes and ids please use **hyphens** consistently. + For example, don't call the class `buttonBackground` and instead call it `button-background`. +- sizing: + Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) + +

+ +--- + +## Homework (take approx. 1h) + +1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) +2. Click through [this tutorial](https://de.learnlayout.com) +3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) +4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) + +## Further Reading. + +For more games to learn CSS checkout https://codepip.com/games/ +Take a look at this website https://css-tricks.com/ +For the style guide issue https://24ways.org/2011/front-end-style-guides diff --git a/wiki/How-To-Write-Code-Documentation.md b/wiki/How-To-Write-Code-Documentation.md index 3b69c6d7..ed2e3899 100644 --- a/wiki/How-To-Write-Code-Documentation.md +++ b/wiki/How-To-Write-Code-Documentation.md @@ -1,87 +1,87 @@ -## General - -We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. - -Documentation will be generated as a website under which the individual parts of the software (server/frontend) are visible and listed with their respective classes and modules. -It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. - -## How to write documentation - -### React Components - -As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. -Because of that tag all methods in the same file are -For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): - -``` -/** - * @description Some documented component - * @category Frontend/Server - * @component - * @example - * const text = 'some example text' - * return ( ) - */ -``` - -The attributes are: - -- description: Describe the component, its use case and/or where it could be used -- category: Either _Frontend_ or _Server_, based on where it is used (for React components this should most likely always be _Frontend_) -- component: Tag to specify this as a component -- example: Code which describes a possible use scenario for this component - -### Classes - -To document classes, please follow the following scheme in front of the constructor method: - -``` -/** - * @description This is a description of the MyClass constructor function. - * @category Frontend/Server - * @class - * @classdesc This is a description of the MyClass class. - */ -``` - -The attributes are: - -- description: Describe the constructor function -- category: Either _Frontend_ or _Server_, based on where it is used -- class: Tag to specify this as a class constructor -- classdesc: Describe the functionality and behavior of the class - -### Functions/Methods - -When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there - -``` -/** - * @description This is the description of what the function does - * @param {string} arg1 - A nice argument - * @param {*} arg2 - A fancy second argument - * @returns {number} number of interest which is returned - */ -``` - -The attributes are: - -- description: Describe the functionality and/or behavior of the function/method -- param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using \*. Specify the name of the parameter and separated from that name specify what this parameter should represent. -- returns {datatype}: Specify the datatype returned by the function and what that value represents - -#### Group as module - -When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there - -``` -/** - * @category Frontend/Server - * @module optionalString - */ -``` - -The attributes are: - -- category: Either _Frontend_ or _Server_, based on where it is used -- module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. +## General + +We are using [JsDoc](https://jsdoc.app) with an [additional plugin](https://github.com/SoftwareBrothers/better-docs), which allows us to also tag components in React. + +Documentation will be generated as a website under which the individual parts of the software (server/frontend) are visible and listed with their respective classes and modules. +It should be noted here, that although components are supported as a separate tag, they are in the current version still listed under the _Classes_ part of the documentation. + +## How to write documentation + +### React Components + +As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. +Because of that tag all methods in the same file are +For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): + +``` +/** + * @description Some documented component + * @category Frontend/Server + * @component + * @example + * const text = 'some example text' + * return ( ) + */ +``` + +The attributes are: + +- description: Describe the component, its use case and/or where it could be used +- category: Either _Frontend_ or _Server_, based on where it is used (for React components this should most likely always be _Frontend_) +- component: Tag to specify this as a component +- example: Code which describes a possible use scenario for this component + +### Classes + +To document classes, please follow the following scheme in front of the constructor method: + +``` +/** + * @description This is a description of the MyClass constructor function. + * @category Frontend/Server + * @class + * @classdesc This is a description of the MyClass class. + */ +``` + +The attributes are: + +- description: Describe the constructor function +- category: Either _Frontend_ or _Server_, based on where it is used +- class: Tag to specify this as a class constructor +- classdesc: Describe the functionality and behavior of the class + +### Functions/Methods + +When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + +``` +/** + * @description This is the description of what the function does + * @param {string} arg1 - A nice argument + * @param {*} arg2 - A fancy second argument + * @returns {number} number of interest which is returned + */ +``` + +The attributes are: + +- description: Describe the functionality and/or behavior of the function/method +- param {datatype}: Specify the different input parameters this function/method accepts by using multiple of these tags. Specify the datatype expected or specify that any input is allowed by using \*. Specify the name of the parameter and separated from that name specify what this parameter should represent. +- returns {datatype}: Specify the datatype returned by the function and what that value represents + +#### Group as module + +When grouping related functions loosely in a file because of the same context, please use the following snippet at the very beginning of the file to group all functions to that same module. For classes and components, this is done automatically and therefore a specification of the module is not needed there + +``` +/** + * @category Frontend/Server + * @module optionalString + */ +``` + +The attributes are: + +- category: Either _Frontend_ or _Server_, based on where it is used +- module: Specify this file as a module. In the documentation, this module will receive the name of the relative filePath to the root or the specified (but optional) String passed in as a name. diff --git a/wiki/How-To-Write-Tests.md b/wiki/How-To-Write-Tests.md index a0c0d08f..1676e30b 100644 --- a/wiki/How-To-Write-Tests.md +++ b/wiki/How-To-Write-Tests.md @@ -1,136 +1,136 @@ -# Testing - -## Topics - -- Why automatically test? -- Tools -- What to test? -- How to write a test? -- How to execute a test? -- Best practices -- Your next Steps -- Places to continue research - ---- - -### Why automatically test? - -**The purpose of testing is to give you confidence that the app is working correctly.** - -- Helps to catch bugs earlier - - You might unknowingly break an app whenever you change a line of code. -- Test your changes faster - - Manually testing your app after each change is cumbersome. - - Refactoring is easier -- Tests help document - - for example edge cases -- Improves the architecture - - Enforces code splitting and single responsibilities - -### Tools - -![The tools used often](https://i.imgur.com/sxEsfOJ.png) -There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. - -> React Testing Library approaches testing from a user perspective. Thus it naturally leads to writing integration tests where multiple components are tested together. -> As an example, imagine a button. With React Testing Library you typically wouldn't test if the onClick prop is called when the button is clicked. You would rather test if a specific button triggers a certain effect. Like a delete button opening a confirmation modal. -> With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). - -#### Jest - -- Unit testing -- Snapshot testing - - Is useful for making sure that the UI does not change unexpectedly -- Integration testing -- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) - - Mock = An object on which you set expectations - - Stub = Provides predefined answers to method calls - - Spy = Doesn't change functionality - - **In general you can simply refer to it as mocking** - -Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) - -You can also use [this short Jest cheatsheet](https://devhints.io/jest) - -#### React Testing Library - -- Component testing - - Testing based on the correct rendering of components -- Simulate user behavior -- Can't access components state - -[Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) -[RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) - -#### Which testing tool to use - -- For everything related to rendering components and therefore requires evaluations against the DOM -- If you are only testing functions and methods, please use plain Jest - -### What to test? - -#### Do - -- Utility methods -- Complex implementations (eg: algorithms) -- Anything that has edge cases -- Core business logic -- High-risk Services -- Common user interactions -- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) -- Interactions between units that were stubbed in the unit tests - -#### Don't - -- JavaScript and NodeJS core functions -- Third-party libraries -- External applications -- API calls. Stub them unless you’re doing E2E testing -- Database operations, unless you’re doing E2E testing -- Trivial methods not involving logic (simple getters and setters) -- Code that is throw-away or placeholder code - -### How to write a test? - -- In the same folder of component, create file filename.test.js - - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files -- Use describe, it, beforeEach, etc. - -### How to execute a test? - -`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) - -### Best practices - -- Tests should be pure (have the same outcome on multiple runs), so mock - - API calls - - Third-party libraries - - Timers - - Dates - - Random values - - File access -- Use constants to assign and evaluate to prevent typos that may cause the test to fail -- Create Tests That Are Resistant to UI Changes -- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); - - Think about using the built-in afterEach functionality if your Use-Case requires it -- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. -- Find yourself mocking the same function over and over in multiple tests? - - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! -- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. -- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain -- Don’t create fake/poor tests just for increasing coverage -- Avoid including implementation details in tests - -## Next Steps - -- [ ] read through [the jest documentation](https://jestjs.io/docs/en/getting-started) (about 15 minutes) -- [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 -- [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) - -## Places to continue research - -- https://www.freecodecamp.org/news/testing-react-hooks/ -- https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be -- https://www.robinwieruch.de/react-testing-library/ -- Jest docs https://jestjs.io/docs/en/getting-started -- RTL Docs https://testing-library.com/docs/react-testing-library/intro/ +# Testing + +## Topics + +- Why automatically test? +- Tools +- What to test? +- How to write a test? +- How to execute a test? +- Best practices +- Your next Steps +- Places to continue research + +--- + +### Why automatically test? + +**The purpose of testing is to give you confidence that the app is working correctly.** + +- Helps to catch bugs earlier + - You might unknowingly break an app whenever you change a line of code. +- Test your changes faster + - Manually testing your app after each change is cumbersome. + - Refactoring is easier +- Tests help document + - for example edge cases +- Improves the architecture + - Enforces code splitting and single responsibilities + +### Tools + +![The tools used often](https://i.imgur.com/sxEsfOJ.png) +There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. + +> React Testing Library approaches testing from a user perspective. Thus it naturally leads to writing integration tests where multiple components are tested together. +> As an example, imagine a button. With React Testing Library you typically wouldn't test if the onClick prop is called when the button is clicked. You would rather test if a specific button triggers a certain effect. Like a delete button opening a confirmation modal. +> With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). + +#### Jest + +- Unit testing +- Snapshot testing + - Is useful for making sure that the UI does not change unexpectedly +- Integration testing +- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) + - Mock = An object on which you set expectations + - Stub = Provides predefined answers to method calls + - Spy = Doesn't change functionality + - **In general you can simply refer to it as mocking** + +Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) + +You can also use [this short Jest cheatsheet](https://devhints.io/jest) + +#### React Testing Library + +- Component testing + - Testing based on the correct rendering of components +- Simulate user behavior +- Can't access components state + +[Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) +[RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) + +#### Which testing tool to use + +- For everything related to rendering components and therefore requires evaluations against the DOM +- If you are only testing functions and methods, please use plain Jest + +### What to test? + +#### Do + +- Utility methods +- Complex implementations (eg: algorithms) +- Anything that has edge cases +- Core business logic +- High-risk Services +- Common user interactions +- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) +- Interactions between units that were stubbed in the unit tests + +#### Don't + +- JavaScript and NodeJS core functions +- Third-party libraries +- External applications +- API calls. Stub them unless you’re doing E2E testing +- Database operations, unless you’re doing E2E testing +- Trivial methods not involving logic (simple getters and setters) +- Code that is throw-away or placeholder code + +### How to write a test? + +- In the same folder of component, create file filename.test.js + - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files +- Use describe, it, beforeEach, etc. + +### How to execute a test? + +`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) + +### Best practices + +- Tests should be pure (have the same outcome on multiple runs), so mock + - API calls + - Third-party libraries + - Timers + - Dates + - Random values + - File access +- Use constants to assign and evaluate to prevent typos that may cause the test to fail +- Create Tests That Are Resistant to UI Changes +- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); + - Think about using the built-in afterEach functionality if your Use-Case requires it +- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. +- Find yourself mocking the same function over and over in multiple tests? + - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! +- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. +- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain +- Don’t create fake/poor tests just for increasing coverage +- Avoid including implementation details in tests + +## Next Steps + +- [ ] read through [the jest documentation](https://jestjs.io/docs/en/getting-started) (about 15 minutes) +- [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 +- [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) + +## Places to continue research + +- https://www.freecodecamp.org/news/testing-react-hooks/ +- https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be +- https://www.robinwieruch.de/react-testing-library/ +- Jest docs https://jestjs.io/docs/en/getting-started +- RTL Docs https://testing-library.com/docs/react-testing-library/intro/ diff --git a/wiki/Team-Scrum-Process.md b/wiki/Team-Scrum-Process.md index c11859ce..4cc8212c 100644 --- a/wiki/Team-Scrum-Process.md +++ b/wiki/Team-Scrum-Process.md @@ -1,73 +1,73 @@ -## Our current Scrum process is the following: - -### General -- One sprint is usually three weeks long. -- The teams' core work time is Monday-Wednesday (9 am-3 pm) and a fourth flexible day that each team member can set himself -- Each member of the team works about 32 hours per week - -### Meetings - -**1. Daily Scrum:** -Limited to 15 min the daily scrum takes place Monday, Tuesday and Wednesday at 9 am in MS Teams. -Only the core team is participating including Maximilian. -The structure the team agreed on is that every team member shortly answers the following three questions: -* What did I do yesterday that helped the Development Team achieve the sprint goal? -* What will I do today to help the Development Team achieve the sprint goal? -* Do I see any obstacle that will prevent me or the Development Team from achieving the Sprint Goal? - -**2. Sprint Planning:** -It usually takes place on the first day of the new sprint. It should never exceed 4 hours. -Only the core team is participating including Maximilian. The Scrum Master is inviting everyone. The goal is to define a sprint backlog and a sprint goal as well as the responsibilities for the different issues. We estimate the effort of the stories using Planning Poker. We decided to use the Fibonacci scale at the beginning of the 6th sprint. One story point corresponds to 2 man-hours. - -**3. Sprint Review:** -It usually takes place on the last day of the sprint. It takes about 1 hour. -The core team is participating as well as important Stakeholders like Prof. Weske, Tobias Metzke-Bernstein, Simon Siegert, Maximilian Völker. The Product Owner takes care of the invitations. -First, the Product Owner presents which stories of the backlog were done and the Development Team shows the product increment and explains what went well and what challenges they faced. Second, the stakeholders give feedback on the product increment and give valuable input for the next sprint. - -**4. Sprint Retrospective:** -It takes place directly 0.5 hours after the sprint review. It should not exceed 1.5 hours. Only the core team is participating. -The Scrum Master is inviting everyone. The goal is to reflect on the last sprint and find ways to improve the scrum process as well as the way the team works together. The Scrum Master informs Maximilian about any changes to the process and updates this wiki. - -### Artefacts -All the relevant scrum artifacts are stored here in this GitHub project. - -**Product Increment:** -* The current product increment can be found on the master branch. It is updated before every sprint review. - -**Product Backlog & Sprint Backlog:** -* Can be found in the "Projects" tab under "Kanban Board". -* For every user story, the definition of done is defined under the point "Conditions of satisfaction". -* New ideas for user stories can be sent to the product owner directly or an issue can be created in the column "User Story Ideas / Bug Reporting" - - -### Agreements - -We agreed on having a **Pull Request freeze on 14:00** the day before the sprint review. This means, that no further Pull Requests may be created until then, if the changes are supposed to be merged for the current sprint goal. The same day **at 18:00 we agreed on a merge freeze**, which means no further pull requests from feature branches are to be merged into dev for the release presented at the sprint review the next day. User stories that are merged after 18:00 will be presented at the next sprint review. - -### Action Points for this Sprint - -During our last retrospective we agreed on tackling the following action points: -* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. -* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` -* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. -* We review pull requests more conscientiously in the future. This has been left a bit behind. -* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. -* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. - -### Old Action Points -* Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. -* The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. -* The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). -* PRs must be reviewed within one business day. Own PRs should not be prioritized over other people's PRs. -* In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. -* Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. -* The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. -* The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. -* Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. -* We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. -* We will delete the Quote-thread. -* The Scrum Master will open a thread regarding further distribution of the presentations which are supposed to be held. We then want to finally assign us to these presentations. -* Pull Requests that introduce more than 500 lines of changes need a more detailed description so that reviewers can understand the components, not only check for syntax. -* Work on spike issues is supposed to be stopped as soon as the estimated time has passed -* We want to figure out ways to find a balance between time spent on our bachelors project and the bachelors thesis. -* We need to define our programming style for issues, wether it's closer to extreme programming or more future proof implementations +## Our current Scrum process is the following: + +### General +- One sprint is usually three weeks long. +- The teams' core work time is Monday-Wednesday (9 am-3 pm) and a fourth flexible day that each team member can set himself +- Each member of the team works about 32 hours per week + +### Meetings + +**1. Daily Scrum:** +Limited to 15 min the daily scrum takes place Monday, Tuesday and Wednesday at 9 am in MS Teams. +Only the core team is participating including Maximilian. +The structure the team agreed on is that every team member shortly answers the following three questions: +* What did I do yesterday that helped the Development Team achieve the sprint goal? +* What will I do today to help the Development Team achieve the sprint goal? +* Do I see any obstacle that will prevent me or the Development Team from achieving the Sprint Goal? + +**2. Sprint Planning:** +It usually takes place on the first day of the new sprint. It should never exceed 4 hours. +Only the core team is participating including Maximilian. The Scrum Master is inviting everyone. The goal is to define a sprint backlog and a sprint goal as well as the responsibilities for the different issues. We estimate the effort of the stories using Planning Poker. We decided to use the Fibonacci scale at the beginning of the 6th sprint. One story point corresponds to 2 man-hours. + +**3. Sprint Review:** +It usually takes place on the last day of the sprint. It takes about 1 hour. +The core team is participating as well as important Stakeholders like Prof. Weske, Tobias Metzke-Bernstein, Simon Siegert, Maximilian Völker. The Product Owner takes care of the invitations. +First, the Product Owner presents which stories of the backlog were done and the Development Team shows the product increment and explains what went well and what challenges they faced. Second, the stakeholders give feedback on the product increment and give valuable input for the next sprint. + +**4. Sprint Retrospective:** +It takes place directly 0.5 hours after the sprint review. It should not exceed 1.5 hours. Only the core team is participating. +The Scrum Master is inviting everyone. The goal is to reflect on the last sprint and find ways to improve the scrum process as well as the way the team works together. The Scrum Master informs Maximilian about any changes to the process and updates this wiki. + +### Artefacts +All the relevant scrum artifacts are stored here in this GitHub project. + +**Product Increment:** +* The current product increment can be found on the master branch. It is updated before every sprint review. + +**Product Backlog & Sprint Backlog:** +* Can be found in the "Projects" tab under "Kanban Board". +* For every user story, the definition of done is defined under the point "Conditions of satisfaction". +* New ideas for user stories can be sent to the product owner directly or an issue can be created in the column "User Story Ideas / Bug Reporting" + + +### Agreements + +We agreed on having a **Pull Request freeze on 14:00** the day before the sprint review. This means, that no further Pull Requests may be created until then, if the changes are supposed to be merged for the current sprint goal. The same day **at 18:00 we agreed on a merge freeze**, which means no further pull requests from feature branches are to be merged into dev for the release presented at the sprint review the next day. User stories that are merged after 18:00 will be presented at the next sprint review. + +### Action Points for this Sprint + +During our last retrospective we agreed on tackling the following action points: +* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. +* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` +* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. +* We review pull requests more conscientiously in the future. This has been left a bit behind. +* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. +* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. + +### Old Action Points +* Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. +* The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. +* The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). +* PRs must be reviewed within one business day. Own PRs should not be prioritized over other people's PRs. +* In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. +* Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. +* The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. +* The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. +* Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. +* We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. +* We will delete the Quote-thread. +* The Scrum Master will open a thread regarding further distribution of the presentations which are supposed to be held. We then want to finally assign us to these presentations. +* Pull Requests that introduce more than 500 lines of changes need a more detailed description so that reviewers can understand the components, not only check for syntax. +* Work on spike issues is supposed to be stopped as soon as the estimated time has passed +* We want to figure out ways to find a balance between time spent on our bachelors project and the bachelors thesis. +* We need to define our programming style for issues, wether it's closer to extreme programming or more future proof implementations From a950ae1d6339e6ed901ca674cf5e6990d9dd1893 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Tue, 25 May 2021 17:57:55 +0200 Subject: [PATCH 087/149] logo to camelCase --- .../HeaderNavbar/HeaderNavbar.jsx | 2 +- .../images/{logo_black.png => logoBlack.png} | Bin .../resources/images/{logo_cta.png => logoCta.png} | Bin .../images/{logo_inverted.png => logoInverted.png} | Bin .../images/{logo_prim.png => logoPrim.png} | Bin 5 files changed, 1 insertion(+), 1 deletion(-) rename frontend/src/resources/images/{logo_black.png => logoBlack.png} (100%) rename frontend/src/resources/images/{logo_cta.png => logoCta.png} (100%) rename frontend/src/resources/images/{logo_inverted.png => logoInverted.png} (100%) rename frontend/src/resources/images/{logo_prim.png => logoPrim.png} (100%) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 088e2377..c21c5358 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../../resources/images/logo_cta.png'; +import logoCTA from '../../../resources/images/logoCta.png'; const { Header } = Layout; diff --git a/frontend/src/resources/images/logo_black.png b/frontend/src/resources/images/logoBlack.png similarity index 100% rename from frontend/src/resources/images/logo_black.png rename to frontend/src/resources/images/logoBlack.png diff --git a/frontend/src/resources/images/logo_cta.png b/frontend/src/resources/images/logoCta.png similarity index 100% rename from frontend/src/resources/images/logo_cta.png rename to frontend/src/resources/images/logoCta.png diff --git a/frontend/src/resources/images/logo_inverted.png b/frontend/src/resources/images/logoInverted.png similarity index 100% rename from frontend/src/resources/images/logo_inverted.png rename to frontend/src/resources/images/logoInverted.png diff --git a/frontend/src/resources/images/logo_prim.png b/frontend/src/resources/images/logoPrim.png similarity index 100% rename from frontend/src/resources/images/logo_prim.png rename to frontend/src/resources/images/logoPrim.png From 9a121ff5bfe582e6ff520a88a8af8d891dc07dc6 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 26 May 2021 08:40:15 +0200 Subject: [PATCH 088/149] rebuild deployment --- .github/workflows/heroku_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/heroku_deploy.yml b/.github/workflows/heroku_deploy.yml index ae806995..c4df65c9 100644 --- a/.github/workflows/heroku_deploy.yml +++ b/.github/workflows/heroku_deploy.yml @@ -1,7 +1,7 @@ on: push: branches: - - workflow_testing_lukas + - main workflow_dispatch: name: Heroku Deployment jobs: From e6557ae7038565f1a886acb185c99db7121ec748 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 26 May 2021 08:46:43 +0200 Subject: [PATCH 089/149] fix frontend test --- .../src/components/pages/RobotOverview/RobotOverview.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js index c38fb06b..a3cc27ee 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.test.js +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.test.js @@ -69,6 +69,6 @@ describe('Testing functionality behind button to trigger function call for new b act(() => { userEvent.click(screen.getByText('Create new Robot')); }); - expect(window.fetch).toHaveBeenCalledTimes(2); + expect(window.fetch).toHaveBeenCalledTimes(3); }); }); From 9bfc85b4a620513eb77d7d834684dc53c3d44a7f Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 10:57:02 +0200 Subject: [PATCH 090/149] implemented pr feedback --- frontend/src/api/routes/users/users.js | 2 ++ .../robotCodeToSsotParsing.js | 24 +++++++++---------- .../ssotToRobotParsing/ssotToRobotParser.js | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/frontend/src/api/routes/users/users.js b/frontend/src/api/routes/users/users.js index b60c9f26..e3123b42 100644 --- a/frontend/src/api/routes/users/users.js +++ b/frontend/src/api/routes/users/users.js @@ -6,6 +6,7 @@ /** * @description Fetch all those ssot names and ids, which are available for the current user * @param { String } userId - UserId for which the ssots will be fetched + * @returns {Array} Array of objects containing ssotId, robotName and starterId of each found robot */ const fetchSsotsForUser = async (userId) => { const requestString = `/users/${userId}/robots`; @@ -17,6 +18,7 @@ const fetchSsotsForUser = async (userId) => { * @description Create a new robot with the specified name for the specified user * @param {String} userId - The user for which the robot will be created * @param {String} robotName - The Name of the new robot + * @returns {Object} Object containing robotId and robotName */ const createNewRobot = async (userId, robotName) => { const body = { diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 353cb78a..9f60ee5d 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -105,7 +105,7 @@ const getApplicationArray = (robotCodeSettingsSection) => { /** * @description Retrieves the outputVariable name from the current code line * @param {String} currentLine Current line of RPAf code - * @returns OutputVariable as string + * @returns {String} Name of the outputVariable */ const getOutputName = (currentLine) => { const indexOfEqualsSign = currentLine.indexOf('='); @@ -121,7 +121,7 @@ const getOutputName = (currentLine) => { * the indexOfFirstSplitPlaceholder returns -1 and therefore the function returns the whole line * @param {String} currentLine Current line of RPAf code * @param {String} splitPlaceholder Placeholder to split the string - * @returns RpaTask as string + * @returns {String} RpaTask for the given code line */ const getRpaTask = (currentLine, splitPlaceholder) => { const indexOfFirstSplitPlaceholder = currentLine.indexOf(splitPlaceholder); @@ -135,7 +135,7 @@ const getRpaTask = (currentLine, splitPlaceholder) => { * @param {String} currentLine Current line of RPAf code * @param {String} splitPlaceholder Placeholder to split the string * @param {String} instructionBlocks Current intruction block to get the rpaTask - * @returns RpaParameters as array + * @returns {Array} List of parameters for the current code line */ const getRpaParameters = (currentLine, splitPlaceholder) => { const indexOfFirstSplitPlaceholder = currentLine.indexOf(splitPlaceholder); @@ -149,7 +149,7 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { * @description Deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format * @param {String} currentLine Current line of RPAf code * @param {String} splitPlaceholder Placeholder to split the string - * @returns The current line without the outputVariableName prefix as string + * @returns {String} The current line without the outputVariableName prefix */ const currentLineWithoutOutputVariableName = ( completeLine, @@ -170,7 +170,7 @@ const currentLineWithoutOutputVariableName = ( * of all Task/Application combinations for the current robot code * @param {Array} allMatchingCombinations All combinations from database that match the rpaTask * @param {*} rpaTask RpaTask from current robotCode line - * @returns Number of occurrences of the rpaTask in allMatchingCombinations + * @returns {Number} Number of occurrences of the rpaTask in allMatchingCombinations */ const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { let numberOfOccurrences = 0; @@ -186,7 +186,7 @@ const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { * @description Returns the matching task object for the rpaTask or throws a notification * @param {String} rpaTask RpaTask from current robotCode line * @param {Array} allMatchingCombinations All combinations from database that match the rpaTask - * @returns The matching task object for the rpaTask or undefined if an error occurs + * @returns {Object} The matching task object for the rpaTask or undefined if an error occurs */ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { const numberOfOccurrences = numberOfOccurrencesOfTask( @@ -219,7 +219,7 @@ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { * @description "Preprocesses" the code in a usable data format * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of Strings * @param {Array} taskAndApplicationCombinations All declared tasks and applications from database - * @returns Array of Objects with the following schema: + * @returns {Array} Array of instructionBlocks with the following schema: * instructionBlocks = [rpaApplication:String, rpaTask:String, name:String, paramArray:Array] */ const getInstructionBlocksFromTaskSection = ( @@ -307,7 +307,7 @@ const getInstructionBlocksFromTaskSection = ( /** * @description Builds a dummy startMarker element and returns them - * @returns Dummy startMarker as JSON => currently MARKERS aren't defined + * @returns {Object} Dummy startMarker as JSON => currently MARKERS aren't defined * in our RPAf-Syntax and therefore there aren't implemented */ const buildStartMarker = () => ({ @@ -321,7 +321,7 @@ const buildStartMarker = () => ({ /** * @description Builds a dummy endMarker element and returns them * @param {Object} predecessor As an Object to get the predecessorId - * @returns Dummy endMarker as JSON => currently MARKERS aren't defined + * @returns {Object} Dummy endMarker as JSON => currently MARKERS aren't defined * in our RPAf-Syntax and therefore there aren't implemented */ const buildEndMarker = (predecessor) => ({ @@ -337,7 +337,7 @@ const buildEndMarker = (predecessor) => ({ * @param {Object} currentElement Current instruction element * @param {Object} singleElementFromTasksSection The parsed Object from the RPAf Code * @param {String} robotId The id of the current robot / ssot - * @returns AttributeObject for a single attribute + * @returns {Object} AttributeObject for a single attribute */ const buildSingleAttributeObject = ( currentElement, @@ -503,7 +503,7 @@ const getElementsArray = ( /** * @description Retrieves the starterId of the robot from the elements array * @param {Array} elementsArray Array of all elements of the robot - * @returns {String} StarterId + * @returns {String} Id of the element that has no predecessors and is therefore the start element of the robot */ const getStarterId = (elementsArray) => { const starterElements = elementsArray.filter( @@ -538,7 +538,7 @@ const getLineNumberForSelector = (robotCodeAsArray, selector) => { /** * @description Parses the RPA-Framework code from the code editor to the single source of truth - * @param {String} robotCode From the code-editor + * @param {String} robotCode Code from the code-editor * @returns Single source of truth as a JavaSctipt-object or undefined if an error occures */ const parseRobotCodeToSsot = (robotCode) => { diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 68ef7591..9adbc228 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -62,7 +62,7 @@ const parseSsotById = async (robotId) => { /** * @description Parses the Ssot provided by its id to an executable .robot file * @param {String} robotId The id of the ssot which will be parsed - * @param {String} jobId The id of the current robotJob that will be executed + * @param {String} jobId The id of the current robotJob that will be executed * @returns {string} Code that has to be put in .robot file */ const parseCodeForJob = async (robotId, jobId) => { From f8e64ac4000ff91af333772fb6316bb6259a87df Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 12:10:03 +0200 Subject: [PATCH 091/149] added return documentation in frontend --- .../src/api/routes/functionalities/functionalities.js | 2 ++ frontend/src/api/routes/robots/robots.js | 9 ++++++--- frontend/src/api/routes/robots/rpaAttributes.js | 1 + frontend/src/api/routes/robots/rpaParameter.js | 2 ++ .../robotCodeToSsotParsing/robotCodeToSsotParsing.js | 10 +++++----- .../parser/ssotToBpmnParsing/ssotToBpmnParsing.js | 5 +++-- .../localFunctionalitiesController/functionalities.js | 1 + .../sessionStorage/localSsotController/parameters.js | 2 +- .../utils/sessionStorage/localSsotController/ssot.js | 1 + 9 files changed, 22 insertions(+), 11 deletions(-) diff --git a/frontend/src/api/routes/functionalities/functionalities.js b/frontend/src/api/routes/functionalities/functionalities.js index 179aba85..8ce9f1b5 100644 --- a/frontend/src/api/routes/functionalities/functionalities.js +++ b/frontend/src/api/routes/functionalities/functionalities.js @@ -6,6 +6,7 @@ /** * @description Fetch tasklist from Mongo-DB * @param {String} application - String with currently selected application from ApplicationDropdown + * @returns {Array} Array of all task for the given application */ const fetchTasksFromDB = async (application) => { const response = await fetch(`/functionalities/${application}/tasks`); @@ -14,6 +15,7 @@ const fetchTasksFromDB = async (application) => { /** * @description Fetch all applications from MongoDB + * @returns {Array} Array of all available applications */ const getAvailableApplications = async () => { const response = await fetch('/functionalities/applications'); diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index 5e54cbd5..e3272a5e 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -12,7 +12,8 @@ const getParsedRobotFile = async (robotId) => /** * @description Fetch the ssot correlating to the specified Id - * @param { String } robotId - Id of the robot that will be retrieved + * @param {String} robotId - Id of the robot that will be retrieved + * @returns {Object} The found ssot */ const getSsot = async (robotId) => { const requestString = `/robots/${robotId}`; @@ -22,8 +23,9 @@ const getSsot = async (robotId) => { /** * @description Rename the robot in the ssot - * @param { String } robotId - RobotId of the robot that will be renamed - * @param { String } newRobotName - String with the new RobotName + * @param {String} robotId - RobotId of the robot that will be renamed + * @param {String} newRobotName - String with the new RobotName + * @returns {Object} Object containing robotName and starterId */ const changeSsotName = async (robotId, newRobotName) => { const payload = { @@ -44,6 +46,7 @@ const changeSsotName = async (robotId, newRobotName) => { /** * @description Delete a robot by sending a call to the backend * @param {String} robotId Id of the robot that will be deleted + * @returns {Object} Mongoose query describing execution of call */ const deleteRobotFromDB = async (robotId) => { const requestStringParameters = `/robots/${robotId}`; diff --git a/frontend/src/api/routes/robots/rpaAttributes.js b/frontend/src/api/routes/robots/rpaAttributes.js index 8e9daf84..06cc49a1 100644 --- a/frontend/src/api/routes/robots/rpaAttributes.js +++ b/frontend/src/api/routes/robots/rpaAttributes.js @@ -35,6 +35,7 @@ const updateManyAttributes = async (attributeObjectList) => { * @description Delete attributes for the given activities by sending a call to the backend * @param {String} robotId Id of the robot that is being used * @param {String} unusedActivityListString Stringified List of activityIds + * @returns {Object} Mongoose query describing execution of call */ const deleteAttributesForActivities = (robotId, activityIdList) => { const requestStringParameters = `/robots/parameters/${robotId}`; diff --git a/frontend/src/api/routes/robots/rpaParameter.js b/frontend/src/api/routes/robots/rpaParameter.js index f576642e..08259156 100644 --- a/frontend/src/api/routes/robots/rpaParameter.js +++ b/frontend/src/api/routes/robots/rpaParameter.js @@ -6,6 +6,7 @@ /** * @description Fetch all parameter objects for a specifc robot * @param { String } robotId Id of the robot to get all the parameters for + * @returns {Array} All objects that have been found for the robot */ const getAllParametersForRobot = async (robotId) => { const requestString = `/robots/parameters/${robotId}`; @@ -35,6 +36,7 @@ const updateManyParameters = async (parameterObjectsList) => { * @description Delete parameters for the given activities by sending a call to the backend * @param {String} robotId Id of the robot that will be used * @param {String} unusedActivityListString Stringified List of activityIds + * @returns {Object} Mongoose query describing execution of call */ const deleteParametersForActivities = (robotId, activityIdList) => { const requestStringParameters = `/robots/parameters/${robotId}`; diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index edb16872..22a367cf 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -10,7 +10,7 @@ const { const FOURSPACE = ' '; /** - * @returns "uniqueId" which is just an increment from the counter in the local storage + * @returns {number} "uniqueId" which is just an increment from the counter in the local storage */ const getUniqueId = () => { const newId = JSON.parse(sessionStorage.getItem('idCounter')) + 1; @@ -19,19 +19,19 @@ const getUniqueId = () => { }; /** - * @returns unique Id; wrapped with the activity nomenclature + * @returns {String} Unique Id; wrapped with the activity nomenclature */ const getActivityId = () => `Activity_0ay${getUniqueId()}`; /** - * @returns unique Id; wrapped with the event nomenclature + * @returns {String} Unique Id; wrapped with the event nomenclature */ const getEventId = () => `Event_0ay${getUniqueId()}`; /** * @description Splits the robot code into an array and deletes all empty lines * @param {String} robotCode Code from the code editor - * @returns Robot code without empty lines as an array + * @returns {Array} Robot code without empty lines as an array */ const getRobotCodeAsArray = (robotCode) => { const robotCodeAsArray = robotCode.split('\n'); @@ -47,7 +47,7 @@ const getRobotCodeAsArray = (robotCode) => { /** * @description Checks all lines of the settings section for the right syntax and returns all declared applications as an array * @param {Array} robotCodeSettingsSection All lines from the settings section as an array-entry (typeof string) - * @returns Array of all declared applications or undefined if an error occures + * @returns {Array} All declared applications or undefined if an error occures */ const getApplicationArray = (robotCodeSettingsSection) => { if (typeof robotCodeSettingsSection === 'undefined') return undefined; diff --git a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index bcf0c36d..62511639 100644 --- a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -11,6 +11,7 @@ const DEFAULT_STARTEVENT_POSITION = '200,330'; /** * @description Searches through the ssot and return the only element without a predecessor * @param {Object} ssot The ssot that will be processed + * @returns {Object} startElement from the ssot */ const findStartElement = (ssot) => ssot.elements.find( @@ -36,8 +37,8 @@ const buildCorrectOrder = (ssot) => { }; /** - * @description Workaround which takes in the created element and updates its id to the one saved in the ssot. - * The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot therefore this workaround is needed. + * @description Workaround which takes in the created element and updates its id to the one saved in the ssot. + * The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot therefore this workaround is needed. * @param {*} modeling The modeling extension * @param {Object} element The first element (start element) to process * @returns {String} The now set id of the shape diff --git a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js index efd78cd0..a5825162 100644 --- a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js +++ b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js @@ -9,6 +9,7 @@ const FUNCTIONALITIES_STORAGE_PATH = 'taskApplicationCombinations'; * @description Retrieves the rpa functionalities object for a specific rpa application and rpa task combination * @param {String} application Name of the rpa application * @param {String} task Name of the rpa task + * @returns {Object} The rpa functionalities object */ const getRpaFunctionalitiesObject = (application, task) => { const rpaFunctionalities = JSON.parse( diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index bb56502f..3df880e1 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -86,7 +86,7 @@ const getParameterObjectForActivity = (activityId) => { * @description Checks if the parameter object is filled correctly * @param {String} parameterObject The parameter object for which to check if it is filled correctly * @param {String} rpaFunctionalitiesObject The rpa functionalities object (rpa-task) needed to check for correctness - * @returns {Boolean} + * @returns {Boolean} Indicates if parameter object is filled correctly */ const checkIfParameterObjectCorrect = ( parameterObject, diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 23746291..086a4303 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -95,6 +95,7 @@ const initSsotSessionStorage = (robotId) => { getAvailableApplications() .then((response) => response.json()) .then((data) => { + console.log(data); sessionStorage.setItem('availableApplications', JSON.stringify(data)); }) .catch((error) => { From 377f4209a7624ba561acea0eaf7a1370b2332758 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 12:22:33 +0200 Subject: [PATCH 092/149] updated backend with return doc --- server/utils/ssotToRobotParsing/retrieveParameters.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/utils/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js index 6ad24d42..491e3822 100644 --- a/server/utils/ssotToRobotParsing/retrieveParameters.js +++ b/server/utils/ssotToRobotParsing/retrieveParameters.js @@ -47,6 +47,7 @@ const retrieveParameters = async (ssot) => { * @description Updates Parameter Objects with new parameters * @param {Array} parameterObjects The selection of parameter objects that will possibly be updated * @param {Array} newParameters New parameters in the form {id, value} that will be used to update the parameter objects + * @returns {Array} Array of updated parameter objects */ const updateParameterObjects = (parameterObjects, newParameters) => { parameterObjects.map((parameterObject) => { @@ -72,6 +73,7 @@ const updateParameterObjects = (parameterObjects, newParameters) => { /** * @description Retrieves all parameters for a specific job * @param {String} jobId The id of the job + * @returns {Array} Array of parameter objects */ const getAllParametersForJob = async (jobId) => { const jobParametersObject = await mongoose From 2f1dca0010518f35a12ed9aa6cdfd87ed98c69e7 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 12:33:18 +0200 Subject: [PATCH 093/149] fixed backend call --- frontend/src/api/routes/robots/rpaAttributes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/api/routes/robots/rpaAttributes.js b/frontend/src/api/routes/robots/rpaAttributes.js index 7c99ea98..4e9ec595 100644 --- a/frontend/src/api/routes/robots/rpaAttributes.js +++ b/frontend/src/api/routes/robots/rpaAttributes.js @@ -37,7 +37,7 @@ const updateManyAttributes = async (attributeObjectList) => { * @param {String} unusedActivityListString Stringified List of Activity Ids */ const deleteAttributesForActivities = (robotId, activityIdList) => { - const requestStringParameters = `/robots/parameters/${robotId}`; + const requestStringParameters = `/robots/rpaattributes/${robotId}`; fetch(requestStringParameters, { method: 'DELETE', body: JSON.stringify({ activityIdList }), From 4fa1dd37bccdabc4c8708cd4a441304e7ebea4d4 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 12:33:59 +0200 Subject: [PATCH 094/149] removed unnecessary import --- frontend/src/utils/sessionStorage/sessionStorageUtils.js | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 8bfcdf20..b1b7962f 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -1,4 +1,3 @@ -import { getAvailableApplications } from '../../api/routes/functionalities/functionalities'; /** * @category Frontend * @module From 87f7450cc68d514c73739f9b7e4b5c0dd7f13718 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 14:02:03 +0200 Subject: [PATCH 095/149] implemented pr feedback --- server/api/models/rpaTaskModel.js | 2 +- server/socket/socketManager.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/api/models/rpaTaskModel.js b/server/api/models/rpaTaskModel.js index ff7efda5..9a100eed 100644 --- a/server/api/models/rpaTaskModel.js +++ b/server/api/models/rpaTaskModel.js @@ -16,7 +16,7 @@ const rpaTaskSchema = new Schema({ code: { type: String, required: [true, 'Code required'] }, outputValue: Boolean, inputVars: [rpaParameterSchema], - Output: rpaParameterSchema, + output: rpaParameterSchema, }); mongoose.model('rpa-task', rpaTaskSchema); diff --git a/server/socket/socketManager.js b/server/socket/socketManager.js index b4c41e13..637978cb 100644 --- a/server/socket/socketManager.js +++ b/server/socket/socketManager.js @@ -24,9 +24,9 @@ exports.socketManager = (io, socket) => { .then((jobList) => { if (jobList.length > 0) { jobList.forEach((job) => { - const { id, robot_id } = job; + const { id, robotId } = job; socketHelperFunctions - .getRobotCodeForJob(robot_id, id) + .getRobotCodeForJob(robotId, id) .then((robotCode) => { if (robotCode) { socketHelperFunctions.updateRobotJobStatus( From f9ae2dea5ec817b28e8cc1257eec643dbff19c2d Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Wed, 26 May 2021 14:05:59 +0200 Subject: [PATCH 096/149] fix bug after merging --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 842e7d5d..3883a13d 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -2,7 +2,6 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Layout, Menu } from 'antd'; import { Link } from 'react-router-dom'; -import logoCTA from '../../../../public/logo/logo_cta.png'; import styles from './HeaderNavbar.module.css'; const { Header } = Layout; @@ -50,7 +49,7 @@ const HeaderNavbar = (props) => { ark_automate Icon From baeeb0d9d67ab651a8351d2524987df9320d85ad Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 26 May 2021 14:09:10 +0200 Subject: [PATCH 097/149] delete caching and fix tests --- .../modelerSidebarFunctionality.js | 52 +++---- .../modelerSidebarFunctionality.test.js | 139 ++---------------- .../pages/RobotModeler/RobotModeler.jsx | 1 - .../localSsotController/ssot.js | 1 - 4 files changed, 38 insertions(+), 155 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 7c172c55..8aff6fe6 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -5,7 +5,6 @@ * @module */ -import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/functionalities'; import { setRpaTask, setRpaApplication, @@ -67,31 +66,24 @@ const modelerElementChangeHandler = (event, elementState, setterObject) => { }; /** - * @description Checks if tasks for selected application are already stored in session storage. - * Otherwise, fetch tasklist from MongoDB. + * @description Sets all tasks for currently selected application from session storage * @param {String} application Application for which to get the tasks for. - * @param {Object} setterObject object containing the functions for setting the state in the React component + * @param {Object[]} taskApplicationCombinations Array of task and application combination objects. + * @param {Object} setterObject Object containing the functions for setting the state in the React component. */ -const getTasksForApplication = async (application, setterObject) => { - const currentSavedTasksObject = JSON.parse( - sessionStorage.getItem('taskToApplicationCache') +const getTasksForApplication = ( + application, + taskApplicationCombinations, + setterObject +) => { + const allMatchingApplicationCombinations = taskApplicationCombinations.filter( + (singleCombination) => singleCombination.Application === application ); - - if (application in currentSavedTasksObject) { - setterObject.setTasksForSelectedApplication( - currentSavedTasksObject[application] - ); - setterObject.setDisableTaskSelection(false); - } else { - const data = await (await fetchTasksFromDB(application)).json(); - currentSavedTasksObject[application] = data; - sessionStorage.setItem( - 'taskToApplicationCache', - JSON.stringify(currentSavedTasksObject) - ); - setterObject.setTasksForSelectedApplication(data); - setterObject.setDisableTaskSelection(false); - } + const allTasksForApplication = allMatchingApplicationCombinations.map( + (singleCombination) => singleCombination.Task + ); + setterObject.setTasksForSelectedApplication(allTasksForApplication); + setterObject.setDisableTaskSelection(false); }; /** @@ -105,13 +97,20 @@ const checkForApplicationTask = (activityId, setterObject) => { const currentAttributes = JSON.parse( sessionStorage.getItem('attributeLocalStorage') ); + const taskApplicationCombinations = JSON.parse( + sessionStorage.getItem('taskApplicationCombinations') + ); const matchingActivity = currentAttributes.find( (element) => element.activityId === activityId ); if (matchingActivity) { setterObject.setSelectedApplication(matchingActivity.rpaApplication); - getTasksForApplication(matchingActivity.rpaApplication, setterObject); + getTasksForApplication( + matchingActivity.rpaApplication, + taskApplicationCombinations, + setterObject + ); } return !!matchingActivity && !!matchingActivity.rpaApplication; }; @@ -213,10 +212,13 @@ const applicationChangedHandler = ( selectedElements: elementState.selectedElements, currentElement: elementState.currentElement, }); + const taskApplicationCombinations = JSON.parse( + sessionStorage.getItem('taskApplicationCombinations') + ); setterObject.setSelectedApplication(value); setRpaApplication(robotId, elementState.currentElement.id, value); - getTasksForApplication(value, setterObject); + getTasksForApplication(value, taskApplicationCombinations, setterObject); setterObject.setOutputValueName(undefined); setterObject.setParameterList([]); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index bdb2019c..903e0910 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -244,7 +244,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); }); - it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application already in sessionstorage', async () => { + it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -283,68 +283,12 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { JSON.stringify(MOCK_TASK_TO_APPLICATION) ); - const taskToApplication = { cookbookApplication: ['TestTask'] }; - sessionStorage.setItem( - 'taskToApplicationCache', - JSON.stringify(taskToApplication) - ); - - modelerSelectionChangeHandler( - constants.MOCK_EVENT, - constants.MOCK_ELEMENT_STATE, - constants.MOCK_ROBOT_ID, - MOCK_SETTER_OBJECT - ); - }); - - it('handles modeler selection change; element is a task and no matching attributes found; with attribute obj match found; application not yet in sessionstorage', async () => { - const MOCK_SETTER_OBJECT = { - setElementState: (stateObject) => { - expect(stateObject).toEqual({ - selectedElements: constants.MOCK_SELECTED_ELEMENTS, - currentElement: constants.MOCK_CURRENT_ELEMENT, - }); - }, - setSelectedApplication: (value) => { - expect(value).toEqual(constants.MOCK_APPLICATION); - }, - setOutputValueName: (newName) => { - expect(newName).toBeUndefined(); - }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); - }, - setTasksForSelectedApplication: (availableTasks) => { - expect(availableTasks).toEqual(['TestTask']); - }, - setDisableTaskSelection: (disabled) => { - expect(disabled).toBeFalsy(); - }, - }; - - const MOCK_TASK_TO_APPLICATION = [ - { - activityId: constants.MOCK_CURRENT_ELEMENT_ID, - robotId: constants.MOCK_ROBOT_ID, - rpaApplication: constants.MOCK_APPLICATION, - rpaTask: 'Open Application', - }, + const taskApplicationCombinations = [ + { Application: 'cookbookApplication', Task: 'TestTask' }, ]; - - fetchTasksFromDB.mockImplementation(async (application) => { - expect(application).toEqual(constants.MOCK_VALUE); - return { json: () => ['TestTask'] }; - }); - - sessionStorage.setItem( - 'attributeLocalStorage', - JSON.stringify(MOCK_TASK_TO_APPLICATION) - ); - - const taskToApplication = { recipeApplication: ['TestTask'] }; sessionStorage.setItem( - 'taskToApplicationCache', - JSON.stringify(taskToApplication) + 'taskApplicationCombinations', + JSON.stringify(taskApplicationCombinations) ); modelerSelectionChangeHandler( @@ -428,7 +372,7 @@ describe('Sidebar Functionality: Task Change', () => { }); describe('Sidebar Functionality: Application Change', () => { - it('handles application change WITH cache existing', async () => { + it('handles application change', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ @@ -453,67 +397,12 @@ describe('Sidebar Functionality: Application Change', () => { }, }; - const taskToApplication = { cookbookApplication: ['TestTask'] }; - sessionStorage.setItem( - 'taskToApplicationCache', - JSON.stringify(taskToApplication) - ); - - setRpaApplication.mockImplementation( - (robotId, selectedElementId, value) => { - expect(value).toEqual(constants.MOCK_VALUE); - expect(robotId).toEqual(constants.MOCK_ROBOT_ID); - expect(selectedElementId).toEqual(constants.MOCK_CURRENT_ELEMENT_ID); - } - ); - - applicationChangedHandler( - constants.MOCK_VALUE, - constants.MOCK_ROBOT_ID, - constants.MOCK_ELEMENT_STATE, - MOCK_SETTER_OBJECT - ); - expect(setRpaApplication).toHaveBeenCalledTimes(1); - }); - - it('handles application change WITHOUT cache existing', async () => { - const MOCK_VALUE = 'cookbookApplication'; - const MOCK_ROBOT_ID = '0123456789-4711'; - const MOCK_CURRENT_ELEMENT_ID = '123450815'; - const MOCK_CURRENT_ELEMENT = { id: constants.MOCK_CURRENT_ELEMENT_ID }; - const MOCK_SELECTED_ELEMENTS = [constants.MOCK_CURRENT_ELEMENT]; - const MOCK_ELEMENT_STATE = { - selectedElements: constants.MOCK_SELECTED_ELEMENTS, - currentElement: constants.MOCK_CURRENT_ELEMENT, - }; - const MOCK_SETTER_OBJECT = { - setElementState: (stateObject) => { - expect(stateObject).toEqual({ - selectedElements: constants.MOCK_SELECTED_ELEMENTS, - currentElement: constants.MOCK_CURRENT_ELEMENT, - }); - }, - setSelectedApplication: (value) => { - expect(value).toEqual(constants.MOCK_VALUE); - }, - setOutputValueName: (newName) => { - expect(newName).toBeUndefined(); - }, - setParameterList: (newParameterList) => { - expect(newParameterList).toEqual([]); - }, - setTasksForSelectedApplication: (availableTasks) => { - expect(availableTasks).toEqual(['lookupRecipe']); - }, - setDisableTaskSelection: (disabled) => { - expect(disabled).toBeFalsy(); - }, - }; - - const taskToApplication = { recipeApplication: ['TestTask'] }; + const taskApplicationCombinations = [ + { Application: 'cookbookApplication', Task: 'TestTask' }, + ]; sessionStorage.setItem( - 'taskToApplicationCache', - JSON.stringify(taskToApplication) + 'taskApplicationCombinations', + JSON.stringify(taskApplicationCombinations) ); setRpaApplication.mockImplementation( @@ -524,11 +413,6 @@ describe('Sidebar Functionality: Application Change', () => { } ); - fetchTasksFromDB.mockImplementation(async (application) => { - expect(application).toEqual(constants.MOCK_VALUE); - return { json: () => ['lookupRecipe'] }; - }); - applicationChangedHandler( constants.MOCK_VALUE, constants.MOCK_ROBOT_ID, @@ -536,6 +420,5 @@ describe('Sidebar Functionality: Application Change', () => { MOCK_SETTER_OBJECT ); expect(setRpaApplication).toHaveBeenCalledTimes(1); - expect(fetchTasksFromDB).toHaveBeenCalledTimes(1); }); }); diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index d9363e62..f5f6bf37 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -60,7 +60,6 @@ const RobotModeler = (match) => { initSessionStorage('parameterLocalStorage', JSON.stringify([])); sessionStorage.setItem('parameterLocalStorage', JSON.stringify(data)); }); - initSessionStorage('taskToApplicationCache', JSON.stringify({})); }, []); return ( diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 159cdcfc..1ef9af8d 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -98,7 +98,6 @@ const initSsotSessionStorage = (robotId) => { console.error(error); }); - initSessionStorage('taskToApplicationCache', JSON.stringify({})); initSessionStorage('availableApplications', JSON.stringify([])); const applicationList = JSON.parse( sessionStorage.getItem('availableApplications') From 6bcaf8d034cb1ca21939b374ccff44b0b95cdc86 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Wed, 26 May 2021 14:29:44 +0200 Subject: [PATCH 098/149] init robotMetadata while clicking on RobotContainer --- .../modelerSidebarFunctionality.test.js | 1 - .../pages/RobotModeler/RobotModeler.jsx | 7 ----- .../RobotContainer/RobotContainer.jsx | 26 +++++++++---------- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 903e0910..ce0e557f 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -31,7 +31,6 @@ import { setOutputValueName, getParameterObject, } from '../../../../../utils/sessionStorage/localSsotController/parameters'; -import { fetchTasksFromDB } from '../../../../../api/routes/functionalities/functionalities'; import constants from './modelerSidebarFunctionalityTestingUtils'; import { getParsedRobotFile } from '../../../../../api/routes/robots/robots'; import downloadString from './downloadStringAsFile'; diff --git a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx index f5f6bf37..c49b5dd6 100644 --- a/frontend/src/components/pages/RobotModeler/RobotModeler.jsx +++ b/frontend/src/components/pages/RobotModeler/RobotModeler.jsx @@ -6,7 +6,6 @@ import ModelerSidebar from './ModelerSidebar/ModelerSidebar'; import { getSsot } from '../../../api/routes/robots/robots'; import { getAllParametersForRobot } from '../../../api/routes/robots/rpaParameter'; import { getAllAttributes } from '../../../api/routes/robots/rpaAttributes'; -import { setRobotMetadata } from '../../../utils/sessionStorage/localSsotController/ssot'; import { initSessionStorage } from '../../../utils/sessionStorage/sessionStorageUtils'; import 'bpmn-js/dist/assets/diagram-js.css'; @@ -19,7 +18,6 @@ import 'bpmn-font/dist/css/bpmn-embedded.css'; */ const RobotModeler = (match) => { const { robotId } = match.match.params; - setRobotMetadata(undefined, robotId); const [modeler, setModeler] = useState(null); const [robotName, setRobotName] = useState(); @@ -32,15 +30,10 @@ const RobotModeler = (match) => { */ useEffect(() => { initSessionStorage('idCounter', JSON.stringify('541')); - const robotMetadata = { - robotId, - }; - sessionStorage.setItem('robotMetadata', JSON.stringify(robotMetadata)); getSsot(robotId) .then((response) => response.json()) .then((data) => { sessionStorage.setItem('ssotLocal', JSON.stringify(data)); - setRobotMetadata(data.robotName, robotId); setRobotName(data.robotName); }) .catch((error) => { diff --git a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index 50866901..5436117f 100644 --- a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -9,7 +9,6 @@ import { import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import styles from './RobotContainer.module.css'; -import { initSsotSessionStorage } from '../../../../utils/sessionStorage/localSsotController/ssot'; import { changeSsotName, deleteRobotFromDB, @@ -30,13 +29,6 @@ const RobotContainer = (props) => { const [confirmLoading, setConfirmLoading] = useState(false); const [hoveredUpon, setHoveredUpon] = useState(false); - /** - * @description Sends a job to the server to execute a specfic robot for a specific user - */ - const initLocalSsot = () => { - initSsotSessionStorage(robotId); - }; - /** * @description Updates the name of the robot in the backend and in the robot container * @param {String} newRobotName New name of the robot @@ -65,6 +57,17 @@ const RobotContainer = (props) => { }); }; + /** + * @description Sets the robotName and robotId to local storage + */ + const setRobotMetadata = () => { + const robotMetadata = { + robotId, + robotName, + }; + sessionStorage.setItem('robotMetadata', JSON.stringify(robotMetadata)); + }; + return ( { }} > - + - + From 1767aeb2cd787e96322fd0de1a5a99856c1f44ac Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 15:25:05 +0200 Subject: [PATCH 099/149] updated workflow for testing --- .github/workflows/publishDocumentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publishDocumentation.yml b/.github/workflows/publishDocumentation.yml index d7752659..4ae32157 100644 --- a/.github/workflows/publishDocumentation.yml +++ b/.github/workflows/publishDocumentation.yml @@ -3,7 +3,7 @@ name: Publish Documentation to GitHub pages on: push: branches: - - main + - 281_documentation jobs: deploy: From 96c64a7439a9d9ecb300f5b4e9e186c7192396fe Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 15:28:49 +0200 Subject: [PATCH 100/149] added description --- .../parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 22a367cf..2443e421 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -512,8 +512,9 @@ const getStarterId = (elementsArray) => { } return 'no starter id found'; }; + /** - * @description + * @description Retrieves the line number for a given selector * @param {Array} robotCodeAsArray The complete robotCode w/o new lines as array * @param {String} selector The selector for which the line number will be retrieved * @returns {number} Line number where the selector occurs From 8c1d40be2b2d49dedd9b3827f0583d9b005d4f2a Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 15:34:24 +0200 Subject: [PATCH 101/149] fixed workflow --- documentationConfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentationConfig.json b/documentationConfig.json index 277a563e..79befd1c 100644 --- a/documentationConfig.json +++ b/documentationConfig.json @@ -10,8 +10,8 @@ "source": { "include": [ "./../frontend/src", - "./../server/controllers", - "./../server/services", + "./../server/api/", + "./../server/socket/", "./../server/utils" ], "exclude": ["./../frontend/node_modules", "./../server/node_modules"], From 430f06d951c8928bf3d43214452948b9cdeb9aa7 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Wed, 26 May 2021 15:38:28 +0200 Subject: [PATCH 102/149] fixed workflow II --- documentationConfig.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/documentationConfig.json b/documentationConfig.json index 79befd1c..54a8a502 100644 --- a/documentationConfig.json +++ b/documentationConfig.json @@ -8,12 +8,7 @@ }, "plugins": ["node_modules/better-docs/category"], "source": { - "include": [ - "./../frontend/src", - "./../server/api/", - "./../server/socket/", - "./../server/utils" - ], + "include": ["./../frontend/src", "./../server/utils/ssotToRobotParsing"], "exclude": ["./../frontend/node_modules", "./../server/node_modules"], "includePattern": ".+\\.js(doc|x)?$", "excludePattern": "(^|\\/|\\\\)_" From 98862658e1116c066d4079b95b0386ba1b9ccaae Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Wed, 26 May 2021 15:41:30 +0200 Subject: [PATCH 103/149] document github workflows --- wiki/Github-Workflows.md | 74 ++++++++++++++++++++++++++++++++++++++++ wiki/_Sidebar.md | 1 + 2 files changed, 75 insertions(+) create mode 100644 wiki/Github-Workflows.md diff --git a/wiki/Github-Workflows.md b/wiki/Github-Workflows.md new file mode 100644 index 00000000..265c709e --- /dev/null +++ b/wiki/Github-Workflows.md @@ -0,0 +1,74 @@ +# Github Workflows + +To ensure quality, this repo is equipped with a variety of workflows. +Because this repository combines the frontend, as well as the backend, there are testing and linting workflows, which will be the same for both subdirectories. + +## Testing + +These workflows will run a matrix test on the node versions 12.x and 14.x, as well as the latests versions of macOS, Windows and Ubuntu. +The workflows will checkout the repository, and run `npm ci`, as well as `npm test` in the client/server directory. + +Files: + +- frontendTesting.yml (Frontend testing) +- backendTesting.yml (Backend testing) + +Runs on: + +- pushes to the `DEV` branch +- PRs to the `DEV` branch +- on workflow dispatch event (manual trigger) + +## Linting + +The workflows will checkout the repository, initialize node on version 14, and run `npm ci`, as well as `npm run lint` in the client/server directory. + +Files: + +- linter client.yml (Lint Client Code Base) +- linter server.yml (Lint Server Code Base) + +Runs on: + +- all pushes except to the `Main` branch +- all PRs except to the `Main` branch + +## Code Documentation + +The workflows will checkout the repository, navigate to the client directory, which contains the required command for documentation generation and will generate this by calling `cd ./client/ && npm install --save-dev better-docs jsdoc && npm run docs`. +The resulting directory of `/documentationWebsite` will be deployed to Github Pages by an external Github action. + +Files: + +- publishDocumentation.yml (Publish Documentation to GitHub pages) + +Runs on: + +- pushes to the `Main` branch + +## Repository Wiki Sync + +The workflows will checkout the repository, and will use an external Github Action to deploy the `/wiki` directory to the repositories wiki. For this fictional data (username: Wiki Warden) is used for the commit. + +Files: + +- wikiPageSync.yml (Wiki Update) + +Runs on: + +- pushes to the `DEV` branch + +## Code Deployment + +The workflows will checkout the repository and navigate to the `client` directory. There it will build the frontend, which results in a directory called `build`, which will then be moved to the top-level of the repository. Additionally the `client` directory is deleted and all content from the `server` directory is moved to the toplevel of the repository. +From there on an external Github Action is used to authenticate to the Heroku CLI with the `HEROKU_API_KEY` and `HEROKU_EMAIL` secrets set in the repository secrets. The Heroku application name is set to `ark-automate` by default in the workflow. +Finally, the deployment is being completed by commiting the changes and pushing to the heroku remote. + +Files: + +- heroku_deploy.yml (Heroku Deployment) + +Runs on: + +- pushes to the `Main` branch +- on workflow dispatch event (manual trigger) diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index 8743c059..68b020ea 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -13,6 +13,7 @@ Back to the [Wiki home](https://github.com/bptlab/ark_automate/wiki) - [Our single source of truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) - [Corporate identity of Ark_automate](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) - [Team work](https://github.com/bptlab/ark_automate/wiki/Team-Scrum-process) + - [Github Workflows](https://github.com/bptlab/ark_automate/wiki/Github-Workflows) - Concepts - [Planned user interaction](https://github.com/bptlab/ark_automate/wiki/concept-Starting-and-orchestrating-Bots) in the summer of 2021 From 70811c53f22dd6b48a4c6a91d0e0a90572238029 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Thu, 27 May 2021 09:52:08 +0200 Subject: [PATCH 104/149] further pr feedback --- frontend/src/api/routes/robots/robots.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index e3272a5e..e2a8c53d 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -6,7 +6,7 @@ /** * @description Triggers parsing of the Ssot to .robot file * @returns returns .robot file code - * */ + */ const getParsedRobotFile = async (robotId) => fetch(`/robots/${robotId}/robotCode`); From fc5964d4c48078028c601959c5546b7d43d4a43e Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Thu, 27 May 2021 11:00:20 +0200 Subject: [PATCH 105/149] Update frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- .../modelerSidebarFunctionality.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 5aa2ba14..21ce6f83 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -466,7 +466,7 @@ describe('Sidebar Functionality: Application Change', () => { expect(setRpaApplication).toHaveBeenCalledTimes(1); }); - it('handle application change WITHOUT cache existing', async () => { + it('handles application change WITHOUT cache existing', async () => { const MOCK_SETTER_OBJECT = { setElementState: (stateObject) => { expect(stateObject).toEqual({ From 5d902be7fb4dbfc904dd0ddf9702734006758209 Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Thu, 27 May 2021 11:48:44 +0200 Subject: [PATCH 106/149] Create LICENSE.md --- LICENSE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..cf69a60c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 [Sandro Speh](https://github.com/SanJSp), [Lukas Hüller](https://github.com/lukashueller), [Kay Erik Jenß](https://github.com/kej-jay), [Daniel Woelki](https://github.com/WolfgangDaniel) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 0c4ae5f5e71dc2f92d91e4c8238a76891f3b5cf4 Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Thu, 27 May 2021 16:35:00 +0200 Subject: [PATCH 107/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 470130d9..12a1ceb5 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ The main contributors to the project are the four members of the [2020/21 Bachel - [Daniel Woelki](https://github.com/WolfgangDaniel) These four participants will push the project forward as part of their bachelor's degree until the summer of 2021. -At the same time our commitment to open source means that we are enabling -in fact encouraging- all interested parties to contribute and become part of its developer community. +At the same time our commitment to open source means that we are enabling -in fact encouraging- all interested parties to contribute and become part of its developer community. Regarding Open Source, this project underlays a MIT license which you can find [here](https://github.com/bptlab/ark_automate/blob/DEV/LICENSE.md) ## Project documentation From fbcfe6b24a7fa98f1c57f5d8a252e4f7191b6f6d Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Thu, 27 May 2021 16:37:41 +0200 Subject: [PATCH 108/149] Update docuGenerationHelper.js --- server/utils/openApiDocumentation/docuGenerationHelper.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/utils/openApiDocumentation/docuGenerationHelper.js b/server/utils/openApiDocumentation/docuGenerationHelper.js index 29ae75b0..dca00b79 100644 --- a/server/utils/openApiDocumentation/docuGenerationHelper.js +++ b/server/utils/openApiDocumentation/docuGenerationHelper.js @@ -7,6 +7,10 @@ const swaggerDefinition = { version: '1.0.0', description: '_This document describes the REST API of Ark Automate._
Ark Automate is a platform that allows office users and software developers to automate business or everyday processes by simply sketching the steps of their process. By using simple flowcharts or powerful BPMN in their process outlines, users can create small software solutions using RPA that finish their tasks much faster and more reliably.', + license: { + name: 'LICENSE (MIT)', + url: 'https://github.com/bptlab/ark_automate/blob/main/LICENSE.md', + }, }, servers: [ { From d98072ccd28afb3b81b632bad392607d19774e7a Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Thu, 27 May 2021 16:38:07 +0200 Subject: [PATCH 109/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12a1ceb5..2ecf817d 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ The main contributors to the project are the four members of the [2020/21 Bachel - [Daniel Woelki](https://github.com/WolfgangDaniel) These four participants will push the project forward as part of their bachelor's degree until the summer of 2021. -At the same time our commitment to open source means that we are enabling -in fact encouraging- all interested parties to contribute and become part of its developer community. Regarding Open Source, this project underlays a MIT license which you can find [here](https://github.com/bptlab/ark_automate/blob/DEV/LICENSE.md) +At the same time our commitment to open source means that we are enabling -in fact encouraging- all interested parties to contribute and become part of its developer community. Regarding Open Source, this project underlays a MIT license which you can find [here](https://github.com/bptlab/ark_automate/blob/main/LICENSE.md) ## Project documentation From 93a4a58c41e54b077c338f85338d497181a49616 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Fri, 28 May 2021 16:39:05 +0200 Subject: [PATCH 110/149] fix PR comments --- .../modelerSidebarFunctionality.js | 3 +-- .../src/utils/sessionStorage/localSsotController/ssot.js | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 8aff6fe6..bac39103 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -27,7 +27,6 @@ import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/b * This function will retrieve the xml from the parser, parse that xml to a ssot and write the * resulting ssot into the sessionStorage. * @param {Object} modeler the modeling object - * @param {String} robotId id of the robot */ const onSaveToCloud = async (modeler) => { const xml = await modeler.saveXML({ format: true }); @@ -68,7 +67,7 @@ const modelerElementChangeHandler = (event, elementState, setterObject) => { /** * @description Sets all tasks for currently selected application from session storage * @param {String} application Application for which to get the tasks for. - * @param {Object[]} taskApplicationCombinations Array of task and application combination objects. + * @param {Array} taskApplicationCombinations Array of task and application combination objects. * @param {Object} setterObject Object containing the functions for setting the state in the React component. */ const getTasksForApplication = ( diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 1ef9af8d..10206ceb 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -29,14 +29,14 @@ const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; /** * @description Gets the robotId of the currently opened robot from the session storage - * @returns Currently saved robotId + * @returns {String} Currently saved robotId */ const getRobotId = () => JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)).robotId; /** - * @description Gets the robotName of the currently opened robot from the session storage - * @returns Currently saved robotName + * @description Retrieves the robotName of the currently opened robot from the session storage + * @returns {String} Currently saved robotName */ const getRobotName = () => JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)).robotName; From a4c7da9aac899283c4041234b95999d21225aa1d Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sat, 29 May 2021 10:31:46 +0200 Subject: [PATCH 111/149] added pr feedback --- frontend/src/api/routes/robots/robots.js | 2 +- .../PPParameterSection/subComponents/PPParameterInput.jsx | 2 +- .../src/components/pages/RobotOverview/RobotOverview.jsx | 2 +- .../parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js | 2 +- .../utils/sessionStorage/localSsotController/attributes.js | 6 +++--- .../src/utils/sessionStorage/localSsotController/ssot.js | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index e2a8c53d..d712c430 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -5,7 +5,7 @@ /** * @description Triggers parsing of the Ssot to .robot file - * @returns returns .robot file code + * @returns {String} returns .robot file code */ const getParsedRobotFile = async (robotId) => fetch(`/robots/${robotId}/robotCode`); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx index 754a47b1..86819331 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/PropertiesPanel/PropertiesPanelSections/PPParameterSection/subComponents/PPParameterInput.jsx @@ -79,7 +79,7 @@ const PPParameterInput = ({ /** * @description returns the Unlock-Icon - * @returns the corresponding icon + * @returns {React.ReactElement} the corresponding icon */ const returnLockIcon = (inputParameterName) => ( { /** * @description Creates all boxes for the robots from the database - * @returns All Boxes that match the current searchValue as React component * @param {String} currentSearchValue Currently stored value of the search bar, by which the boxes to be displayed are selected + * @returns {React.ReactElement} All Boxes that match the current searchValue as React component */ const createRobotBoxes = (currentSearchValue) => { const filteredRobotList = Object.values(robotList) diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 2443e421..cbbff880 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -536,7 +536,7 @@ const getLineNumberForSelector = (robotCodeAsArray, selector) => { /** * @description Parses the RPA-Framework code from the code editor to the single source of truth * @param {String} robotCode Code from the code-editor - * @returns Single source of truth as a JavaSctipt-object or undefined if an error occures + * @returns {Object} Single source of truth as a JavaSctipt-object or undefined if an error occures */ const parseRobotCodeToSsot = (robotCode) => { const robotId = JSON.parse(sessionStorage.getItem('robotId')); diff --git a/frontend/src/utils/sessionStorage/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js index ef770d3f..72200e06 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/attributes.js +++ b/frontend/src/utils/sessionStorage/localSsotController/attributes.js @@ -16,7 +16,7 @@ const getAttributeStorage = () => /** * @description Retrieves the attribute object for an activiy from session storage * @param {String} activityId Id of the activity for which the attribute object will be retrieved - * @returns The attribute object for the selected activity or undefined if not available + * @returns {Object} The attribute object for the selected activity or undefined if not available */ const getAttributeObjectForActivity = (activityId) => { const localAttributeStorage = JSON.parse( @@ -30,7 +30,7 @@ const getAttributeObjectForActivity = (activityId) => { /** * @description Retrieves the selected rpa task for the selected activity from session storage * @param {String} activityId Id of the currently selected activity - * @returns The selected rpa task for the selected activity from session storage or undefined if not available + * @returns {String} The selected rpa task for the selected activity from session storage or undefined if not available */ const getRpaTask = (activityId) => { const matchingEntry = getAttributeObjectForActivity(activityId); @@ -116,7 +116,7 @@ const setRpaApplication = (robotId, activityId, newApplication) => { /** * @description Retrieves the rpa application for the selected activity from the session storage * @param {String} activityId Id of the currently selected activity - * @returns The selected rpa application for the selected activity or undefined + * @returns {String} The selected rpa application for the selected activity or undefined */ const getRpaApplication = (activityId) => { const matchingEntry = getAttributeObjectForActivity(activityId); diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 086a4303..cd9fcad6 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -29,7 +29,7 @@ const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; /** * @description Retrieves the robotId of the currently opened robot from the session storage - * @returns Currently saved robotId + * @returns {String} Currently saved robotId */ const getRobotId = () => JSON.parse(sessionStorage.getItem(ROBOT_ID_PATH)); From 7ad4e81761a22ed2f9c2058f6aeeb62b9a368978 Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Sat, 29 May 2021 13:50:58 +0200 Subject: [PATCH 112/149] update iml filenames and main branch --- wiki/Github-Workflows.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/wiki/Github-Workflows.md b/wiki/Github-Workflows.md index 265c709e..8b7370c1 100644 --- a/wiki/Github-Workflows.md +++ b/wiki/Github-Workflows.md @@ -25,13 +25,13 @@ The workflows will checkout the repository, initialize node on version 14, and r Files: -- linter client.yml (Lint Client Code Base) -- linter server.yml (Lint Server Code Base) +- linterFrontend.yml (Lint Frontend Code Base) +- linterServer.yml (Lint Server Code Base) Runs on: -- all pushes except to the `Main` branch -- all PRs except to the `Main` branch +- all pushes except to the `main` branch +- all PRs except to the `main` branch ## Code Documentation @@ -44,7 +44,7 @@ Files: Runs on: -- pushes to the `Main` branch +- pushes to the `main` branch ## Repository Wiki Sync @@ -66,9 +66,9 @@ Finally, the deployment is being completed by commiting the changes and pushing Files: -- heroku_deploy.yml (Heroku Deployment) +- herokuDeploy.yml (Heroku Deployment) Runs on: -- pushes to the `Main` branch +- pushes to the `main` branch - on workflow dispatch event (manual trigger) From cc6d55703b1c44aa62e2931619eaef12d445d19b Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Sat, 29 May 2021 15:44:58 +0200 Subject: [PATCH 113/149] fix parsing bug --- .../generateCodeForRpaTasks.js | 34 +++++++++++++------ .../ssotToRobotParsing/ssotToRobotParser.js | 6 ++-- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 6ed8b5e7..aec7512e 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -36,9 +36,10 @@ const setOutputValue = (paramObject) => { /** * @description Will append all provided parameters to a string which can be used to generate the RPAf file * @param {Object} parameterObject The parameter object to check and loop through + * @param {String} parsingMode Indicates if the parser is used for the frontend or the local client * @returns {String} String specifying the input parameters with the needed spacing in between */ -const appendRpaInputParameter = (parameterObject) => { +const appendRpaInputParameter = (parameterObject, parsingMode) => { let newCodeLine = ''; const sortedInputs = parameterObject.rpaParameters.sort( @@ -50,7 +51,7 @@ const appendRpaInputParameter = (parameterObject) => { newCodeLine += `!!${parameter.name}!!`; return; } - if (parameter.value === '') { + if (parameter.value === '' && parsingMode === 'frontend') { newCodeLine += `%%${parameter.name}%%`; return; } @@ -82,6 +83,7 @@ const successorTasksExist = (currentElement) => * @param {Array} parameters All parameter objects of the robot * @param {Array} attributes All attribute objects of the robot * @param {String} codeToAppend The current code we want to extend + * @param {String} parsingMode Indicates if the parser is used for the frontend or the local client * @returns {string} Generated .robot code for the tasks section */ const writeCodeForElement = ( @@ -90,7 +92,8 @@ const writeCodeForElement = ( parameters, attributes, codeToAppend, - duplicateTasks + duplicateTasks, + parsingMode ) => { const currentElement = elements.find((element) => element.id === id); let combinedCode = codeToAppend; @@ -113,7 +116,10 @@ const writeCodeForElement = ( newCodeLine += currentAttributeObject.rpaTask; } if (currentParameterObject) { - newCodeLine += appendRpaInputParameter(currentParameterObject); + newCodeLine += appendRpaInputParameter( + currentParameterObject, + parsingMode + ); } newCodeLine += LINEBREAK; @@ -130,7 +136,8 @@ const writeCodeForElement = ( parameters, attributes, combinedCode, - duplicateTasks + duplicateTasks, + parsingMode ); }); } @@ -141,11 +148,18 @@ const writeCodeForElement = ( /** * @description Receives an array of all elements and generates the .robot code for all RPA Tasks - * @param {Array} elements All the elements from the SSoT - * @param {Object} metaData MetaData of the robot + * @param {Array} elements All the elements from the ssot + * @param {Array} parameters Parameter objects of the robot + * @param {Array} attributes Attribute objects of the robot + * @param {String} parsingMode Indicates if the parser is used for the frontend or the local client * @returns {string} Generated .robot code for the tasks section */ -const generateCodeForRpaTasks = async (elements, parameters, attributes) => { +const generateCodeForRpaTasks = async ( + elements, + parameters, + attributes, + parsingMode +) => { const startElement = elements.find( (element) => element.predecessorIds.length === 0 ); @@ -157,14 +171,14 @@ const generateCodeForRpaTasks = async (elements, parameters, attributes) => { .filter((singleTask) => singleTask.count > 1) // eslint-disable-next-line no-underscore-dangle .map((singleDuplicateTask) => singleDuplicateTask._id); - const codeForRpaTasks = writeCodeForElement( startElement.id, elements, parameters, attributes, '', - listOfDuplicates + listOfDuplicates, + parsingMode ); return codeForRpaTasks; diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 4343b85b..4b384cc0 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -26,7 +26,8 @@ const parseSsotToRobotCode = async (ssot) => { result.parsedCode += await generateCodeForRpaTasks( ssot.elements, parameters, - result.attributeObjects + result.attributeObjects, + 'frontend' ); return result.parsedCode; }; @@ -44,7 +45,8 @@ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { result.parsedCode += await generateCodeForRpaTasks( ssot.elements, parameters, - result.attributeObjects + result.attributeObjects, + 'local client' ); return result.parsedCode; }; From a92d3a21d3177d4964239e09ce614e1287dd2747 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Sat, 29 May 2021 17:22:38 +0200 Subject: [PATCH 114/149] Insert Product Demo Videos to Readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 470130d9..2afd9b26 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,12 @@ To run a development preview of the app, navigate to the server directory and ru Now check http://localhost:3000/ to have a look at the app. To run the local client, follow the steps in the [Readme of the local client](https://github.com/bptlab/ark_automate_local#readme). +## Product Demo +Part 1: +https://user-images.githubusercontent.com/42138601/120075611-51877980-c0a2-11eb-9789-9e68daf4e1a3.mp4 + +Part2: +https://user-images.githubusercontent.com/42138601/120075616-59dfb480-c0a2-11eb-846b-f0635133bab4.mp4 ## Contribute From d29d99318f51b2c2b8b9aeb37f16f2df06ed0a05 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 10:59:30 +0200 Subject: [PATCH 115/149] final db changes --- .../subComponents/RobotLogEntryCard.jsx | 2 +- .../modelerSidebarFunctionality.js | 4 ++-- .../modelerSidebarFunctionality.test.js | 2 +- .../src/utils/sessionStorage/sessionStorageUtils.js | 2 +- server/api/controllers/ssotRetrievalController.js | 2 +- server/api/models/robotJobModel.js | 4 ++-- server/api/models/robotJobModel.test.js | 8 ++++---- server/socket/socketHelperFunctions.js | 6 +++--- .../utils/openApiDocumentation/openApiComponents.js | 12 ++++++------ server/utils/testing/testData.js | 4 ++-- wiki/Concept-Starting-and-Orchestrating-Bots.md | 2 +- 11 files changed, 24 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx index bc8e1f4d..59612303 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/subComponents/RobotLogEntryCard.jsx @@ -24,7 +24,7 @@ const RobotLogCard = (props) => { -

Task: {task.task_name}

+

Task: {task.taskName}

Status: {task.status}

diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index bac39103..a3b3e990 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -76,10 +76,10 @@ const getTasksForApplication = ( setterObject ) => { const allMatchingApplicationCombinations = taskApplicationCombinations.filter( - (singleCombination) => singleCombination.Application === application + (singleCombination) => singleCombination.application === application ); const allTasksForApplication = allMatchingApplicationCombinations.map( - (singleCombination) => singleCombination.Task + (singleCombination) => singleCombination.task ); setterObject.setTasksForSelectedApplication(allTasksForApplication); setterObject.setDisableTaskSelection(false); diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index 8ec01f63..d5f0d9f6 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -282,7 +282,7 @@ describe('Sidebar Functionality: Modeler Selection Change', () => { ); const taskApplicationCombinations = [ - { Application: 'cookbookApplication', Task: 'TestTask' }, + { application: 'cookbookApplication', task: 'TestTask' }, ]; sessionStorage.setItem( 'taskApplicationCombinations', diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index a37f066e..4cfd8d49 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -14,7 +14,7 @@ const initAvailableApplicationsSessionStorage = () => { sessionStorage.getItem('taskApplicationCombinations') ); const allApplications = taskAndApplicationCombinations.map( - (singleCombination) => singleCombination.Application + (singleCombination) => singleCombination.application ); const applicationsWithoutDuplicates = allApplications.filter( (singleApplication, index, self) => diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index 2e77644d..56a69ca7 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -400,7 +400,7 @@ exports.deleteRobot = async (req, res) => { .deleteMany({ robotId: usableRobotId }) .exec(); - await mongoose.model('job').deleteMany({ robot_id: usableRobotId }).exec(); + await mongoose.model('job').deleteMany({ robotId: usableRobotId }).exec(); res.send(response); } catch (err) { diff --git a/server/api/models/robotJobModel.js b/server/api/models/robotJobModel.js index 271bbbb2..5c54c970 100644 --- a/server/api/models/robotJobModel.js +++ b/server/api/models/robotJobModel.js @@ -22,11 +22,11 @@ const activityErrorSchema = new Schema({ }); const jobSchema = new Schema({ - user_id: { + userId: { type: mongoose.Types.ObjectId, required: [true, 'UserId required'], }, - robot_id: { + robotId: { type: mongoose.Types.ObjectId, required: [true, 'RobotId required'], }, diff --git a/server/api/models/robotJobModel.test.js b/server/api/models/robotJobModel.test.js index c30bd9d2..c6460682 100644 --- a/server/api/models/robotJobModel.test.js +++ b/server/api/models/robotJobModel.test.js @@ -39,15 +39,15 @@ describe('jobs have validation for missing parameters', () => { }); it('should be invalid if userId is empty', async () => { job.save((err) => { - expect(err.errors.user_id).to.exist; - expect(err.errors.user_id.message).equal('UserId required'); + expect(err.errors.userId).to.exist; + expect(err.errors.userId.message).equal('UserId required'); }); }); it('should be invalid if robotId is empty', async () => { job.save((err) => { - expect(err.errors.robot_id).to.exist; - expect(err.errors.robot_id.message).equal('RobotId required'); + expect(err.errors.robotId).to.exist; + expect(err.errors.robotId.message).equal('RobotId required'); }); }); diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index d865185a..6ce67f71 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -75,8 +75,8 @@ exports.getAllUserIds = async () => { */ exports.createJob = async (userId, robotId, status, parameters) => { const job = new jobsModel.Job({ - user_id: userId, - robot_id: robotId, + userId, + robotId, status, parameters, }); @@ -133,7 +133,7 @@ exports.updateRobotJobErrors = async (jobId, errorLog) => { */ exports.getAllWaitingJobsForUser = async (userId) => { const jobList = await jobsModel.Job.find( - { user_id: userId, status: 'waiting' }, + { userId, status: 'waiting' }, (err) => { if (err) { console.error(err); diff --git a/server/utils/openApiDocumentation/openApiComponents.js b/server/utils/openApiDocumentation/openApiComponents.js index 0376c74c..c37ab8a1 100644 --- a/server/utils/openApiDocumentation/openApiComponents.js +++ b/server/utils/openApiDocumentation/openApiComponents.js @@ -10,17 +10,17 @@ * type: object * required: * - _id - * - Application - * - Task - * - Code + * - application + * - task + * - code * properties: * _id: * $ref: '#/components/schemas/ObjectIds' - * Application: + * application: * $ref: '#/components/schemas/Applications' - * Task: + * task: * $ref: '#/components/schemas/Tasks' - * Code: + * code: * $ref: '#/components/schemas/Tasks' * ouputValue: * type: boolean diff --git a/server/utils/testing/testData.js b/server/utils/testing/testData.js index 9f9170b7..8419c4ad 100644 --- a/server/utils/testing/testData.js +++ b/server/utils/testing/testData.js @@ -156,8 +156,8 @@ const testRpaTask5 = { const testJob = { _id: testJobId, __v: 0, - user_id: testUserId, - robot_id: testRobotId, + userId: testUserId, + robotId: testRobotId, status: 'waiting', parameters: [ { diff --git a/wiki/Concept-Starting-and-Orchestrating-Bots.md b/wiki/Concept-Starting-and-Orchestrating-Bots.md index dade3ce6..14383131 100644 --- a/wiki/Concept-Starting-and-Orchestrating-Bots.md +++ b/wiki/Concept-Starting-and-Orchestrating-Bots.md @@ -80,7 +80,7 @@ To get started it is recommended reading [this](https://socket.io/docs/v4/index. Here we implemented a CLI that reads the userId the user enters, saves the userId and uses the userId as an authentication for the communication with the web app server. Once started, the desktop app connects with the server by using a socket connection. A socket connection is this bidirectional connection that exist between every client and server. Moreover we use the userId the user entered and ask the server if this socket connection can join the room userId (we have one room for every userId). Once the socket connection was added to the userId room we wait for robots to be executed. Because we are in the userId room we receive robot execution jobs of web frontends that are connected to the same room. **Database/Server:** -We implemented a jobs collection in MongoDB as well as a Mongoose jobs model. Every job has a robot_id, a user_id, a status (waiting/executing/success/failed) and an array of parameters that contains the arguments the user entered in the web frontend when starting the robot execution. +We implemented a jobs collection in MongoDB as well as a Mongoose jobs model. Every job has a robotId, a userId, a status (waiting/executing/success/failed) and an array of parameters that contains the arguments the user entered in the web frontend when starting the robot execution. **Server:** Sets up a server and socket instance, establishes socket connection with the web frontend and the desktop app, groups sockets by userIds (by using the room concept), reacts on robot execution commands and forwards this command to the desktop app and updates the jobs collection in MongoDB continiously. From 83b82fe7b73a0e3ef10974b441065f8c0afcf543 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 11:20:33 +0200 Subject: [PATCH 116/149] fixed frontend test --- .../modelerSidebarFunctionality.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js index d5f0d9f6..6c631f83 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.test.js @@ -396,7 +396,7 @@ describe('Sidebar Functionality: Application Change', () => { }; const taskApplicationCombinations = [ - { Application: 'cookbookApplication', Task: 'TestTask' }, + { application: 'cookbookApplication', task: 'TestTask' }, ]; sessionStorage.setItem( 'taskApplicationCombinations', From 73026b51f5c49bc1ae8a09c49a0e02a691608212 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 11:34:27 +0200 Subject: [PATCH 117/149] fixed logo --- .../resources/images => public/logo}/logoBlack.png | Bin .../resources/images => public/logo}/logoCta.png | Bin .../images => public/logo}/logoInverted.png | Bin .../resources/images => public/logo}/logoPrim.png | Bin .../HeaderNavbar/HeaderNavbar.jsx | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) rename frontend/{src/resources/images => public/logo}/logoBlack.png (100%) rename frontend/{src/resources/images => public/logo}/logoCta.png (100%) rename frontend/{src/resources/images => public/logo}/logoInverted.png (100%) rename frontend/{src/resources/images => public/logo}/logoPrim.png (100%) diff --git a/frontend/src/resources/images/logoBlack.png b/frontend/public/logo/logoBlack.png similarity index 100% rename from frontend/src/resources/images/logoBlack.png rename to frontend/public/logo/logoBlack.png diff --git a/frontend/src/resources/images/logoCta.png b/frontend/public/logo/logoCta.png similarity index 100% rename from frontend/src/resources/images/logoCta.png rename to frontend/public/logo/logoCta.png diff --git a/frontend/src/resources/images/logoInverted.png b/frontend/public/logo/logoInverted.png similarity index 100% rename from frontend/src/resources/images/logoInverted.png rename to frontend/public/logo/logoInverted.png diff --git a/frontend/src/resources/images/logoPrim.png b/frontend/public/logo/logoPrim.png similarity index 100% rename from frontend/src/resources/images/logoPrim.png rename to frontend/public/logo/logoPrim.png diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 8322be30..4ec51e9b 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -49,7 +49,7 @@ const HeaderNavbar = (props) => { ark_automate Icon From 69cdf9262cfb33c2d87c7e66aab0b37f82bba427 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 12:17:02 +0200 Subject: [PATCH 118/149] PR feedback, removed "the" in param descriptions --- frontend/src/api/routes/robots/robots.js | 4 +- frontend/src/api/routes/users/users.js | 4 +- .../modelerSidebarFunctionality.js | 4 +- .../pages/RobotOverview/RobotOverview.jsx | 4 +- .../notificationUtils.jsx | 8 ++-- .../robotCodeToSsotParsing.js | 20 +++++----- .../ssotToBpmnParsing/ssotToBpmnParsing.js | 38 +++++++++---------- .../functionalities.js | 2 +- .../localSsotController/attributes.js | 10 ++--- .../localSsotController/parameters.js | 34 ++++++++--------- .../localSsotController/ssot.js | 5 +-- .../sessionStorage/sessionStorageUtils.js | 4 +- .../rpaFrameworkCommandsController.js | 2 +- .../controllers/ssotParameterController.js | 4 +- .../api/controllers/ssotParsingController.js | 2 +- .../controllers/ssotRetrievalController.js | 12 +++--- server/api/controllers/ssotRpaAttributes.js | 4 +- server/socket/socketHelperFunctions.js | 31 ++++++++------- .../ssotToRobotParsing/generateCodeBase.js | 4 +- .../generateCodeForRpaTasks.js | 6 +-- .../ssotToRobotParsing/retrieveParameters.js | 10 ++--- .../ssotToRobotParsing/ssotToRobotParser.js | 12 +++--- 22 files changed, 114 insertions(+), 110 deletions(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index aa22cc65..b61f09d5 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -5,7 +5,7 @@ /** * @description Triggers parsing of the Ssot to .robot file - * @returns {String} returns .robot file code + * @returns {String} .robot file code */ const getParsedRobotFile = async (robotId) => fetch(`/robots/${robotId}/robotCode`); @@ -13,7 +13,7 @@ const getParsedRobotFile = async (robotId) => /** * @description Fetch the ssot correlating to the specified Id * @param {String} robotId - Id of the robot that will be retrieved - * @returns {Object} The found ssot + * @returns {Object} Found ssot */ const getSsot = async (robotId) => { const requestString = `/robots/${robotId}`; diff --git a/frontend/src/api/routes/users/users.js b/frontend/src/api/routes/users/users.js index e3123b42..1cb50023 100644 --- a/frontend/src/api/routes/users/users.js +++ b/frontend/src/api/routes/users/users.js @@ -16,8 +16,8 @@ const fetchSsotsForUser = async (userId) => { /** * @description Create a new robot with the specified name for the specified user - * @param {String} userId - The user for which the robot will be created - * @param {String} robotName - The Name of the new robot + * @param {String} userId - User for which the robot will be created + * @param {String} robotName - Name of the new robot * @returns {Object} Object containing robotId and robotName */ const createNewRobot = async (userId, robotName) => { diff --git a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js index 4b839aa8..efd0b667 100644 --- a/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js +++ b/frontend/src/components/pages/RobotModeler/ModelerSidebar/modelerSidebarFunctionality/modelerSidebarFunctionality.js @@ -26,7 +26,7 @@ import { parseBpmnToSsot } from '../../../../../utils/parser/bpmnToSsotParsing/b * @description Called when the the button is pressed to save to the cloud. * This function will retrieve the xml from the parser, parse that xml to a ssot and write the * resulting ssot into the sessionStorage. - * @param {Object} modeler The modeling object + * @param {Object} modeler Modeling object */ const onSaveToCloud = async (modeler) => { const xml = await modeler.saveXML({ format: true }); @@ -178,7 +178,7 @@ const modelerSelectionChangeHandler = ( /** * @description Updates the state of the component. Called when the name of the selected element got updated in the sidebar. * @param {Object} event Changed value in input field - * @param {Object} modeler The modeling object + * @param {Object} modeler Modeling object * @param {Object} elementState State of the selected element * @param {Object} setterObject Object containing the functions for setting the state in the React component */ diff --git a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx index 5d4d2d99..6b3c95e6 100644 --- a/frontend/src/components/pages/RobotOverview/RobotOverview.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotOverview.jsx @@ -35,7 +35,7 @@ const RobotOverview = () => { /** * @description Fetches Bots for the specified user and will trigger a rerender so that it will be displayed - * @param {String} userIdToFetch The userId for which the bots will be fetched + * @param {String} userIdToFetch userId for which the bots will be fetched */ const retrieveBotList = (userIdToFetch) => { fetchSsotsForUser(userIdToFetch) @@ -80,7 +80,7 @@ const RobotOverview = () => { /** * @description Updates the current user id in the session storage and sets the state variable userId to the new value - * @param {Integer} value The value of the number input field used for setting the user id + * @param {Integer} value Value of the number input field used for setting the user id */ const changeUserId = (value) => { sessionStorage.setItem('currentUserId', value); diff --git a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx index cd0183d3..f7ddaf5a 100644 --- a/frontend/src/utils/componentsFunctionality/notificationUtils.jsx +++ b/frontend/src/utils/componentsFunctionality/notificationUtils.jsx @@ -16,9 +16,9 @@ import corporateDesign from '../../layout/corporateDesign'; /** * @description Will first consider if a special icon is requested and otherwise return the corresponding icon for the notification type. * @param {String} type One from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box - * @param {String} icon The icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) + * @param {String} icon Icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) * @param {String} colorName Returns the css selector for the matching notification type - * @returns The icon component of the notification + * @returns Icon component of the notification */ // eslint-disable-next-line consistent-return const getIconForType = (type, icon, colorName) => { @@ -57,8 +57,8 @@ const getIconForType = (type, icon, colorName) => { /** * @description Throws a notification at the upper right edge of the screen, which disappears automatically * @param {String} type One from 'Success', 'Warning' or 'Alert' - defines type (and with it the color scheme) for the notification Box - * @param {String} message The message that is displayed in the notification - * @param {String} icon The icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) + * @param {String} message Message that is displayed in the notification + * @param {String} icon Icon that will be displayed in the notification. (Must be imported and handled in notificationUtils accordingly!) */ const customNotification = (type, message, icon) => { const colorName = `color${type}Notification`; diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 9d7fb5cd..1ae75d10 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -15,7 +15,7 @@ const { const FOURSPACE = ' '; /** - * @returns {number} "uniqueId" which is just an increment from the counter in the local storage + * @returns {Number} "uniqueId" which is just an increment from the counter in the local storage */ const getUniqueId = () => { const newId = JSON.parse(sessionStorage.getItem('idCounter')) + 1; @@ -154,7 +154,7 @@ const getRpaParameters = (currentLine, splitPlaceholder) => { * @description Deletes everything before the first occurence of '=' and then trims all emptyspace until the rpa task name to get the expected format * @param {String} currentLine Current line of RPAf code * @param {String} splitPlaceholder Placeholder to split the string - * @returns {String} The current line without the outputVariableName prefix + * @returns {String} Current line without the outputVariableName prefix */ const currentLineWithoutOutputValueName = (completeLine, splitPlaceholder) => { const indexOfEqualsSign = completeLine.indexOf('='); @@ -188,7 +188,7 @@ const numberOfOccurrencesOfTask = (allMatchingCombinations, rpaTask) => { * @description Returns the matching task object for the rpaTask or throws a notification * @param {String} rpaTask RpaTask from current robotCode line * @param {Array} allMatchingCombinations All combinations from database that match the rpaTask - * @returns {Object} The matching task object for the rpaTask or undefined if an error occurs + * @returns {Object} Matching task object for the rpaTask or undefined if an error occurs */ const returnMatchingCombination = (rpaTask, allMatchingCombinations) => { const numberOfOccurrences = numberOfOccurrencesOfTask( @@ -336,8 +336,8 @@ const buildEndMarker = (predecessor) => ({ /** * @description Builds the attributeObject for a single element * @param {Object} currentElement Current instruction element - * @param {Object} singleElementFromTasksSection The parsed Object from the RPAf Code - * @param {String} robotId The id of the current robot / ssot + * @param {Object} singleElementFromTasksSection Parsed Object from the RPAf Code + * @param {String} robotId Id of the current robot / ssot * @returns {Object} AttributeObject for a single attribute */ const buildSingleAttributeObject = ( @@ -358,8 +358,8 @@ const buildSingleAttributeObject = ( /** * @description Builds the parameterObject for a single element - * @param {Object} singleAtrributeObject The attribute Object of the current activity - * @param {Object} singleElementFromTasksSection The parsed Object from the RPAf Code + * @param {Object} singleAtrributeObject Attribute Object of the current activity + * @param {Object} singleElementFromTasksSection Parsed Object from the RPAf Code * @param {Array} taskAndApplicationCombinations All combinations of applications and tasks * @returns {Object} ParameterObject for a single attribute */ @@ -421,7 +421,7 @@ const buildSingleParameterObject = ( * @description Build the elementsArray of the ssot * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of Strings * @param {Array} declaredApplications All declared Aplications from ***settings*** section as Strings - * @param {String} robotId The id of the current robot / ssot + * @param {String} robotId Id of the current robot / ssot * @returns {Array} elementsArray with all needed properties */ const getElementsArray = ( @@ -520,8 +520,8 @@ const getStarterId = (elementsArray) => { /** * @description Retrieves the line number for a given selector - * @param {Array} robotCodeAsArray The complete robotCode w/o new lines as array - * @param {String} selector The selector for which the line number will be retrieved + * @param {Array} robotCodeAsArray Complete robotCode w/o new lines as array + * @param {String} selector Selector for which the line number will be retrieved * @returns {number} Line number where the selector occurs */ const getLineNumberForSelector = (robotCodeAsArray, selector) => { diff --git a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index 81c45e74..e8248342 100644 --- a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -11,7 +11,7 @@ const DEFAULT_STARTEVENT_POSITION = '200,330'; /** * @description Searches through the ssot and return the only element without a predecessor - * @param {Object} ssot The ssot that will be processed + * @param {Object} ssot Ssot that will be processed * @returns {Object} startElement from the ssot */ const findStartElement = (ssot) => @@ -21,8 +21,8 @@ const findStartElement = (ssot) => /** * @description Creates an order within the elements based on their positioning in the flow - * @param {Object} ssot The ssot that will be processed - * @returns {Array} The elements of the ssot in the correct order in which they appear in the flow + * @param {Object} ssot Ssot that will be processed + * @returns {Array} Elements of the ssot in the correct order in which they appear in the flow */ const buildCorrectOrder = (ssot) => { const startElement = findStartElement(ssot); @@ -40,9 +40,9 @@ const buildCorrectOrder = (ssot) => { /** * @description Workaround which takes in the created element and updates its id to the one saved in the ssot. * The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot therefore this workaround is needed. - * @param {*} modeling The modeling extension - * @param {Object} element The first element (start element) to process - * @returns {String} The now set id of the shape + * @param {*} modeling Modeling extension + * @param {Object} element First element (start element) to process + * @returns {String} Now set id of the shape */ const updateIdForElement = (modeling, cli, element, cliResult) => { const bpmnObject = cli.element(cliResult); @@ -55,11 +55,11 @@ const updateIdForElement = (modeling, cli, element, cliResult) => { /** * @description Creates the first element in the BPMN diagram as a start event - * @param {*} cli The modeling cli extension - * @param {*} modeling The modeling extension - * @param {Object} element The first element (start element) to process - * @param {String} previousElement The id of the previous element - * @returns {String} The id of the element created in the diagram + * @param {*} cli Modeling cli extension + * @param {*} modeling Modeling extension + * @param {Object} element First element (start element) to process + * @param {String} previousElement Id of the previous element + * @returns {String} Id of the element created in the diagram */ const drawElement = (cli, modeling, element, previousElement) => { let createdElement; @@ -90,7 +90,7 @@ const drawElement = (cli, modeling, element, previousElement) => { /** * @description Checks if the default start event is still present and will remove if so - * @param {*} cli The modeling cli extension + * @param {*} cli Modeling cli extension */ const removeDefaultStarter = (cli) => { if (cli.elements().includes(DEFAULT_STARTER)) @@ -99,10 +99,10 @@ const removeDefaultStarter = (cli) => { /** * @description Creates the first element in the BPMN diagram as a start event - * @param {*} cli The modeling cli extension - * @param {*} modeling The modeling extension - * @param {Object} element The first element (start element) to process - * @returns {String} The id of the element created in the diagram + * @param {*} cli Modeling cli extension + * @param {*} modeling Modeling extension + * @param {Object} element First element (start element) to process + * @returns {String} Id of the element created in the diagram */ const drawStartElement = (cli, modeling, element) => { removeDefaultStarter(cli); @@ -119,9 +119,9 @@ const drawStartElement = (cli, modeling, element) => { /** * @description Creates the BPMN XML from the provided ssot, as well as displaying the diagram on the modeling component - * @param {*} modeler The bpmn modeler - * @param {Object} ssot The ssot to parse - * @returns {String} The parsed XML BPMN diagram as a String + * @param {*} modeler Bpmn modeler + * @param {Object} ssot Ssot to parse + * @returns {String} Parsed XML BPMN diagram as a String */ const parseSsotToBpmn = (modeler, ssot) => { const sortedElements = buildCorrectOrder(ssot); diff --git a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js index efc46758..db6157ff 100644 --- a/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js +++ b/frontend/src/utils/sessionStorage/localFunctionalitiesController/functionalities.js @@ -9,7 +9,7 @@ const FUNCTIONALITIES_STORAGE_PATH = 'taskApplicationCombinations'; * @description Retrieves the rpa functionalities object for a specific rpa application and rpa task combination * @param {String} application Name of the rpa application * @param {String} task Name of the rpa task - * @returns {Object} The rpa functionalities object + * @returns {Object} Rpa functionalities object */ const getRpaFunctionalitiesObject = (application, task) => { const rpaFunctionalities = JSON.parse( diff --git a/frontend/src/utils/sessionStorage/localSsotController/attributes.js b/frontend/src/utils/sessionStorage/localSsotController/attributes.js index 72200e06..4182a67d 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/attributes.js +++ b/frontend/src/utils/sessionStorage/localSsotController/attributes.js @@ -16,7 +16,7 @@ const getAttributeStorage = () => /** * @description Retrieves the attribute object for an activiy from session storage * @param {String} activityId Id of the activity for which the attribute object will be retrieved - * @returns {Object} The attribute object for the selected activity or undefined if not available + * @returns {Object} Attribute object for the selected activity or undefined if not available */ const getAttributeObjectForActivity = (activityId) => { const localAttributeStorage = JSON.parse( @@ -30,7 +30,7 @@ const getAttributeObjectForActivity = (activityId) => { /** * @description Retrieves the selected rpa task for the selected activity from session storage * @param {String} activityId Id of the currently selected activity - * @returns {String} The selected rpa task for the selected activity from session storage or undefined if not available + * @returns {String} Selected rpa task for the selected activity from session storage or undefined if not available */ const getRpaTask = (activityId) => { const matchingEntry = getAttributeObjectForActivity(activityId); @@ -116,7 +116,7 @@ const setRpaApplication = (robotId, activityId, newApplication) => { /** * @description Retrieves the rpa application for the selected activity from the session storage * @param {String} activityId Id of the currently selected activity - * @returns {String} The selected rpa application for the selected activity or undefined + * @returns {String} Selected rpa application for the selected activity or undefined */ const getRpaApplication = (activityId) => { const matchingEntry = getAttributeObjectForActivity(activityId); @@ -130,8 +130,8 @@ const getRpaApplication = (activityId) => { /** * @description Cheks if there is more than one unused attribute object, if so delete it in the database * @param {Array} attributes List of all attributes saved in the session storage - * @param {Array} usedElementIds The activityIds that are still being used - * @param {String} robotId The Id of the robot + * @param {Array} usedElementIds ActivityIds that are still being used + * @param {String} robotId Id of the robot */ const deleteUnusedAttributesFromDB = (attributes, usedElementIds, robotId) => { const unusedAttributes = attributes.filter( diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index 3df880e1..60911451 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -11,10 +11,10 @@ const PARAMETER_STORAGE_PATH = 'parameterLocalStorage'; /** * @description Creates a parameter object in the parameter session storage * @param {Array} localParameterStorage An Array containing the current parameter objects - * @param {string} robotId The id of the selected robot - * @param {string} activityId The id of the selected activity - * @param {String} application The name of the rpa application the activity has selected - * @param {String} task The name of the rpa task the activity has selected + * @param {string} robotId Id of the selected robot + * @param {string} activityId Id of the selected activity + * @param {String} application Name of the rpa application the activity has selected + * @param {String} task Name of the rpa task the activity has selected * @returns {Object} Newly created parameter object */ const createParameterObject = ( @@ -71,7 +71,7 @@ const getParameterStorage = () => /** * @description Retrieves the parameter object for an activity from the session storage * @param {String} activityId Id of the activity for which to get the parameter object for - * @returns {Object} The parameter object for the activity + * @returns {Object} Parameter object for the activity */ const getParameterObjectForActivity = (activityId) => { const localParameterStorage = JSON.parse( @@ -84,8 +84,8 @@ const getParameterObjectForActivity = (activityId) => { /** * @description Checks if the parameter object is filled correctly - * @param {String} parameterObject The parameter object for which to check if it is filled correctly - * @param {String} rpaFunctionalitiesObject The rpa functionalities object (rpa-task) needed to check for correctness + * @param {String} parameterObject Parameter object for which to check if it is filled correctly + * @param {String} rpaFunctionalitiesObject Rpa functionalities object (rpa-task) needed to check for correctness * @returns {Boolean} Indicates if parameter object is filled correctly */ const checkIfParameterObjectCorrect = ( @@ -124,7 +124,7 @@ const checkIfParameterObjectCorrect = ( * If no parameter object and no attributes object exists for the activity it will return undefined. * @param {String} robotId Id of the robot/ssot for which the parameter object will be retrieved * @param {String} activityId Id of the activity for which the parameter object will be retrieved - * @returns {Object} The parameter object for the activity + * @returns {Object} Parameter object for the activity */ const getParameterObject = (robotId, activityId) => { let localParameterStorage = getParameterStorage(); @@ -165,8 +165,8 @@ const getParameterObject = (robotId, activityId) => { /** * @description Sets a single parameter value in the session storage * @param {String} activityId Id of the activity for which to change the parameter value for - * @param {Object} value The value object returned by the dropdown selection cotaining the new parameter value - * @param {String} parameterName The name of the parameter that will be changed + * @param {Object} value Value object returned by the dropdown selection cotaining the new parameter value + * @param {String} parameterName Name of the parameter that will be changed */ const setSingleParameter = (activityId, value, parameterName) => { const localParameterStorage = getParameterStorage(); @@ -203,7 +203,7 @@ const setSingleParameter = (activityId, value, parameterName) => { * @param {String} activityId Id of the activity for which to change a parameter property for * @param {String} parameterName Name of the parameter of which a property will be changed * @param {String} property Name of the property that will be changed - * @param {Object} value The value object returned by the dropdown selection + * @param {Object} value Value object returned by the dropdown selection * @returns {Object} Updated parameter object */ const setPropertyForParameter = ( @@ -239,9 +239,9 @@ const setPropertyForParameter = ( * @description Retrieves the parameter session storage and returns the current value of the property that will be checked * @param {string} robotId Id of the selected robot * @param {string} activityId Id of the selected activity - * @param {string} parameterName The name of the parameter for which to get an update on the status of a property - * @param {string} property The property of the parameters to get the current value of - * @returns {String} The value of the property of the parameter or undefined if the activity has no parameter objects + * @param {string} parameterName Name of the parameter for which to get an update on the status of a property + * @param {string} property Property of the parameters to get the current value of + * @returns {String} Value of the property of the parameter or undefined if the activity has no parameter objects */ const parameterPropertyStatus = ( robotId, @@ -265,7 +265,7 @@ const parameterPropertyStatus = ( /** * @description Sets the new value as the name of the output variable in the session storage * @param {String} activityId Id of the activity for which the value of the output variable will be changed - * @param {String} value The new value for the name of the output variable + * @param {String} value New value for the name of the output variable */ const setOutputValueName = (activityId, value) => { const localParameterStorage = getParameterStorage(); @@ -289,8 +289,8 @@ const setOutputValueName = (activityId, value) => { /** * @description If there is more than one unused parameter object, delete it in the database * @param {Array} parameters List of all parameters saved in the session storage - * @param {Array} usedElementIds The activityIds that are still being used - * @param {String} robotId The Id of the robot + * @param {Array} usedElementIds ActivityIds that are still being used + * @param {String} robotId Id of the robot */ const deleteUnusedParameterFromDB = (parameters, usedElementIds, robotId) => { const unusedParameters = parameters.filter( diff --git a/frontend/src/utils/sessionStorage/localSsotController/ssot.js b/frontend/src/utils/sessionStorage/localSsotController/ssot.js index 3db4e0f8..9dec1b60 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/ssot.js +++ b/frontend/src/utils/sessionStorage/localSsotController/ssot.js @@ -43,8 +43,8 @@ const getRobotName = () => /** * @description Writes the robotId and the robotName of the currently opened robot into the session storage - * @param {String} robotName The robotName ot the currently opened robot - * @param {String} robotId The robotId ot the currently opened robot + * @param {String} robotName RobotName ot the currently opened robot + * @param {String} robotId RobotId ot the currently opened robot */ const setRobotMetadata = (robotName, robotId) => { const robotMetadata = JSON.parse(sessionStorage.getItem(ROBOT_METADATA_PATH)); @@ -106,7 +106,6 @@ const initSsotSessionStorage = (robotId) => { getAvailableApplications() .then((response) => response.json()) .then((data) => { - console.log(data); sessionStorage.setItem('availableApplications', JSON.stringify(data)); }) .catch((error) => { diff --git a/frontend/src/utils/sessionStorage/sessionStorageUtils.js b/frontend/src/utils/sessionStorage/sessionStorageUtils.js index 59b94921..fad16683 100644 --- a/frontend/src/utils/sessionStorage/sessionStorageUtils.js +++ b/frontend/src/utils/sessionStorage/sessionStorageUtils.js @@ -5,8 +5,8 @@ /** * @description Checks if the passed item already exists in the session storage and initializes it with given value if not existing. - * @param {String} itemToCheckFor The selected item in the session storage that will be checked - * @param {String} valueToInitTo The value to initialize to if the item is not existing in session storage yet. + * @param {String} itemToCheckFor Selected item in the session storage that will be checked + * @param {String} valueToInitTo Value to initialize to if the item is not existing in session storage yet. */ const initSessionStorage = (itemToCheckFor, valueToInitTo) => { if (sessionStorage.getItem(itemToCheckFor) === null) diff --git a/server/api/controllers/rpaFrameworkCommandsController.js b/server/api/controllers/rpaFrameworkCommandsController.js index 0dab64dd..970be63d 100644 --- a/server/api/controllers/rpaFrameworkCommandsController.js +++ b/server/api/controllers/rpaFrameworkCommandsController.js @@ -36,7 +36,7 @@ exports.getAvailableApplications = async (req, res) => { * parameters: * - name: application * in: path - * description: The name of an application + * description: Name of an application * required: true * schema: * $ref: '#/components/schemas/Applications' diff --git a/server/api/controllers/ssotParameterController.js b/server/api/controllers/ssotParameterController.js index d4ed46cd..6653427a 100644 --- a/server/api/controllers/ssotParameterController.js +++ b/server/api/controllers/ssotParameterController.js @@ -68,7 +68,7 @@ exports.updateMany = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' @@ -106,7 +106,7 @@ exports.retrieveParametersForRobot = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' diff --git a/server/api/controllers/ssotParsingController.js b/server/api/controllers/ssotParsingController.js index 09ecae1f..da288156 100644 --- a/server/api/controllers/ssotParsingController.js +++ b/server/api/controllers/ssotParsingController.js @@ -6,7 +6,7 @@ const ssotToRobotparser = require('../../utils/ssotToRobotParsing/ssotToRobotPar * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' diff --git a/server/api/controllers/ssotRetrievalController.js b/server/api/controllers/ssotRetrievalController.js index f7c2870d..b0e4cdc7 100644 --- a/server/api/controllers/ssotRetrievalController.js +++ b/server/api/controllers/ssotRetrievalController.js @@ -10,7 +10,7 @@ const userAccessModels = require('../models/userAccessObjectModel.js'); * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' @@ -45,7 +45,7 @@ exports.getSingleSourceOfTruth = async (req, res) => { * parameters: * - name: userId * in: path - * description: The id of a user + * description: Id of a user * required: true * schema: * $ref: '#/components/schemas/ObjectIds' @@ -126,7 +126,7 @@ exports.getRobotList = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' @@ -220,7 +220,7 @@ exports.shareRobotWithUser = async (req, res) => { * parameters: * - name: userId * in: path - * description: The id of a user + * description: Id of a user * required: true * schema: * $ref: '#/components/schemas/ObjectIds' @@ -312,7 +312,7 @@ exports.createNewRobot = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' @@ -361,7 +361,7 @@ exports.overwriteRobot = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' diff --git a/server/api/controllers/ssotRpaAttributes.js b/server/api/controllers/ssotRpaAttributes.js index 43e94b27..2575c20b 100644 --- a/server/api/controllers/ssotRpaAttributes.js +++ b/server/api/controllers/ssotRpaAttributes.js @@ -66,7 +66,7 @@ exports.updateMany = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' @@ -102,7 +102,7 @@ exports.retrieveAttributesForRobot = async (req, res) => { * parameters: * - name: robotId * in: path - * description: The id of a robot + * description: Id of a robot * required: true * schema: * $ref: '#/components/schemas/RobotIds' diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 413bccb9..5516aa9f 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -6,12 +6,17 @@ const ssotModels = require('../api/models/singleSourceOfTruthModel.js'); const userAccessObject = require('../api/models/userAccessObjectModel.js'); const jobsModel = require('../api/models/robotJobModel.js'); +/** + * @category Server + * @module + */ + mongoose.set('useFindAndModify', false); /** * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code - * @param {String} robotId The id of the robot that the robot code will be fetched for - * @param {String} jobId The id of the current job + * @param {String} robotId Id of the robot that the robot code will be fetched for + * @param {String} jobId Id of the current job */ exports.getRobotCodeForJob = async (robotId, jobId) => { try { @@ -24,7 +29,7 @@ exports.getRobotCodeForJob = async (robotId, jobId) => { /** * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code - * @param {String} robotId The id of the robot that the robot code will be fetched for + * @param {String} robotId Id of the robot that the robot code will be fetched for */ exports.getRobotCode = async (robotId) => { try { @@ -37,7 +42,7 @@ exports.getRobotCode = async (robotId) => { /** * @description Finds a specific robot job and retrieves the parameter array - * @param {String} jobId The id of the robot for which all parameters will be retrieved + * @param {String} jobId Id of the robot for which all parameters will be retrieved */ exports.getRobotJobParameters = async (jobId) => { const robotJobParameters = await mongoose @@ -51,7 +56,7 @@ exports.getRobotJobParameters = async (jobId) => { /** * @description Fetches the ssot from the database and parses the ssot to robot code - * @param {String} robotId The id of the robot which will be parsed to robot code + * @param {String} robotId Id of the robot which will be parsed to robot code */ exports.getAllUserIds = async () => { try { @@ -68,9 +73,9 @@ exports.getAllUserIds = async () => { /** * @description Creates a Job in the database for a robot execution of a specific user - * @param {String} userId The id of the user that wants to execute a robot - * @param {String} robotId The id of the robot tha will be executed - * @param {String} status The current status of the job (either waiting, executing, successful or failed) + * @param {String} userId Id of the user that wants to execute a robot + * @param {String} robotId Id of the robot tha will be executed + * @param {String} status Current status of the job (either waiting, executing, successful or failed) * @param {Array} parameters Different parameters the user defined before executing the robot */ exports.createJob = async (userId, robotId, status, parameters) => { @@ -92,8 +97,8 @@ exports.createJob = async (userId, robotId, status, parameters) => { /** * @description Finds a specific job in the database and updates the status of the Job - * @param {String} jobId The id of the job that will be updated - * @param {String} status The current status of the job (either waiting, executing, success or failed) + * @param {String} jobId Id of the job that will be updated + * @param {String} status Current status of the job (either waiting, executing, success or failed) */ exports.updateRobotJobStatus = async (jobId, status) => { await jobsModel.Job.findByIdAndUpdate(jobId, { status }, (err) => { @@ -105,8 +110,8 @@ exports.updateRobotJobStatus = async (jobId, status) => { /** * @description Updates the given Job when the run has failed with the list of failing activities - * @param {String} jobId The id of the job that will be updated - * @param {Array} errorLog The list of logs of the robots activites + * @param {String} jobId Id of the job that will be updated + * @param {Array} errorLog List of logs of the robots activites */ exports.updateRobotJobErrors = async (jobId, errorLog) => { const errors = errorLog.robotRun.activities @@ -129,7 +134,7 @@ exports.updateRobotJobErrors = async (jobId, errorLog) => { /** * @description Finds all jobs with status waiting in the database for a specific user - * @param {String} userId The id of the user for which all waiting jobs will be retrieved + * @param {String} userId Id of the user for which all waiting jobs will be retrieved */ exports.getAllWaitingJobsForUser = async (userId) => { const jobList = await jobsModel.Job.find( diff --git a/server/utils/ssotToRobotParsing/generateCodeBase.js b/server/utils/ssotToRobotParsing/generateCodeBase.js index 1fb45acd..4fa704f5 100644 --- a/server/utils/ssotToRobotParsing/generateCodeBase.js +++ b/server/utils/ssotToRobotParsing/generateCodeBase.js @@ -51,7 +51,7 @@ const generateCodeForLibraryImports = (elements) => { /** * @description Retrieve the associated parameter objects for all activities in the ssot - * @param {Object} ssot The ssot for which the parameters will be retrieved + * @param {Object} ssot Ssot for which the parameters will be retrieved * @returns {Array} Array of attribute objects */ const retrieveAttributes = async (ssot) => { @@ -78,7 +78,7 @@ const retrieveAttributes = async (ssot) => { /** * @description Generates that basic code that every robot has - * @param {Object} ssot The ssot that will be handled + * @param {Object} ssot Ssot that will be handled * @returns {string} Basic code for the .robot file */ const generateCodeBase = async (ssot) => { diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index 360cdf60..f1217bc4 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -21,7 +21,7 @@ const isAnRpaInstruction = (currentElement) => /** * @description Creates a prefix to catch the output variable of an activity, if one is present - * @param {Object} paramObject The parameter object that will be checked and looped through + * @param {Object} paramObject Parameter object that will be checked and looped through * @returns {String} String specifying the output variables name */ const setOutputValue = (paramObject) => { @@ -35,7 +35,7 @@ const setOutputValue = (paramObject) => { /** * @description Appends all provided parameters to a string which can be used to generate the RPAf file - * @param {Object} parameterObject The parameter object that will be checked and looped through + * @param {Object} parameterObject Parameter object that will be checked and looped through * @returns {String} String specifying the input parameters with the needed spacing in between */ const appendRpaInputParameter = (parameterObject) => { @@ -81,7 +81,7 @@ const successorTasksExist = (currentElement) => * @param {Array} elements All the elements from the ssot * @param {Array} parameters All parameter objects of the robot * @param {Array} attributes All attribute objects of the robot - * @param {String} codeToAppend The current code that will be extended + * @param {String} codeToAppend Current code that will be extended * @returns {string} Generated .robot code for the tasks section */ const writeCodeForElement = ( diff --git a/server/utils/ssotToRobotParsing/retrieveParameters.js b/server/utils/ssotToRobotParsing/retrieveParameters.js index cb5f4a22..aac2e862 100644 --- a/server/utils/ssotToRobotParsing/retrieveParameters.js +++ b/server/utils/ssotToRobotParsing/retrieveParameters.js @@ -10,7 +10,7 @@ const jobsModel = require('../../api/models/robotJobModel.js'); /** * @description Will retrieve the associated parameter objects for all activities in the ssot - * @param {Object} ssot The ssot for which the parameters will be retrieved + * @param {Object} ssot Ssot for which the parameters will be retrieved * @returns {Array} Array of parameter objects */ const retrieveParameters = async (ssot) => { @@ -44,7 +44,7 @@ const retrieveParameters = async (ssot) => { /** * @description Updates Parameter Objects with new parameters - * @param {Array} parameterObjects The selection of parameter objects that will possibly be updated + * @param {Array} parameterObjects Selection of parameter objects that will possibly be updated * @param {Array} newParameters New parameters in the form {id, value} that will be used to update the parameter objects * @returns {Array} Array of updated parameter objects */ @@ -71,7 +71,7 @@ const updateParameterObjects = (parameterObjects, newParameters) => { /** * @description Retrieves all parameters for a specific job - * @param {String} jobId The id of the job + * @param {String} jobId Id of the job * @returns {Array} Array of parameter objects */ const getAllParametersForJob = async (jobId) => { @@ -83,8 +83,8 @@ const getAllParametersForJob = async (jobId) => { /** * @description Retrieves the associated parameter objects for all activities in the ssot - * @param {Object} ssot The ssot for which the parameters will be retrieved - * @param {String} jobId The job id identifiyng a job object from which the additional paramters will be fetched + * @param {Object} ssot Ssot for which the parameters will be retrieved + * @param {String} jobId Job id identifiyng a job object from which the additional paramters will be fetched * @returns {Array} Array of parameter objects */ const retrieveParametersFromSsotAndJob = async (ssot, jobId) => { diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 6ddb50ec..34832889 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -16,7 +16,7 @@ const { generateCodeForRpaTasks } = require('./generateCodeForRpaTasks'); /** * @description Parses the given SSoT to an executable .robot file - * @param {Object} ssot The SSoT + * @param {Object} ssot SSoT * @returns {string} Code that has to be put in .robot file */ const parseSsotToRobotCode = async (ssot) => { @@ -32,8 +32,8 @@ const parseSsotToRobotCode = async (ssot) => { /** * @description Parses the given SSoT and parameters of the robot job to an executable .robot file - * @param {Object} ssot The Ssot - * @param {Object} jobId The id of the job + * @param {Object} ssot Ssot + * @param {Object} jobId Id of the job * @returns {string} Code that has to be put in .robot file */ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { @@ -49,7 +49,7 @@ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { /** * @description Parses the Ssot provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which will be parsed + * @param {String} robotId Id of the ssot which will be parsed * @returns {string} Code that has to be put in .robot file */ const parseSsotById = async (robotId) => { @@ -59,8 +59,8 @@ const parseSsotById = async (robotId) => { /** * @description Parses the Ssot provided by its id to an executable .robot file - * @param {String} robotId The id of the ssot which will be parsed - * @param {String} jobId The id of the current robotJob that will be executed + * @param {String} robotId Id of the ssot which will be parsed + * @param {String} jobId Id of the current robotJob that will be executed * @returns {string} Code that has to be put in .robot file */ const parseCodeForJob = async (robotId, jobId) => { From 7d864794fd781dc8cd68b00c589155db5ca961d1 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 12:17:15 +0200 Subject: [PATCH 119/149] added directories to documentationConfig --- documentationConfig.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/documentationConfig.json b/documentationConfig.json index 54a8a502..d7a3f0e0 100644 --- a/documentationConfig.json +++ b/documentationConfig.json @@ -8,7 +8,12 @@ }, "plugins": ["node_modules/better-docs/category"], "source": { - "include": ["./../frontend/src", "./../server/utils/ssotToRobotParsing"], + "include": [ + "./../frontend/src", + "./../server/utils/ssotToRobotParsing", + "./../server/socket/socketHelperFunctions", + "./../server/utils/testing/testDatabaseHandler" + ], "exclude": ["./../frontend/node_modules", "./../server/node_modules"], "includePattern": ".+\\.js(doc|x)?$", "excludePattern": "(^|\\/|\\\\)_" From 3037346e9e977fcb38e86d6260d591000a198f19 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Sun, 30 May 2021 12:20:03 +0200 Subject: [PATCH 120/149] worklfow fix --- documentationConfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentationConfig.json b/documentationConfig.json index d7a3f0e0..68de330a 100644 --- a/documentationConfig.json +++ b/documentationConfig.json @@ -11,8 +11,8 @@ "include": [ "./../frontend/src", "./../server/utils/ssotToRobotParsing", - "./../server/socket/socketHelperFunctions", - "./../server/utils/testing/testDatabaseHandler" + "./../server/socket/socketHelperFunctions.js", + "./../server/utils/testing/testDatabaseHandler.js" ], "exclude": ["./../frontend/node_modules", "./../server/node_modules"], "includePattern": ".+\\.js(doc|x)?$", From 01979d24e486d98363b01e3b4f256d2d6751c9c8 Mon Sep 17 00:00:00 2001 From: Sandro Speh Date: Mon, 31 May 2021 09:19:34 +0200 Subject: [PATCH 121/149] reset workflow --- .github/workflows/publishDocumentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publishDocumentation.yml b/.github/workflows/publishDocumentation.yml index 4ae32157..d7752659 100644 --- a/.github/workflows/publishDocumentation.yml +++ b/.github/workflows/publishDocumentation.yml @@ -3,7 +3,7 @@ name: Publish Documentation to GitHub pages on: push: branches: - - 281_documentation + - main jobs: deploy: From c2a54f8c2e034d91f44886ec710270cb4f5fc8fd Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Mon, 31 May 2021 11:51:50 +0200 Subject: [PATCH 122/149] fix coding standards violations and missing documentation --- frontend/src/api/routes/robots/robots.js | 8 +-- frontend/src/api/routes/users/users.js | 8 +-- .../src/api/socketHandler/socketListeners.js | 2 +- frontend/src/components/App.jsx | 6 +-- .../HeaderNavbar/HeaderNavbar.jsx | 6 +-- frontend/src/components/pages/Home/Home.jsx | 2 +- .../RobotInteractionExecutionSection.jsx | 5 ++ .../robotInteractionCockpitFunctionality.js | 10 ++-- .../RobotContainer/RobotContainer.jsx | 4 +- .../bpmnToSsotParsing/bpmnToSsotParsing.js | 21 ++++---- .../bpmnToSsotParsing.test.js | 13 ++--- .../robotCodeToSsotParsing.js | 9 ++-- .../robotCodeToSsotParsing.test.js | 50 ++++++++++--------- .../ssotToBpmnParsing/ssotToBpmnParsing.js | 4 +- .../localSsotController/parameters.js | 1 - .../functionalities/functionalities.test.js | 5 -- server/api/routes/robots/robots.test.js | 8 --- .../rpaAttributes/rpaAttributes.test.js | 1 - .../rpaParameters/rpaParameters.test.js | 1 - server/api/routes/users/users.test.js | 4 -- server/server.js | 2 - server/socket/socketHelper.test.js | 2 - server/socket/socketHelperFunctions.js | 6 ++- .../ssotToRobotParsing/generateCodeBase.js | 1 - .../generateCodeForRpaTasks.js | 1 - .../ssotToRobotParsing/ssotToRobotParser.js | 10 ++-- server/utils/testing/testDatabaseHandler.js | 2 - 27 files changed, 85 insertions(+), 107 deletions(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index b61f09d5..afc44c09 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -4,7 +4,7 @@ */ /** - * @description Triggers parsing of the Ssot to .robot file + * @description Triggers parsing of the ssot to .robot file * @returns {String} .robot file code */ const getParsedRobotFile = async (robotId) => @@ -12,7 +12,7 @@ const getParsedRobotFile = async (robotId) => /** * @description Fetch the ssot correlating to the specified Id - * @param {String} robotId - Id of the robot that will be retrieved + * @param {String} robotId Id of the robot that will be retrieved * @returns {Object} Found ssot */ const getSsot = async (robotId) => { @@ -23,8 +23,8 @@ const getSsot = async (robotId) => { /** * @description Rename the robot in the ssot - * @param {String} robotId - RobotId of the robot that will be renamed - * @param {String} newRobotName - String with the new RobotName + * @param {String} robotId RobotId of the robot that will be renamed + * @param {String} newRobotName String with the new RobotName * @returns {Object} Object containing robotName and starterId */ const changeSsotName = async (robotId, newRobotName) => { diff --git a/frontend/src/api/routes/users/users.js b/frontend/src/api/routes/users/users.js index 1cb50023..14ec19c9 100644 --- a/frontend/src/api/routes/users/users.js +++ b/frontend/src/api/routes/users/users.js @@ -5,7 +5,7 @@ /** * @description Fetch all those ssot names and ids, which are available for the current user - * @param { String } userId - UserId for which the ssots will be fetched + * @param { String } userId UserId for which the ssots will be fetched * @returns {Array} Array of objects containing ssotId, robotName and starterId of each found robot */ const fetchSsotsForUser = async (userId) => { @@ -16,8 +16,8 @@ const fetchSsotsForUser = async (userId) => { /** * @description Create a new robot with the specified name for the specified user - * @param {String} userId - User for which the robot will be created - * @param {String} robotName - Name of the new robot + * @param {String} userId User for which the robot will be created + * @param {String} robotName Name of the new robot * @returns {Object} Object containing robotId and robotName */ const createNewRobot = async (userId, robotName) => { @@ -36,4 +36,4 @@ const createNewRobot = async (userId, robotName) => { return response; }; -export { fetchSsotsForUser, createNewRobot /* , shareRobotWithUser */ }; +export { fetchSsotsForUser, createNewRobot }; diff --git a/frontend/src/api/socketHandler/socketListeners.js b/frontend/src/api/socketHandler/socketListeners.js index a823972e..762506e8 100644 --- a/frontend/src/api/socketHandler/socketListeners.js +++ b/frontend/src/api/socketHandler/socketListeners.js @@ -37,7 +37,7 @@ const newRobotMonitorUpdate = (logSetterMethod) => { /** * @description Register listener on when a new robot status has been set - * @param {function} logSetterMethod Method reference to update the status of the log in the robotInteractionCockpit + * @param {function} statusSetterMethod Method reference to update the status of the log in the robotInteractionCockpit */ const newRobotStatusUpdate = (statusSetterMethod) => { socket.on('changedRobotStatus', (status) => statusSetterMethod(status)); diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index a93b22bc..3691d25d 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -18,10 +18,10 @@ const App = () => ( - - + + diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 5d84ed2a..645d52c1 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -9,7 +9,7 @@ const { Header } = Layout; /** * @component - * @description Renders the header navbar for all pages and initially selects the passed key-element. + * @description Renders the header navbar for all pages and initially selects the passed key element. * @category Frontend * @example return */ @@ -58,7 +58,7 @@ const HeaderNavbar = (props) => { Overview - + {!onRobotInteraction && ( <> @@ -71,7 +71,7 @@ const HeaderNavbar = (props) => { {!onOverview && ( Robot Code - + )} diff --git a/frontend/src/components/pages/Home/Home.jsx b/frontend/src/components/pages/Home/Home.jsx index f39e215d..282640ac 100644 --- a/frontend/src/components/pages/Home/Home.jsx +++ b/frontend/src/components/pages/Home/Home.jsx @@ -36,7 +36,7 @@ const Home = () => { fast, easy, automation

{message}

- + diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 18d7e108..69ad368e 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -20,6 +20,11 @@ const RobotInteractionExecutionSection = (props) => { const { executionLogs } = props; const { robotState } = props; + /** + * @description Displays the suitable status icon for robot execution + * @param {String} status Current Status of the robot execution + * @returns {Object} Returns an icon component or undefined + */ const displayStatusIcon = (status) => { if (status === 'PASS' || status === 'successful') { return ( diff --git a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js index 7159fb6b..6775dfe2 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js +++ b/frontend/src/components/pages/RobotInteractionCockpit/robotInteractionCockpitFunctionality/robotInteractionCockpitFunctionality.js @@ -9,8 +9,8 @@ import { getAllAttributes } from '../../../../api/routes/robots/rpaAttributes'; /** * @description Will return a boolean regarding the correct configuration of the given parameterObejcts belonging to a robot. * If a paramter is required and no value is passed and the value will not be specified later by the user, the paramter is not correctly configured. - * @param {Object[]} parameterObjects Array of parameterObjects that will be checked - * @returns {boolean} Boolean value regarding the correctness of the parameter configuration + * @param {Array} parameterObjects Array of parameterObjects that will be checked + * @returns {Boolean} Boolean value regarding the correctness of the parameter configuration */ const configuredRobotParamsCorrectly = (parameterObjects) => { let executability = true; @@ -36,8 +36,8 @@ const configuredRobotParamsCorrectly = (parameterObjects) => { /** * @description Will return a boolean regarding the correct configuration regarding the given attributeObjects of a robot. * If an attribute has no specified application or task, the attribute is not correctly configured. - * @param {Object[]} attributeObjects Array of attributeObjects that will be checked - * @returns {boolean} A boolean value regarding the correctness of the attribute configuration + * @param {Array} attributeObjects Array of attributeObjects that will be checked + * @returns {Boolean} A boolean value regarding the correctness of the attribute configuration */ const configuredRobotActivitesCorrectly = (attributeObjects) => { let executability = true; @@ -64,7 +64,7 @@ const configuredRobotActivitesCorrectly = (attributeObjects) => { * @description Will return a boolean regarding the correct configuration of a robot. * If a robot has incorrectly configured attributes or parameters, then the robot is not correctly configured. * @param {String} robotId RobotId of the robot that will be checked - * @returns {boolean} Boolean value regarding the executability of the robot + * @returns {Boolean} Boolean value regarding the executability of the robot */ const isRobotExecutable = async (robotId) => { const attributes = await getAllAttributes(robotId); diff --git a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx index 5436117f..41824b13 100644 --- a/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx +++ b/frontend/src/components/pages/RobotOverview/RobotContainer/RobotContainer.jsx @@ -84,7 +84,7 @@ const RobotContainer = (props) => { @@ -94,7 +94,7 @@ const RobotContainer = (props) => { - + diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js index 779c740f..75606da9 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.js @@ -1,27 +1,24 @@ /* eslint-disable no-param-reassign */ +import { parseString } from 'xmljs2'; import customNotification from '../../componentsFunctionality/notificationUtils'; import { getRobotId, getRobotName, } from '../../sessionStorage/localSsotController/ssot'; - -const { parseString } = require('xmljs2'); +import ssotBaseObjects from '../ssotBaseObjects'; /** * @category Frontend * @module */ -const ssotBaseObjects = require('../ssotBaseObjects'); - const ssotBaseElement = ssotBaseObjects.baseElement; /** * @description Creates a base element of the single source of truth - * @returns {object} Base element of the single source of truth + * @returns {Object} Base element of the single source of truth */ const createBaseElement = (id) => { - // creates deep copy of baseElement const baseElement = JSON.parse(JSON.stringify(ssotBaseElement)); baseElement.id = id; return baseElement; @@ -29,7 +26,7 @@ const createBaseElement = (id) => { /** * @description Checks if the given id can be found in the given Array of element objects - * @returns {boolean} Boolean if element is tracked in Array + * @returns {Boolean} Boolean if element is tracked in Array */ const isElementTracked = (elementsArray, id) => { if (elementsArray.find((element) => element.id === id)) { @@ -39,7 +36,7 @@ const isElementTracked = (elementsArray, id) => { }; /** - * + * @description Gets all bpmn elements * @param {Array} bpmnShapes All shapes of the BPMN diagram * @param {Array} localElementsArray Current version of the localElementsArray with all elements * @returns {Array} Array of elements with their id, successors, predecessors and name @@ -62,13 +59,14 @@ const returnElementsArrayWithNameLabel = (bpmnShapes, localElementsArray) => { /** * @description Creates the array full of elements by iterating over the * referenced ids in the flow and adding new elements (incl. name) if they have not been added yet + * @param {Array} flows All flow elements of the BPMN diagram + * @param {Array} bpmnShapes All shapes of the BPMN diagram * @returns {Array} Array of elements with their id, successors, predecessors and name */ const findElements = (flows, bpmnShapes) => { if (typeof flows === 'undefined') { return []; } - const localElementsArray = []; flows.forEach((flow) => { @@ -102,6 +100,8 @@ const findElements = (flows, bpmnShapes) => { /** * @description Enriches elements in the elementsArray that should be of type instruction + * @param {Array} elementsArray All elements of the BPMN diagram + * @param {Array} bpmnActivities All activities of the BPMN diagram * @returns {Array} Array of elements for single source of truth */ const enrichInstructionElements = (elementsArray, bpmnActivities) => { @@ -139,6 +139,7 @@ const enrichInstructionElements = (elementsArray, bpmnActivities) => { /** * @description Enriches elements in the elementsArray that should be of type marker + * @param {Array} elementsArray All elements of the BPMN diagram * @returns {Array} Array of elements for single source of truth */ const enrichMarkerElements = (elementsArray) => { @@ -182,6 +183,7 @@ const getStartEventId = (bpmnJson) => { /** * @description Parses an JSON created from the xml of the bpmn model to the single source of truth + * @param {Object} bpmnXml The xml object of the bpmn diagram * @returns {string} XML that has to be put in single source of truth file */ const parseBpmnToSsot = async (bpmnXml) => { @@ -192,7 +194,6 @@ const parseBpmnToSsot = async (bpmnXml) => { if (typeof startEventId === 'undefined') return undefined; - // Build basic ssot-frame const ssot = { _id: robotId, starterId: startEventId[0], diff --git a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js index 9a57be4e..1b0acd3d 100644 --- a/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js +++ b/frontend/src/utils/parser/bpmnToSsotParsing/bpmnToSsotParsing.test.js @@ -1,10 +1,6 @@ -const { - setRobotMetadata, -} = require('../../sessionStorage/localSsotController/ssot.js'); -const { - initSessionStorage, -} = require('../../sessionStorage/sessionStorageUtils.js'); -const parser = require('./bpmnToSsotParsing.js'); +import { setRobotMetadata } from '../../sessionStorage/localSsotController/ssot'; +import { initSessionStorage } from '../../sessionStorage/sessionStorageUtils'; +import { parseBpmnToSsot } from './bpmnToSsotParsing'; const BPMN_XML = { xml: 'Flow_0m7u6buFlow_0m7u6buFlow_08r9hfxFlow_08r9hfxFlow_1lycczuFlow_1lycczuFlow_19rmn01Flow_19rmn01', @@ -13,10 +9,9 @@ const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; describe('Parsing Tests', () => { it('successfully parses the bpmn to ssot', async () => { - // expect.assertions(1); initSessionStorage('robotMetadata', JSON.stringify({})); setRobotMetadata('AwesomeTestRobot', ROBOT_ID); - const Ssot = await parser.parseBpmnToSsot(BPMN_XML, ROBOT_ID); + const Ssot = await parseBpmnToSsot(BPMN_XML, ROBOT_ID); expect(Ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); expect(Ssot).toHaveProperty('starterId', 'Event_1wm4a0f'); diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 1ae75d10..8bfd7712 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -8,9 +8,7 @@ import { getRobotName, } from '../../sessionStorage/localSsotController/ssot'; -const { - default: customNotification, -} = require('../../componentsFunctionality/notificationUtils'); +import customNotification from '../../componentsFunctionality/notificationUtils'; const FOURSPACE = ' '; @@ -404,7 +402,6 @@ const buildSingleParameterObject = ( } else { singleParameterObject.value = singleParamArray[index]; } - return singleParameterObject; } ); @@ -419,8 +416,8 @@ const buildSingleParameterObject = ( /** * @description Build the elementsArray of the ssot - * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of Strings - * @param {Array} declaredApplications All declared Aplications from ***settings*** section as Strings + * @param {Array} robotCodeTaskSection Robot code w/o empty lines as an array of strings + * @param {Array} declaredApplications All declared applications from ***settings*** section as strings * @param {String} robotId Id of the current robot / ssot * @returns {Array} elementsArray with all needed properties */ diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js index b7ad5765..c412bbc9 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.test.js @@ -11,7 +11,14 @@ jest.mock('../../componentsFunctionality/notificationUtils'); import customNotification from '../../componentsFunctionality/notificationUtils'; -const parser = require('./robotCodeToSsotParsing'); +import { + parseRobotCodeToSsot, + getLineNumberForSelector, + getRobotCodeAsArray, + getApplicationArray, + getElementsArray, + getInstructionBlocksFromTaskSection, +} from './robotCodeToSsotParsing'; const ROBOT_ID = '54ab2d30eb3cc402041ac60f'; @@ -31,34 +38,29 @@ sessionStorage.setItem( ); const correctRobotCode = `${correctSettingsSection}\n\n${correctTaskSection}`; -const robotCodeAsArray = parser.getRobotCodeAsArray(correctRobotCode); -const settingsSectionAsArray = parser.getRobotCodeAsArray( - correctSettingsSection -); -const taskSectionAsArray = parser.getRobotCodeAsArray(correctTaskSection); -const declaredApplications = parser.getApplicationArray(settingsSectionAsArray); +const robotCodeAsArray = getRobotCodeAsArray(correctRobotCode); +const settingsSectionAsArray = getRobotCodeAsArray(correctSettingsSection); +const taskSectionAsArray = getRobotCodeAsArray(correctTaskSection); +const declaredApplications = getApplicationArray(settingsSectionAsArray); describe('RobotCode to SSOT Parsing Tests', () => { it('contains the correct robotMetadata', () => { sessionStorage.setItem('idCounter', '5416'); - const ssot = parser.parseRobotCodeToSsot(correctRobotCode); + const ssot = parseRobotCodeToSsot(correctRobotCode); expect(ssot).toHaveProperty('robotName', 'AwesomeTestRobot'); expect(ssot).toHaveProperty('_id', '12345678'); expect(ssot).toHaveProperty('starterId', 'Event_0ay5417'); }); it('finds the settings selector correctly', () => { - const settingsSectionAsArrayForTest = parser.getRobotCodeAsArray( + const settingsSectionAsArrayForTest = getRobotCodeAsArray( `RandomOffsetLine\n${correctSettingsSection}` ); expect( - parser.getLineNumberForSelector( - settingsSectionAsArray, - '*** Settings ***' - ) + getLineNumberForSelector(settingsSectionAsArray, '*** Settings ***') ).toBe(0); expect( - parser.getLineNumberForSelector( + getLineNumberForSelector( settingsSectionAsArrayForTest, '*** Settings ***' ) @@ -67,16 +69,16 @@ describe('RobotCode to SSOT Parsing Tests', () => { it("throws an error, if settings selector wasn't found", () => { const robotCodeWithOutSettingsSelector = robotCodeAsArray.slice(1); expect( - parser.getLineNumberForSelector( + getLineNumberForSelector( robotCodeWithOutSettingsSelector, '*** Settings ***' ) ).toBe(undefined); }); it('finds the tasks selector correctly', () => - expect( - parser.getLineNumberForSelector(robotCodeAsArray, '*** Tasks ***') - ).toEqual(3)); + expect(getLineNumberForSelector(robotCodeAsArray, '*** Tasks ***')).toEqual( + 3 + )); it('finds all applications', () => expect(['Testing', 'Excel.Application']).toEqual( @@ -85,7 +87,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { it('has a correct elementsArray', () => { sessionStorage.setItem('idCounter', '5416'); - const elementsArray = parser.getElementsArray( + const elementsArray = getElementsArray( taskSectionAsArray, declaredApplications, ROBOT_ID @@ -94,7 +96,7 @@ describe('RobotCode to SSOT Parsing Tests', () => { }); it('generates correct instruction blocks', () => { - const instructionBlocks = parser.getInstructionBlocksFromTaskSection( + const instructionBlocks = getInstructionBlocksFromTaskSection( taskSectionAsArray, taskAndApplicationCombinations ); @@ -112,7 +114,7 @@ describe('Error handling while parsing', () => { }); const robotCodeWithOutSettingsSelector = robotCodeAsArray.slice(1); - parser.getLineNumberForSelector( + getLineNumberForSelector( robotCodeWithOutSettingsSelector, '*** Settings ***' ); @@ -131,7 +133,7 @@ describe('Error handling while parsing', () => { const settingsSectionWithError = settingsSectionAsArray.map((singleLine) => singleLine.replace('Library', 'Lib') ); - parser.getApplicationArray(settingsSectionWithError); + getApplicationArray(settingsSectionWithError); }); it('handles "RPA."-Alias errors', async () => { @@ -147,7 +149,7 @@ describe('Error handling while parsing', () => { const settingsSectionWithError = settingsSectionAsArray.map((singleLine) => singleLine.replace('RPA.', 'Rpa.') ); - parser.getApplicationArray(settingsSectionWithError); + getApplicationArray(settingsSectionWithError); }); it('handles "RPA-Application is not defined" errors', async () => { @@ -163,6 +165,6 @@ describe('Error handling while parsing', () => { const settingsSectionWithError = settingsSectionAsArray.map((singleLine) => singleLine.replace('Excel.Application', 'Word.Application') ); - parser.getApplicationArray(settingsSectionWithError); + getApplicationArray(settingsSectionWithError); }); }); diff --git a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js index e8248342..42e8efe8 100644 --- a/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js +++ b/frontend/src/utils/parser/ssotToBpmnParsing/ssotToBpmnParsing.js @@ -41,7 +41,9 @@ const buildCorrectOrder = (ssot) => { * @description Workaround which takes in the created element and updates its id to the one saved in the ssot. * The bpmn js cli extension will just create elements, but not ensure their Id to match the one in the ssot therefore this workaround is needed. * @param {*} modeling Modeling extension + * @param {*} cli Modeling cli extension * @param {Object} element First element (start element) to process + * @param {*} cliResult Bpmn object * @returns {String} Now set id of the shape */ const updateIdForElement = (modeling, cli, element, cliResult) => { @@ -72,7 +74,7 @@ const drawElement = (cli, modeling, element, previousElement) => { ); break; case 'MARKER': - // currently this is can only be an end event; in the future ther eshould be another switch here + // currently this can only be an end event; in the future there should be another switch here createdElement = cli.append( previousElement, 'bpmn:EndEvent', diff --git a/frontend/src/utils/sessionStorage/localSsotController/parameters.js b/frontend/src/utils/sessionStorage/localSsotController/parameters.js index 60911451..b22c302c 100644 --- a/frontend/src/utils/sessionStorage/localSsotController/parameters.js +++ b/frontend/src/utils/sessionStorage/localSsotController/parameters.js @@ -158,7 +158,6 @@ const getParameterObject = (robotId, activityId) => { task ); } - return undefined; }; diff --git a/server/api/routes/functionalities/functionalities.test.js b/server/api/routes/functionalities/functionalities.test.js index e95134cf..16e691e9 100644 --- a/server/api/routes/functionalities/functionalities.test.js +++ b/server/api/routes/functionalities/functionalities.test.js @@ -10,11 +10,6 @@ const testData = require('../../../utils/testing/testData'); */ beforeAll(async () => dbHandler.connect()); -/** - * Clear all test data after every test. Not needed here because no test writes data - */ -// afterEach(async () => dbHandler.clearDatabase()); - /** * Remove and close the db and server. */ diff --git a/server/api/routes/robots/robots.test.js b/server/api/routes/robots/robots.test.js index 05b17d3c..794ff313 100644 --- a/server/api/routes/robots/robots.test.js +++ b/server/api/routes/robots/robots.test.js @@ -67,7 +67,6 @@ describe('PATCH /robots/{robotId}/robotName', () => { JSON.stringify('newTestRobot') ); - // verify if really in DB const ssot = await mongoose.model('SSoT').findById(testRobotId).exec(); expect(JSON.stringify(ssot.robotName)).toEqual( JSON.stringify('newTestRobot') @@ -128,7 +127,6 @@ describe('PUT /robots/{robotId}', () => { const data = await response._getData(); expect(data.elements.length).toBe(1); - // verify if really in DB const newSsot = await mongoose.model('SSoT').findById(testRobotId).exec(); expect(JSON.stringify(data)).toEqual(JSON.stringify(newSsot)); }); @@ -150,7 +148,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const usableTestRobotId = mongoose.Types.ObjectId(testRobotId); const foundSsots = await mongoose.model('SSoT').find().exec(); expect(foundSsots.length).toBe(0); @@ -185,7 +182,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const foundUserAccessObjects = await mongoose .model('userAccessObject') .find() @@ -224,7 +220,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const foundAttributes = await mongoose.model('rpaAttributes').find().exec(); expect(foundAttributes.length).toBe(0); expect(foundAttributes.length).not.toBe(loadedAttributes.length); @@ -249,7 +244,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const foundParameters = await mongoose.model('parameter').find().exec(); expect(foundParameters.length).toBe(0); expect(foundParameters.length).not.toBe(loadedParameters.length); @@ -274,7 +268,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const foundJobs = await mongoose.model('job').find().exec(); expect(foundJobs.length).toBe(0); expect(foundJobs.length).not.toBe(loadedJobs.length); @@ -300,7 +293,6 @@ describe('DELETE /robots/{robotId}', () => { await ssotRetrievalController.deleteRobot(request, response); expect(response.statusCode).toBe(200); - // verify if really deleted const usableTestRobotId = mongoose.Types.ObjectId(testRobotId); const foundSsotById = await mongoose .model('SSoT') diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js index 29520b0d..0984d065 100644 --- a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js @@ -54,7 +54,6 @@ describe('PUT /robots/rpaattributes', () => { const data = await response._getData(); expect(data.modifiedCount).toBe(1); - // verify if really in DB const newAttributesObject = await mongoose .model('rpaAttributes') .findOne({ diff --git a/server/api/routes/robots/rpaParameters/rpaParameters.test.js b/server/api/routes/robots/rpaParameters/rpaParameters.test.js index 84703df4..2fbb7229 100644 --- a/server/api/routes/robots/rpaParameters/rpaParameters.test.js +++ b/server/api/routes/robots/rpaParameters/rpaParameters.test.js @@ -50,7 +50,6 @@ describe('PUT /robots/parameters', () => { const data = await response._getData(); expect(data.modifiedCount).toBe(1); - // verify if really in DB const newParamObject = await mongoose .model('parameter') .findOne({ diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index f11df99d..e2e033d7 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -43,8 +43,6 @@ describe('GET /users/{userId}/robots', () => { await ssotRetrievalController.getRobotList(request, response); const data = await response._getData(); expect(response.statusCode).toBe(200); - // Catches error "Received: serializes to the same string" - // Solution found here https://github.com/facebook/jest/issues/8475#issuecomment-537830532 expect(JSON.stringify(data[0]._id)).toEqual(JSON.stringify(testRobotId)); }); }); @@ -67,7 +65,6 @@ describe('POST /users/robotAccess', () => { expect(JSON.stringify(data.userId)).toEqual(JSON.stringify(testUserId)); expect(JSON.stringify(data.robotId)).toEqual(JSON.stringify(testRobotId)); - // verify if really in DB const userAccessObject = await mongoose .model('userAccessObject') .find({ @@ -101,7 +98,6 @@ describe('POST /users/{userId}/robots', () => { const data = await response._getData(); const newRobotId = data._id; - // verify if really in DB const request2 = httpMocks.createRequest({ params: { userId: testUserId, diff --git a/server/server.js b/server/server.js index 4397c329..e4511677 100644 --- a/server/server.js +++ b/server/server.js @@ -34,7 +34,6 @@ if (!isDev && cluster.isMaster) { } else { const app = express(); - // Setup socket.io connection const { createServer } = http; const { Server } = socketio; const httpServer = createServer(app); @@ -58,7 +57,6 @@ if (!isDev && cluster.isMaster) { useUnifiedTopology: true, }); - // Priority serve any static files. app.use(express.static(path.resolve(__dirname, 'build'))); app.use(express.json()); diff --git a/server/socket/socketHelper.test.js b/server/socket/socketHelper.test.js index a1857d2a..f7fabfea 100644 --- a/server/socket/socketHelper.test.js +++ b/server/socket/socketHelper.test.js @@ -73,7 +73,6 @@ describe('job creation', () => { expect(jobId).not.toBeUndefined(); expect(jobId).not.toBeNull(); - // verify if really in DB const foundJob = await mongoose.model('job').findById(jobId); expect(JSON.stringify(foundJob.id)).toEqual(JSON.stringify(jobId)); }); @@ -88,7 +87,6 @@ describe('updating of job', () => { 'updatedStatus' ); - // verify if really in DB const foundJob = await mongoose.model('job').findById(testData.testJob._id); expect(foundJob).not.toBeNull(); expect(foundJob).not.toBeUndefined(); diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index 5516aa9f..e5bc4854 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -17,6 +17,7 @@ mongoose.set('useFindAndModify', false); * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code * @param {String} robotId Id of the robot that the robot code will be fetched for * @param {String} jobId Id of the current job + * @returns {String} Code of the robot */ exports.getRobotCodeForJob = async (robotId, jobId) => { try { @@ -30,6 +31,7 @@ exports.getRobotCodeForJob = async (robotId, jobId) => { /** * @description Fetches the ssot of a given robot from the database and parses the ssot to robot code * @param {String} robotId Id of the robot that the robot code will be fetched for + * @returns {String} Code of the robot */ exports.getRobotCode = async (robotId) => { try { @@ -43,6 +45,7 @@ exports.getRobotCode = async (robotId) => { /** * @description Finds a specific robot job and retrieves the parameter array * @param {String} jobId Id of the robot for which all parameters will be retrieved + * @returns {Array} All parameter objects of the robot */ exports.getRobotJobParameters = async (jobId) => { const robotJobParameters = await mongoose @@ -56,7 +59,7 @@ exports.getRobotJobParameters = async (jobId) => { /** * @description Fetches the ssot from the database and parses the ssot to robot code - * @param {String} robotId Id of the robot which will be parsed to robot code + * @returns {Array} All user ids */ exports.getAllUserIds = async () => { try { @@ -77,6 +80,7 @@ exports.getAllUserIds = async () => { * @param {String} robotId Id of the robot tha will be executed * @param {String} status Current status of the job (either waiting, executing, successful or failed) * @param {Array} parameters Different parameters the user defined before executing the robot + * @returns {String} ObjectId of the new job object */ exports.createJob = async (userId, robotId, status, parameters) => { const job = new jobsModel.Job({ diff --git a/server/utils/ssotToRobotParsing/generateCodeBase.js b/server/utils/ssotToRobotParsing/generateCodeBase.js index 4fa704f5..cebc1750 100644 --- a/server/utils/ssotToRobotParsing/generateCodeBase.js +++ b/server/utils/ssotToRobotParsing/generateCodeBase.js @@ -86,7 +86,6 @@ const generateCodeBase = async (ssot) => { parsedCode += `*** Settings ***${LINEBREAK}`; const attributeObjects = await retrieveAttributes(ssot); parsedCode += generateCodeForLibraryImports(attributeObjects); - // ideally we use the keyword statement for each task, currently not working out of the box parsedCode += `${LINEBREAK}*** Tasks ***${LINEBREAK}`; return { parsedCode, attributeObjects }; }; diff --git a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js index f1217bc4..d0208a83 100644 --- a/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js +++ b/server/utils/ssotToRobotParsing/generateCodeForRpaTasks.js @@ -122,7 +122,6 @@ const writeCodeForElement = ( } if (successorTasksExist(currentElement)) { - // Xor handling is needed here in the future currentElement.successorIds.forEach((successorId) => { combinedCode = writeCodeForElement( successorId, diff --git a/server/utils/ssotToRobotParsing/ssotToRobotParser.js b/server/utils/ssotToRobotParsing/ssotToRobotParser.js index 34832889..305b2ea6 100644 --- a/server/utils/ssotToRobotParsing/ssotToRobotParser.js +++ b/server/utils/ssotToRobotParsing/ssotToRobotParser.js @@ -16,7 +16,7 @@ const { generateCodeForRpaTasks } = require('./generateCodeForRpaTasks'); /** * @description Parses the given SSoT to an executable .robot file - * @param {Object} ssot SSoT + * @param {Object} ssot Ssot of the robot * @returns {string} Code that has to be put in .robot file */ const parseSsotToRobotCode = async (ssot) => { @@ -31,8 +31,8 @@ const parseSsotToRobotCode = async (ssot) => { }; /** - * @description Parses the given SSoT and parameters of the robot job to an executable .robot file - * @param {Object} ssot Ssot + * @description Parses the given ssot and parameters of the robot job to an executable .robot file + * @param {Object} ssot Ssot of the robot * @param {Object} jobId Id of the job * @returns {string} Code that has to be put in .robot file */ @@ -48,7 +48,7 @@ const parseSsotAndJobToRobotCode = async (ssot, jobId) => { }; /** - * @description Parses the Ssot provided by its id to an executable .robot file + * @description Parses the ssot provided by its id to an executable .robot file * @param {String} robotId Id of the ssot which will be parsed * @returns {string} Code that has to be put in .robot file */ @@ -58,7 +58,7 @@ const parseSsotById = async (robotId) => { }; /** - * @description Parses the Ssot provided by its id to an executable .robot file + * @description Parses the ssot provided by its id to an executable .robot file * @param {String} robotId Id of the ssot which will be parsed * @param {String} jobId Id of the current robotJob that will be executed * @returns {string} Code that has to be put in .robot file diff --git a/server/utils/testing/testDatabaseHandler.js b/server/utils/testing/testDatabaseHandler.js index f05e380d..1d89debc 100644 --- a/server/utils/testing/testDatabaseHandler.js +++ b/server/utils/testing/testDatabaseHandler.js @@ -41,8 +41,6 @@ exports.closeDatabase = async () => { */ exports.clearDatabase = async () => { const { collections } = mongoose.connection; - - // fix according to https://docs.w3cub.com/eslint/rules/no-await-in-loop.html const result = []; Object.keys(collections).forEach((key) => { const collection = collections[key]; From f339b50a8e86baf46b7fe9c255f24e0131dc5ced Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 13:18:39 +0200 Subject: [PATCH 123/149] Delete How-To-Style-Using-CSS.md --- wiki/How-To-Style-Using-CSS.md | 415 --------------------------------- 1 file changed, 415 deletions(-) delete mode 100644 wiki/How-To-Style-Using-CSS.md diff --git a/wiki/How-To-Style-Using-CSS.md b/wiki/How-To-Style-Using-CSS.md deleted file mode 100644 index 274ef95c..00000000 --- a/wiki/How-To-Style-Using-CSS.md +++ /dev/null @@ -1,415 +0,0 @@ -# How to style components using CSS - -## CSS general info - -- CSS = Cascading Style Sheets -- Only purpose is to style and animate markup language (HTML) -- Because we are rendering our React app in `HTML`, we can therefore also style all components of the app - -## Getting started with CSS - -
How to use CSS -

- -**1. Use Inline CSS** -Just add `style` as another Attribute in the `HTML`-Tag. Add multiple styles with a semicolon. - -```html - -``` - -**2. Use Internal CSS** -In the tag open a \ tag. There you can specifiy the html component affected and the styling that should be applied to it. For example: - -```html - - - -``` - -**3. Use External CSS** -Create a `styles.css` file and copy everything from your internal style tag to there. Then reference the file in the head of the HTML using the link tag. Then everywhere where you reference the style.css file, the styles will be applied. -`` - -Remember: Every HTML tag has already a default style, that may hide your additional styling. See here for more https://www.w3schools.com/cssref/css_default_values.asp - -### How to debug CSS - -Use the dev tools of your browser and check out the Style tab regarding your selected object. -![](https://i.imgur.com/OkpU7fx.png) - -

- -
Anatomy of CSS Syntax -

- -```html -selector { property: value; } // Example h1 { color: red; } -``` - -**Selector:** Who do you want to change? -**Property:** What do you want to change? -**Value:** How do you want it to be changed? - -### About CSS Selectors - -**Which properties can I change?** -Check out https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#index - -#### Selector: CSS Classes - -You can add `class` attributes to HTML tags which you can then select in your CSS and style. To target a class in your CSS file you need to put a `.` in front of your class identifier. You can state multiple classes inside the class HTML tag. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -.title { - color: red; -} -``` - -#### Selector: HTML IDs. - -You can add `id` attributes to HTML tags which you can then select in your CSS and style. To target a class you need to put a `#` in front of your class. You can only have a single instance of your id on your page (classes for multiple times). An HTML can have only one id. -**Html** - -```html -

Helloo

-``` - -**CSS** - -``` -#MyTitle { - color: red; -} -``` - -#### Selector: Pseudo classes - -Some CSS selectors have `:` written in front of them. These styles are applied, when the affected HTML element is in a certain state, f.e. the mouse hovers above it. See for example [:hover](https://developer.mozilla.org/en-US/docs/Web/CSS/:hover) - -```HTML -h1:hover{ - color= blue; -} -``` - -#### CSS Rule priority - -Id > class > Inline CSS tags > Internal CSS tags > External CSS tags > Predefined CSS values - -

- -
Best practices -

- -- Write CSS Rules like this, starting the properties in a new line - -```html -h1 { color: red; font-size : 200px; } -``` - -- Alphabetically sort the selectors -- Use rem as font size unit -

- -## Using CSS in React - -
Styling Options -

- -### Inline Styling - -To style an element with the inline style attribute, the value must be a JavaScript object. Properties with two names, like `background-color`, must be written with camel case syntax. - -```jsx -class MyHeader extends React.Component { - render() { - return ( -

-

Hello Style!

-

Add a little style!

-
- ); - } -} -``` - -> Inline CSS should only be used when 1-2 styles are given to a component, which is not needed in any other context (e.g.) in another component. In this case, the styles do not have to be swapped out separately. - -### Using external stylesheets - -Write your CSS styling in a separate .css file and import it. -**./App.jsx** - -```jsx -import React from 'react'; -import ReactDOM from 'react-dom'; -import './App.css'; - -class MyHeader extends React.Component { - render() { -
- -## How to use AntD? - -
Basics about AntD -

- -To **use AntD**, it must be installed in the frontend directory. This is done automatically in our project via `package.json`. In each class where you want to use AntD, they must be imported individually. Nothing has to be changed in the possibly referenced CSS files. - -Basically every HTML-Component is wrapped by an AntD-Component. You can identify AntD components by the fact that they are always capitalized compared to HTML components. `` vs. `` - -Therefore, whenever we add new frontend components, we use AntD components. So (except for divs and other standard HTML tags) we should no longer use lowercase HTML tags in our code. - -```jsx -import React from 'react'; -import { Button } from 'antd'; - -const TestButton = () => ( - <> - - -); - -export default TestButton; -``` - -

- -
AntD-Components -

- -**Frequently used Components** - -- for button see: [Button](https://ant.design/components/button/) -- for normal text & headings see: [Typography](https://ant.design/components/typography/) -- for input fields see: [Input](https://ant.design/components/input/) - -**About AntD Layout & Grid** -**AntD Layout** gives us the possibility to set a layout for the page. A layout describes the arrangement of different blocks like header, footer, menu, and content with various presets. We have used such a layout for all our pages that already appear in the final design with the navigation bar. -For design inspiration, we recommend taking a look at the [layout documentation](https://ant.design/components/layout/). - -**AntD Grid** - -- As known from HTML, a page is created by lining up elements in rows. In these lines, columns can be used to divide the page horizontally. -- Your content elements should be placed directly in the col, and the only col should be placed directly in a row. -- The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by ``. -- If the sum of col spans in a row is more than 24, then the overflowing col as a whole will start a new line arrangement. -- You can align Elements in the Grid horizontally and vertically and add Gutter (kind of margin between the boxes) which should always be preferred to the traditional alignment using CSS! - -```jsx -import { Row, Col } from 'antd'; - -ReactDOM.render( - <> - - col1 - col2 - - - col1 - col2 - col3 - - , - mountNode -); -``` - -> This will return two rows. The first row contains two columns, the second row contains three columns. -> -> **AntD Space** -> If you arrange several elements together in a container, you should use `space` between the elements. Space is also an AntD component that includes all the components that should be aligned with each other with horizontal and vertical spacing. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons, horizontally aligned with space between the buttons. -> -> By default `space` adds a distance in the horizontal and in the vertical. This can be specified with the `direction="vertical"` or `direction="horizontal"` attribute. - -The size of the distance between the components can be changed with the size attribute (`size="small", size = "medium", size="large"`). It is also possible to specify the size of the space numerically. However, this is not recommended. - -```jsx -import { Button, Space } from 'antd'; - -function SpaceDemo() { - return ( - - - - - ); -} - -ReactDOM.render(, mountNode); -``` - -> This will return two Buttons that have small spaces exclusively in the horizontal. Vertically, they have no spacing at all. - -**Link to the Documentation**. -For an Overview of all AntD-Components especially the huge amount of input and display components see the [Components-Documentation](https://ant.design/components/overview/) with many code-examples. - -

- -# How to apply CSS in this Project - -## Use of styles via CSS - -In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: - -- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. -- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. - -### Basic rules for styling: - -
See the rules -

- -- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. -- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style -- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose -- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component - -

- -### CSS vs. CSS modules - -
When to use what? -

- -In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. -For example when you define the following style... - -```css -.button { - background-color: red; -} -``` - -... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. - -If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: - -```jsx -import styles from './Example.module.css'; -``` - -Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: - -```css -.button { - background-color: green; -} -``` - -In the file we would include the style in the following way: - -```jsx - -``` - -

- -### Conventions - -
We agreed on -

- -- naming: - For the naming of classes and ids please use **hyphens** consistently. - For example, don't call the class `buttonBackground` and instead call it `button-background`. -- sizing: - Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) - -

- ---- - -## Homework (take approx. 1h) - -1. If you are not familiar with CSS watch [this video](https://www.youtube.com/watch?v=0afZj1G0BIE). (for beginners) -2. Click through [this tutorial](https://de.learnlayout.com) -3. For fun with the CSS Grid first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout) and then play [this](https://cssgridgarden.com/#de) -4. For fun with the CSS flexbox first read [this](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and then play [this](http://flexboxfroggy.com/) - -## Further Reading. - -For more games to learn CSS checkout https://codepip.com/games/ -Take a look at this website https://css-tricks.com/ -For the style guide issue https://24ways.org/2011/front-end-style-guides From e3a2cfd7bac9464e20004505f5b8180c945d7ad7 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 13:22:22 +0200 Subject: [PATCH 124/149] Create Testing-Conventions.md --- wiki/Testing-Conventions.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 wiki/Testing-Conventions.md diff --git a/wiki/Testing-Conventions.md b/wiki/Testing-Conventions.md new file mode 100644 index 00000000..14c7806e --- /dev/null +++ b/wiki/Testing-Conventions.md @@ -0,0 +1,24 @@ +# Testing Conventions + +## What to test? + +### Do + +- Utility methods +- Complex implementations (eg: algorithms) +- Anything that has edge cases (excl. frontend-interaction) +- Core business logic +- High-risk Services +- Common user interactions +- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) +- Interactions between units that were stubbed in the unit tests + +### Don't + +- JavaScript and NodeJS core functions +- Third-party libraries +- External applications +- API calls. Stub them unless you’re doing E2E testing +- Database operations, unless you’re doing E2E testing +- Trivial methods not involving logic (simple getters and setters) +- Code that is throw-away or placeholder code From 7e3cb4ea5743c9f1a5d39d203d3ac97b12fdab7c Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 13:23:18 +0200 Subject: [PATCH 125/149] Delete How-To-Write-Tests.md --- wiki/How-To-Write-Tests.md | 136 ------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 wiki/How-To-Write-Tests.md diff --git a/wiki/How-To-Write-Tests.md b/wiki/How-To-Write-Tests.md deleted file mode 100644 index 1676e30b..00000000 --- a/wiki/How-To-Write-Tests.md +++ /dev/null @@ -1,136 +0,0 @@ -# Testing - -## Topics - -- Why automatically test? -- Tools -- What to test? -- How to write a test? -- How to execute a test? -- Best practices -- Your next Steps -- Places to continue research - ---- - -### Why automatically test? - -**The purpose of testing is to give you confidence that the app is working correctly.** - -- Helps to catch bugs earlier - - You might unknowingly break an app whenever you change a line of code. -- Test your changes faster - - Manually testing your app after each change is cumbersome. - - Refactoring is easier -- Tests help document - - for example edge cases -- Improves the architecture - - Enforces code splitting and single responsibilities - -### Tools - -![The tools used often](https://i.imgur.com/sxEsfOJ.png) -There are 2 main competitors for testing utilities: Enzyme and React Testing Library (RTL). Through other research, we found out that Enzyme is not liked and will be replaced by RTL (react testing library). Pro for Enzyme: it can shallow render. React core team members have expressed their preference for RTL as it's more future proof. Enzyme seems to be faster and with less overhead. - -> React Testing Library approaches testing from a user perspective. Thus it naturally leads to writing integration tests where multiple components are tested together. -> As an example, imagine a button. With React Testing Library you typically wouldn't test if the onClick prop is called when the button is clicked. You would rather test if a specific button triggers a certain effect. Like a delete button opening a confirmation modal. -> With Enzyme in contrast you would test implementation details like the click handler being called or a state variable being updated correctly. This leads to very detailed tests that break easily when you change something unrelated to the overall functionality (e.g. renaming the click handler or state variable). - -#### Jest - -- Unit testing -- Snapshot testing - - Is useful for making sure that the UI does not change unexpectedly -- Integration testing -- Mocks, Stubs, and Spies ([Dive Deeper](https://youtu.be/GTaVTa4QuAM?t=119)) - - Mock = An object on which you set expectations - - Stub = Provides predefined answers to method calls - - Spy = Doesn't change functionality - - **In general you can simply refer to it as mocking** - -Some test examples can be found [here](https://github.com/sapegin/jest-cheat-sheet) - -You can also use [this short Jest cheatsheet](https://devhints.io/jest) - -#### React Testing Library - -- Component testing - - Testing based on the correct rendering of components -- Simulate user behavior -- Can't access components state - -[Which RTL query should I use?](https://testing-library.com/docs/guide-which-query/) -[RTL Cheatsheet](https://raw.githubusercontent.com/testing-library/react-testing-library/master/other/cheat-sheet.pdf) - -#### Which testing tool to use - -- For everything related to rendering components and therefore requires evaluations against the DOM -- If you are only testing functions and methods, please use plain Jest - -### What to test? - -#### Do - -- Utility methods -- Complex implementations (eg: algorithms) -- Anything that has edge cases -- Core business logic -- High-risk Services -- Common user interactions -- Error cases that you expect to happen frequently (such as entering an incorrect password when logging in) -- Interactions between units that were stubbed in the unit tests - -#### Don't - -- JavaScript and NodeJS core functions -- Third-party libraries -- External applications -- API calls. Stub them unless you’re doing E2E testing -- Database operations, unless you’re doing E2E testing -- Trivial methods not involving logic (simple getters and setters) -- Code that is throw-away or placeholder code - -### How to write a test? - -- In the same folder of component, create file filename.test.js - - If multiple test files are responsible for the same JS file, please add a Tests folder on the same structure level as the file to include the test files -- Use describe, it, beforeEach, etc. - -### How to execute a test? - -`npm test` to run tests in frontend or server folder (doesn't work yet, needs to be added to scripts) - -### Best practices - -- Tests should be pure (have the same outcome on multiple runs), so mock - - API calls - - Third-party libraries - - Timers - - Dates - - Random values - - File access -- Use constants to assign and evaluate to prevent typos that may cause the test to fail -- Create Tests That Are Resistant to UI Changes -- All tests should be independent of each other - use jest.resetAllMocks(); jest.clearAllMocks(); - - Think about using the built-in afterEach functionality if your Use-Case requires it -- Name your tests wisely. The names should say exactly what the function should do, but not how. This will serve as documentation. -- Find yourself mocking the same function over and over in multiple tests? - - Give it default mock responses in \_\_mocks\_\_ folders using Manual Mocks! -- Treat tests like the rest of the code, keep them clean, simple, easy to understand, and maintain and code review them. -- Create tests from the start, it’s easier and will enforce your code to be more modular, easier to understand, and maintain -- Don’t create fake/poor tests just for increasing coverage -- Avoid including implementation details in tests - -## Next Steps - -- [ ] read through [the jest documentation](https://jestjs.io/docs/en/getting-started) (about 15 minutes) -- [ ] Watch this to the end https://youtu.be/MAFGRx0HYKo?t=1971 (10 mins) and [this](https://youtu.be/GTaVTa4QuAM?t=27) to 2:00 -- [ ] do [this](https://jkettmann.com/beginners-guide-to-testing-react) tutorial (about 40 mins) - -## Places to continue research - -- https://www.freecodecamp.org/news/testing-react-hooks/ -- https://www.youtube.com/watch?v=JKOwJUM4_RM&feature=youtu.be -- https://www.robinwieruch.de/react-testing-library/ -- Jest docs https://jestjs.io/docs/en/getting-started -- RTL Docs https://testing-library.com/docs/react-testing-library/intro/ From 97842efbf14429a143bdad3a7ef5669b8cd7a933 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 13:40:41 +0200 Subject: [PATCH 126/149] Update Coding-Standards.md --- wiki/Coding-Standards.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wiki/Coding-Standards.md b/wiki/Coding-Standards.md index 8af25063..dbf88537 100644 --- a/wiki/Coding-Standards.md +++ b/wiki/Coding-Standards.md @@ -67,12 +67,15 @@ Another Code Formatting Tool being used is [Prettier](https://prettier.io/). Her - "Single Source of Truth" is abbreviated with `Ssot` or `ssot` (don't use `SSoT` or `SSOT`) - use `Robot` in all cases instead of `Bot` - use `Application` in all cases instead of `App` (in context of supported RPA Applications) +- use **hyphens** for CSS-classes and CSS-ids consistently + For example, don't call the class `buttonBackground` and instead call it `button-background`. ### General Code-Style - Do not use double empty lines - Space after openning bracket and before closing bracket (Goal: `import { Space } from AntD`) - Always use single-quotation marks - We use only arrow functions. Please do not use the `function` keyword. +- Try to use only relative units (vw,vh,rem,%) to size elements with css and **not** absolut units (px) ### Documentation Please do not use inline comments to explain the idea behind a variable or a function. Only use those for sources where you found a special solution or workaround or for especially complex code snippets. Further comments regarding the documentation with JSDoc are also ok/appreciated. From 879ce071449398a91786241b21ca744c932e9946 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 13:41:10 +0200 Subject: [PATCH 127/149] Update Documentation-Corporate-Identity.md --- wiki/Documentation-Corporate-Identity.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/Documentation-Corporate-Identity.md b/wiki/Documentation-Corporate-Identity.md index 7042d109..c8507e75 100644 --- a/wiki/Documentation-Corporate-Identity.md +++ b/wiki/Documentation-Corporate-Identity.md @@ -18,7 +18,7 @@ ![](https://via.placeholder.com/15/FF6B00/000000?text=+) color-background-cta: #FF6B00 -How to use this color schema: +**How to use this color schema:** - color-primary: This is the primary color of our brand. It is used for important elements (e.g headlines) - color-primary-inverted: Is the main color complementing the primary color. For example, it can be used for the header/footer. @@ -38,6 +38,6 @@ How to use this color schema: font-weight: 400; - Font-Size: 1rem -## Random +## Miscellaneous - Border-Radius: 5px From 7a75431387235c8815e9f7f8dbc58a7d7f9b4129 Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Mon, 31 May 2021 13:41:54 +0200 Subject: [PATCH 128/149] Update How-To-Write-Code-Documentation.md --- wiki/How-To-Write-Code-Documentation.md | 1 - 1 file changed, 1 deletion(-) diff --git a/wiki/How-To-Write-Code-Documentation.md b/wiki/How-To-Write-Code-Documentation.md index ed2e3899..83eed2a4 100644 --- a/wiki/How-To-Write-Code-Documentation.md +++ b/wiki/How-To-Write-Code-Documentation.md @@ -10,7 +10,6 @@ It should be noted here, that although components are supported as a separate ta ### React Components As mentioned above, React components are supported through a plugin and are currently then still listed under the Classes section. -Because of that tag all methods in the same file are For components please try to use the following style (taken from the [plugins repo](https://github.com/SoftwareBrothers/better-docs#preview)): ``` From b51b086ce4f66f3b0ee9186d9ae428c2c16c17fb Mon Sep 17 00:00:00 2001 From: Sandro Sp <38314662+SanJSp@users.noreply.github.com> Date: Mon, 31 May 2021 13:46:58 +0200 Subject: [PATCH 129/149] Added Video Player Mock to Readme --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 2afd9b26..1a976e55 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,7 @@ Now check http://localhost:3000/ to have a look at the app. To run the local client, follow the steps in the [Readme of the local client](https://github.com/bptlab/ark_automate_local#readme). ## Product Demo -Part 1: -https://user-images.githubusercontent.com/42138601/120075611-51877980-c0a2-11eb-9789-9e68daf4e1a3.mp4 - -Part2: -https://user-images.githubusercontent.com/42138601/120075616-59dfb480-c0a2-11eb-846b-f0635133bab4.mp4 +[![Watch the video](https://i.imgur.com/Q9UTQSY.png)](https://www.youtube.com/watch?v=EIbrYbvtknI) ## Contribute From 676fb02fe9c12b0124c2bc4e75a43cf6905632e9 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Mon, 31 May 2021 14:03:56 +0200 Subject: [PATCH 130/149] update constants to caps --- .../HeaderNavbar/HeaderNavbar.jsx | 28 +++++++++---------- frontend/src/layout/customizedTheme.js | 11 -------- .../robotCodeToSsotParsing.js | 21 +++++++------- .../src/utils/socket/socketConnections.js | 4 +-- .../rpaAttributes/rpaAttributes.test.js | 12 ++++---- 5 files changed, 33 insertions(+), 43 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 645d52c1..3846044b 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -15,26 +15,26 @@ const { Header } = Layout; */ const HeaderNavbar = (props) => { const { selectedKey } = props; - const iconKey = 0; - const robotOverviewPageKey = 1; - const bpmnModelerPageKey = 2; - const robotCodeEditorPageKey = 3; - const robotInteractionPageKey = 4; + const ICON_KEY = 0; + const ROBOT_OVERVIEW_PAGE_KEY = 1; + const BPMN_MODELER_PAGE_KEY = 2; + const ROBOT_CODE_EDITOR_PAGE_KEY = 3; + const ROBOT_INTERACTION_PAGE_KEY = 4; let onOverview = false; - if (selectedKey === robotOverviewPageKey) { + if (selectedKey === ROBOT_OVERVIEW_PAGE_KEY) { onOverview = true; } let onRobotInteraction = false; - if (selectedKey === robotInteractionPageKey) { + if (selectedKey === ROBOT_INTERACTION_PAGE_KEY) { onRobotInteraction = true; } let bpmnModelerLink = '/modeler'; if ( - selectedKey === bpmnModelerPageKey || - selectedKey === robotCodeEditorPageKey + selectedKey === BPMN_MODELER_PAGE_KEY || + selectedKey === ROBOT_CODE_EDITOR_PAGE_KEY ) { bpmnModelerLink += `/${getRobotId()}`; } @@ -46,7 +46,7 @@ const HeaderNavbar = (props) => { mode='horizontal' defaultSelectedKeys={[selectedKey.toString()]} > - + { - + Overview {!onRobotInteraction && ( <> {!onOverview && ( - + Modeler )} {!onOverview && ( - + Robot Code @@ -77,7 +77,7 @@ const HeaderNavbar = (props) => { )} {onRobotInteraction && ( - + Robot Interaction Cockpit )} diff --git a/frontend/src/layout/customizedTheme.js b/frontend/src/layout/customizedTheme.js index f5e7148a..147c9b4f 100644 --- a/frontend/src/layout/customizedTheme.js +++ b/frontend/src/layout/customizedTheme.js @@ -1,7 +1,6 @@ const corporateDesign = require('./corporateDesign'); const customizedTheme = { - // general '@primary-color': corporateDesign.colorPrimary, '@link-color': corporateDesign.colorBackgroundCta, '@success-color': corporateDesign.colorBackgroundCta, @@ -11,27 +10,17 @@ const customizedTheme = { '@layout-body-background': corporateDesign.colorBackground, '@border-radius-base': '5px', '@label-color': corporateDesign.colorPrimaryInvertedText, - - // text '@heading-color': corporateDesign.colorBackgroundText, '@text-color': corporateDesign.colorBackgroundText, '@text-color-dark': corporateDesign.colorPrimaryInvertedText, - // button '@btn-primary-bg': corporateDesign.colorBackgroundCta, - // input '@input-color': corporateDesign.colorBackgroundText, - // sider '@layout-sider-background': corporateDesign.colorPrimaryInverted2, - // component '@component-background': corporateDesign.colorBackground2, - // footer '@layout-footer-background': corporateDesign.colorPrimaryInverted, - // dropdown '@dropdown-menu-bg': corporateDesign.colorPrimaryInverted2, '@select-item-selected-color': corporateDesign.colorBackgroundText, - // header '@layout-header-background': corporateDesign.colorPrimaryInverted, - // fonts '@font-family': 'Lato, sans-serif', }; diff --git a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js index 8bfd7712..f8be6cff 100644 --- a/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js +++ b/frontend/src/utils/parser/robotCodeToSsotParsing/robotCodeToSsotParsing.js @@ -61,10 +61,10 @@ const getApplicationArray = (robotCodeSettingsSection) => { let errorWasThrown; robotCode.forEach((line) => { - const regexForRpaAlias = /Library +RPA[.][a-zA-Z]+/; + const REGEX_FOR_RPA_ALIAS = /Library +RPA[.][a-zA-Z]+/; const elementStartsWithLibrary = line.startsWith('Library '); - const rpaAliasIsCorrect = regexForRpaAlias.test(line); + const rpaAliasIsCorrect = REGEX_FOR_RPA_ALIAS.test(line); const applicationIsAvailable = availableApplications.includes( typeof line.split('RPA.')[1] === 'undefined' ? '' @@ -228,15 +228,16 @@ const getInstructionBlocksFromTaskSection = ( ) => { let errorWasThrown; const instructionBlocks = []; - const regexForOutputValue = /\${(.)+} =/; - const splitPlaceholder = '§&§'; + const REGEX_FOR_OUTPUT_VALUE = /\${(.)+} =/; + const SPLIT_PLACEHOLDER = '§&§'; robotCodeTaskSection.slice(1).forEach((line) => { if (errorWasThrown) return; let currentLine = line; const currentLineIncludesSplitPlaceholder = - currentLine.includes(splitPlaceholder); - const currentLineDefinesOutputValue = regexForOutputValue.test(currentLine); + currentLine.includes(SPLIT_PLACEHOLDER); + const currentLineDefinesOutputValue = + REGEX_FOR_OUTPUT_VALUE.test(currentLine); const currentLineStartsWithFourspace = currentLine.startsWith(FOURSPACE); if (!currentLineStartsWithFourspace) { @@ -253,7 +254,7 @@ const getInstructionBlocksFromTaskSection = ( return; } - currentLine = currentLine.trim().replace(/( {4})/g, splitPlaceholder); + currentLine = currentLine.trim().replace(/( {4})/g, SPLIT_PLACEHOLDER); if (currentLineDefinesOutputValue) { const outputValueName = getOutputName(currentLine); @@ -262,12 +263,12 @@ const getInstructionBlocksFromTaskSection = ( currentLine = currentLineWithoutOutputValueName( currentLine, - splitPlaceholder + SPLIT_PLACEHOLDER ); } if (!errorWasThrown) { - let rpaTask = getRpaTask(currentLine, splitPlaceholder); + let rpaTask = getRpaTask(currentLine, SPLIT_PLACEHOLDER); const allMatchingCombinations = taskAndApplicationCombinations.filter( (singleCombination) => { if (rpaTask === singleCombination.task) return true; @@ -292,7 +293,7 @@ const getInstructionBlocksFromTaskSection = ( rpaTask = rpaTask.replace(`${matchingCombination.application}.`, ''); - const rpaParameters = getRpaParameters(currentLine, splitPlaceholder); + const rpaParameters = getRpaParameters(currentLine, SPLIT_PLACEHOLDER); instructionBlocks[instructionBlocks.length - 1].rpaTask = rpaTask; instructionBlocks[instructionBlocks.length - 1].paramArray = diff --git a/frontend/src/utils/socket/socketConnections.js b/frontend/src/utils/socket/socketConnections.js index f676f942..7f19e4f6 100644 --- a/frontend/src/utils/socket/socketConnections.js +++ b/frontend/src/utils/socket/socketConnections.js @@ -1,7 +1,7 @@ import socketIoClient from 'socket.io-client'; -const endpoint = 'http://localhost:5001'; +const ENDPOINT = 'http://localhost:5001'; -const socket = socketIoClient(endpoint); +const socket = socketIoClient(ENDPOINT); export default socket; diff --git a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js index 0984d065..ba0cdc2e 100644 --- a/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js +++ b/server/api/routes/robots/rpaAttributes/rpaAttributes.test.js @@ -31,8 +31,8 @@ describe('PUT /robots/rpaattributes', () => { it('successfully updates all attributes for a robot', async () => { await dbLoader.loadAttributesInDb(); - const newAppValue = 'NewTestApp'; - const newTaskValue = 'NewTestTask'; + const NEW_APP_VALUE = 'NewTestApp'; + const NEW_TASK_VALUE = 'NewTestTask'; const request = httpMocks.createRequest({ method: 'POST', @@ -41,8 +41,8 @@ describe('PUT /robots/rpaattributes', () => { { activityId: 'Activity_175v5b5', robotId: '606199015d691786a44a608f', - rpaApplication: newAppValue, - rpaTask: newTaskValue, + rpaApplication: NEW_APP_VALUE, + rpaTask: NEW_TASK_VALUE, }, ], }, @@ -62,8 +62,8 @@ describe('PUT /robots/rpaattributes', () => { }) .exec(); - expect(newAttributesObject.rpaApplication).toEqual(newAppValue); - expect(newAttributesObject.rpaTask).toEqual(newTaskValue); + expect(newAttributesObject.rpaApplication).toEqual(NEW_APP_VALUE); + expect(newAttributesObject.rpaTask).toEqual(NEW_TASK_VALUE); }); }); From 85c5b7b1df49aa261e6d399d3857b3bb86be3572 Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Mon, 31 May 2021 14:04:31 +0200 Subject: [PATCH 131/149] Update Database-and-Communication.md --- wiki/Database-and-Communication.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wiki/Database-and-Communication.md b/wiki/Database-and-Communication.md index 8207a6d5..3c9e29c3 100644 --- a/wiki/Database-and-Communication.md +++ b/wiki/Database-and-Communication.md @@ -10,9 +10,7 @@ In the backend please use the mongoose module to make a callout to the database ## Models If you are planning on creating a new document type (called model from now on), please create a javascript file in the modules directory on the server side. There you can specify the schema for objects of that type and also create the model and specify, which collection should be used if not that of the name of the model that you specify. -This can be a bit confusing at first, but I guess you could think of it like this: The schema defines what fields are of what type. The model then assigns this a name and registers it for use. Mongoose will always try to retrieve objects from the remote db from a collection which has the same name as the one specified when creating the model, but this can be overwritten as I mentioned. - -For getting into mongoose I can really recommend [the official getting started](https://mongoosejs.com/docs/index.html) as well as a youtube video which can be found [here](https://www.youtube.com/watch?v=5e1NEdfs4is). It creates a first request through express and shows how mongoose can be used in that context. Also the code is linked in the description of that video if you are interested in trying it out for yourself. +This can be a bit confusing at first, but you could think of it like this: The schema defines what fields are of what type. The model then assigns this a name and registers it for use. Mongoose will always try to retrieve objects from the remote db from a collection which has the same name as the one specified when creating the model, but this can be overwritten as mentioned. ## Testing From 5b5a89ca7def4c3f34a995ecff62eafc77158de6 Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Mon, 31 May 2021 14:15:46 +0200 Subject: [PATCH 132/149] Delete Concept-Starting-and-Orchestrating-Bots.md --- ...Concept-Starting-and-Orchestrating-Bots.md | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 wiki/Concept-Starting-and-Orchestrating-Bots.md diff --git a/wiki/Concept-Starting-and-Orchestrating-Bots.md b/wiki/Concept-Starting-and-Orchestrating-Bots.md deleted file mode 100644 index 14383131..00000000 --- a/wiki/Concept-Starting-and-Orchestrating-Bots.md +++ /dev/null @@ -1,89 +0,0 @@ -# How to start a robot - -Users should be able to start the Bots from a designated Interface where all that user's Bots are listed. The user then should be able to pass in parameters needed for the Bot. - -## Planned functionality - -Starting the Bot will be a task provided of the backend or a fully separate component in the long term. Since this communication will most likely continue our decision of using express, the communication will happen through request paths. -Once those have been created for use from the inside of the system, it should (as of my understanding of the topic) be relatively easy to extend those paths for use from external services. -Doing so would allow us to offer an accessible API through which 3rd party services could be able to start bots and retrieve the results. - -My recommendation would therefore be to focus on the internal trigger functionality, which would allow for external triggers based upon that, once there is a need for it. - -## Where the Bots run - -From a usability standpoint, bots should be run in the cloud in the long run. To accommodate for the goals of the BP we should have the Bots run on the local machine of a user. -This could be accomplished by installing light-weight client software on the user's pc, which also takes care of installing python and the necessary installation of the robot framework. - -My recommendation would be to create this client software as lightweight as possible, such that it needs to be set up once and from then on runs in the background once opened so that the user can do everything through the web interface. -The user should at any point have the option to install the client software and link it but should get a popup urging him/her to do so, once the user tries to run a Bot. A similar approach can i.e. be seen with the Postman web client, which only allows additional functionality if the companion app has been installed locally on the machine. -Additionally, it would be best to for now only allow users to run bots on their machines. That way, a single user can only run one Bot at a time, but we keep the security as easy as possible and have a system that we can build upon in the future. -When switching strategies and following the local execution path for Bots longer down the road it could be a thought to use a filter mechanism that would allow the execution of mutually exclusive Bots at the same time. - -I would recommend an infrastructure that would look like the following diagram: - -![](https://i.imgur.com/OV6onHa.png) -![](https://i.imgur.com/dMtsdwm.png) - -# Orchestrating Bots - -I will provide a list with considerations for and against taking care of the orchestration of Bots within our software. - -Pro: - -- Allows for more deeply integrated functionality, such as statistics -- A single user would increase productivity when running multiple Bots at the same time - -Con: - -- Would require additional authentification issues related to running the Bots on the local machine of different users, such as "Who should be allowed to run a Bot on whose computer?" -- In my opinion this only makes sense **after** the foundation has been laid through the possibility of a single person running multiple Bots at the same time, which as far as my understanding and knowledge goes, would be when the Cloud is available for running the Bots in there -- Outsourcing the orchestration would allow focusing more on the core functionality and should be fairly easy to do once the APIs have been opened to external services to start Bots - -My recommendation would be to not take care of the orchestration in-house, but rather let external services take care of that (for now). I can see the benefits, which would especially help the management level through statistics and extended information, but I do not think that the orchestration should be of priority because of the rabbit hole that we might fall into security-wise. - -# Communication with ark automate dektop app - -Multiple concepts could be applied in the case of ark_automate - -1. Polling and Long-Polling -2. Websockets -3. Server-sent events -4. Higher Abstraction Frameworks - -### Polling and Long-Polling - -Polling is an approach where the desktop app would permenantly 'ask' that there is a new robot to execute. Although it is quite easy to implement, the performance is bad. -Long Polling aims to solve the performance issue by just 'asking' one time and waiting for an answer. The desktop app would 'ask' the server again after a fixed periode of time if the server does not have any new robots to execute. In principle a great approach but it lacks support of frameworks one could use and implementing it from scratch would be too time consuming - -### Websockets - -When using websockets we would open a bidirectional communication channel between the server side and the client side. This is a great solution because real time communication is possible. Still, it is time consuming to implement and a successful connection is not always guaranteed as either element (proxy, firewall, …) prevent WebSocket connections between the client and the server or the browser does not support it yet. - -### Server-sent events - -This is an approach based on the concept of publish-subscribe. The client (desktop app) would subscribe to a 'channel' and the server would push new events (robots to be executed) on that channel. One of the main problem with SSE is the max of 6 client connections from a single host. Also, it is (subjectively) not the best approach to implement with node.js. - -### Higher Abstraction Frameworks - -There are some frameworks using one (or more) of these basic approaches but are one abstraction layer higher for the user. In particular, pusher and socket.io were looked at. -Pusher is based on a publish subscribe approach simular to SSE and it seems to be very easy to use. The biggest disadvantage was that it is not open-source but ultimatly one would have to pay for it. Socket.io is a highly popular (> 4 Mio. weekly npm downloads) open source framework. It is mainly based on websocket communication but is also able to seamlessly switch to a long polling approach in the background if websockets do not work. - -### Decision - -In the end, we decided for socket.io as it is open-cource, well-supported, 'easy' to use, robust and websocket based enabling a bidirectional communication. -To get started it is recommended reading [this](https://socket.io/docs/v4/index.html) introduction to socket.io. Especially these two subpages [1](https://socket.io/docs/v4/server-socket-instance/) & [2](https://socket.io/docs/v4/client-socket-instance/) are relevant for this usecase. - -## How the new approach with socket.io was implemented in the ark automate product - -**Desktop app:** -Here we implemented a CLI that reads the userId the user enters, saves the userId and uses the userId as an authentication for the communication with the web app server. Once started, the desktop app connects with the server by using a socket connection. A socket connection is this bidirectional connection that exist between every client and server. Moreover we use the userId the user entered and ask the server if this socket connection can join the room userId (we have one room for every userId). Once the socket connection was added to the userId room we wait for robots to be executed. Because we are in the userId room we receive robot execution jobs of web frontends that are connected to the same room. - -**Database/Server:** -We implemented a jobs collection in MongoDB as well as a Mongoose jobs model. Every job has a robotId, a userId, a status (waiting/executing/success/failed) and an array of parameters that contains the arguments the user entered in the web frontend when starting the robot execution. - -**Server:** -Sets up a server and socket instance, establishes socket connection with the web frontend and the desktop app, groups sockets by userIds (by using the room concept), reacts on robot execution commands and forwards this command to the desktop app and updates the jobs collection in MongoDB continiously. - -**Web Frontend:** -Connects with the server using a socket connection. Also, like the dektop app, we join a userId specific room whenever the robot overview is rendered. Additionally, we send a robot execution job to the backend when the user clicks on the play button in the robot container. From 888604a693eb2067fba3c84a92b4656bc313e18b Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 14:27:44 +0200 Subject: [PATCH 133/149] Update Vision-for-Ark-Automate.md --- wiki/Vision-for-Ark-Automate.md | 98 +++++---------------------------- 1 file changed, 15 insertions(+), 83 deletions(-) diff --git a/wiki/Vision-for-Ark-Automate.md b/wiki/Vision-for-Ark-Automate.md index 88bf3f0c..48330147 100644 --- a/wiki/Vision-for-Ark-Automate.md +++ b/wiki/Vision-for-Ark-Automate.md @@ -1,49 +1,22 @@ -# Vision - -### Pitch +# Pitch
What can be achieved with our software at the end of the project?

**Customer view** -> Using Ark_automate users can automate business or everyday processes by simply sketching the steps of their process. By using simple flowcharts or powerful BPMN in their process outlines, users can create small software solutions using RPA that finish their tasks much faster and more reliably. +> Using Ark Automate users can automate business or everyday processes by simply sketching the steps of their process. By using simple flowcharts or powerful BPMN in their process outlines, users can create small software solutions using RPA that finish their tasks much faster and more reliably. **Technical view** -> Using Ark_automate users can build their own digital coworkers by visualizing business or everyday processes and automating these using robotic process automation (RPA). The digital coworkers request files or help whilst working on their own tasks which have been taught to them through the multiple modeling notations available. +> Using Ark Automate users can build their own digital coworkers by visualizing business or everyday processes and automating these using robotic process automation (RPA). The digital coworkers request files or help whilst working on their own tasks which have been taught to them through the multiple modeling notations available.

-___ - - -### Until summer 2021 we want to implement a **first working web-app** for our use case. - -
This includes the following

- -- **user management** - - comfortable user log-in - - only single-user accounts, no organizations -- **different front-ends** to create bot flows - - BPMN-editor (`bpmn.js`) - - code-editor (edit `.robot`-code) - - (if possible one more frontend-editor) -- many applications are supported with **RPA tasks**, only a few tasks work via an **API** -- created bots are **running locally**; for this purpose, we provide an Ark Automate **local client** -- users can **interact** with the bots by... - - ... starting the bots via our control interface of the web app - - ... viewing basic statistics in the control interface of the web app - - ... by using an API (especially for external companies) - -

- - -___ - If you are interested in our 5-year vision, please contact us to get access to the file. Our vision with architecture and limits is stored on [HackMD](https://hackmd.io/@toUukITjSM6oWi52UMDSkA/Bk4kOnoqw). # Architecture for 2021 -![2021 Architecture](https://i.imgur.com/sFWWI9L.png) +![2021 Architecture](https://user-images.githubusercontent.com/36270527/120189142-4144db00-c217-11eb-921e-1f9954666944.png) + The **main architectural benefit** will be the modularity and interchangeability of the single components within the system. As the main platform will be created as a single web application, all system components are accessible through a **single browser**. @@ -56,69 +29,28 @@ That way a **Low-Code RPA-Developer** can build new robots in the `Web-Browser` About our **Database-Structure:** - The `Robot Repository` is where all created robots are stored and are available for the users to retrieve and make changes. -- The `RPA-Activity-Storage` stores all activities that can be automated with our software. -- The `User-Data-Storage` stores all the user's data, such as login details, personal settings etc., so that the user can work with the same status of the software on any device. +- The `RPA Activity Storage` stores all activities that can be automated with our software. +- The `User Data Storage` stores all the user's data, such as login details, personal settings etc., so that the user can work with the same status of the software on any device. +- The `Robot Job Storage` stores the execution information for each bot like status, user and error messages. -**Customers** can start the robots via the `Control-Interface` in their `Web-Browser`. There they can also view basic statistics about the individual robots. This interface also allows the **RPA developers** to execute the robots, since they also have all the permissions of the end users. +**Customers** can start the robots via the `Control Interface` in their `Web Browser`. There they can also view basic statistics about the individual robots. (Currently not implemented) This interface also allows the **RPA developers** to execute the robots, since they also have all the permissions of the end users. In addition, an `API` is provided to the robots. External companies can use this to start robots in our system. Also, in the future, our robots could be controlled via this `API` through control and the IoT, for example. To start robots or to get further information about executed robots, there is a communication with the `Robot Coordinator Backend`. -This entire interaction is managed via a `Trigger-Interface`. This central interface ensures the modularity and expendability of the system. The `Robot Coordinator Backend` interacts with the `Local Client` and launches the bots on the local machine. In addition, the backend gets all the information it needs from the database.

-# Using Ark_automate -Here we state how Ark_automate is supposed to be used and which individual steps happen (on an abstract layer). - -### Individual steps that occur when interacting with our software - -
See this sequence diagram regarding bot creation flow

- -![](https://i.imgur.com/cmV4nQX.png) - - -[Sourcecode](https://sequencediagram.org/index.html#initialData=C4S2BsFMAICEHtjQMYCdIENTwHbQGbjwDuAUKRssPKtAKIC265ADhqqMiGzkgGKpcwSDgAmrdp24ZecSgGsR4ilRAA3LDEbNtkALQA+AUKUAuAPIsR0AOqQARgGcwkFaA3Dox3ktLfhYob+ZgBKSpC0xJDgyPAMMGwA5q7Q0KKYqh4wwWLkpPAsSACqjhHQABYYjtAArqW0lLE1vKSpukGCPmKm0AAy8IkgeNS19dCN8M3AreOZml6dAcqpOaKGBrAKZgBqESD4AJ6jZWiQ6bwgGOCOM5Tu85vIirkri0oAPHp6j8+ipmHAGqoPBqPb4EDILAgXCkdJ3dQPLYvehMSCfVamADCuHBqAY0EcNWQyEgjkc+Bq4HABJAiTwQxmcLmnlW5F8pHaRje3Us1gAsvB0lBUG4ESzucpVh0TN0wmIygKhRFYRl7uKZcpyJyMZjyvB4KVoAxBdEholoDhEFCYfCsgsNeQpVyNf9wrRjUKzdBqPBrirbfNWeQiAVoCxBCSyUaTVSvZakOCcCBHOUzqQAJAFJB1MrEZOp6ojDCiUTjDj7O4zNqo6VdP7F0se004c3x614SSQfCV1KpAPquvkdNOjE1FiiebOFtQAmTVAk6DwfDe1A1YDlKtpVVi7IS8i96C+TOFY6RfOk73wcYTk+SCtUcZiMugbsPyAAD2TwBuB+1EtMpRQA+d6vtMB79ruDqbseSC2mARyAZAVBpgeqH2nW6w-GYADikCwRoIDgBg9gziEAAKACC4wsCwP5ob2EFyE8vj0b2qyfN8SJ-ACQIdgRREkTAGA0XRrFMmqMBYbk0FHsOEq1ksrryrQzjpPY7Cbge4k7uhSz7qxWantAeYpheIzIJULZCeWoHQEMNJqewj6lnBwBHMmBLREhwjiKxvaGTmZ6mYWV4WTIyTQORVHCSwmmsX+LoAMpeQ+UXUbFfngcykGDnF9Ejv+Y4Tp4U6JDOjhzguS4rmuG6ZWx8kGBsXGmLh+EYIRxEzsAVTyNU+A0OlGbpumswSUxvx5Wh7FfFJ3F4bx4z8V1MA9Y4fVTah2l2nNjqNRicrpA0y2Cd6vU3NtgZ7ptqRKNAN2LiegXGeeIUoJZEVpWt8jOZFlHpXZ1SIchvn1Si6AKWYyVAUgaUACq9Q9fbZbp7Jg6jgTOnWphFZOZrlZVMDVcAq7rkjGNrE1c2tXhS0dQJM5DCwa5huwGDxMIqD9YN33k4xu3ozNnHMbKC3AmGBrOKdTMs2wqDs3hESiZll2eALYOGQj60VFUdk4MzSBywrnPK2DBUuodZQy4bbMc2U4LRKIpvo-Vqs5Xp+n1SxmV3Q9AVjCZBaXtepbW6z8t2w0T5pTFgOeTDZy-V9vVx8DPnkwl2PQAAkvrLPJ9rYdG5HfMo6ygv7YV4549OMAVUCVXLiTtXk27FMPb79V5Z3va+Oy-tW0DtI4InDLVhDTUYolGCgnAiDk8j41Bq8GqYS10+z-YiDB89ExTLcKPq0L1PYjguL4olRKRnRbfq7oHE6jiIB4gSV+ks7flt0GShAA) -

- -
See this sequence diagram regarding bot interaction via control interface

- -### Regarding the control interface -**We agreed on the following functionalities for the control interface until Summer 2021:** -- Starting bots -- Passing of parameters -- View Logs of recent runs - - Optionally could be enhanced statistics regarding the bots - -**In the long term vision we want additional functionalities like:** -- Live interaction with bots -- Bots request files, ask for help and generate to-dos for humans -- Bots functioning as Real-Time assistants (live chat) - -![](https://i.imgur.com/pd8yRXP.png) - - -[Sourcecode](https://sequencediagram.org/index.html#initialData=C4S2BsFMAIHVIEbQMIHsB2wBOrzQJKaRYBmAhgMYwBi4qA7gFCOXCpbQBCxwZzADmSygKIQZmjUcRdABMBQkWLITOlANaQ5C4SFHjg0ADKoKZPMnAgtwZiwqgAbmWAxuwvu94BaAHxSMVzkALgB5fi04RABnMEhGaGhWEGdXSWkg+UYAmVk-HMzggCUtWWJoekhwClQAWxhBAHN4xLLk1JoM0uZUfkMAVWjygAsyaOgAVyGOShqJzASuHjJ8rpDjVEaQdGg2SemkijmFxPaXTsDuxYLSv181Ck0QgDViEBIAT33yiixIMswIHM0UWZzSDye8kSNzkAB5vN4IaVipBgBMsDtHG8SHoXCAMMxWpAwW4NN1El4yPCYbJgmh0DisLVoNEJkdINFoiQJuA8LFGjttos2g4Uud0pdtMxKatJbTwpE0I9+GBQaKOhLcswabLcii5OUleoVbYiSTNZk7IwZf41vKIjsEKhDKEsVhHNYmOaadq7XckSEAOKo6BOwwAWVRZFkLj45oDWRp8MRZJCJTRGNDzugkd4Md4jBFTnFCd9ct1hRKBo4Yegz09heJ6vFPp6fWgg3K9BA0WGHN2qBZvGEWdNSw8FeRAGVh4Yw2ri2lW9C-fdU7SZ4pRwuxeD14sE34TGYLFYbMFNyP56dm2lj+YUGeTlx18n76frJhgvwcB6yqPoCweZAI5HlgBBM1bxgd9H0-MckwRBNv1-EB-1rICdj+VlwHA4Um0XUlHnJC1bltOVgj+asQOw3DIIIkipVKaBGG6ItdzcZZGCAA) - -

- -
See this sequence diagram regarding starting a bot

- -See [here](https://github.com/bptlab/ark_automate/wiki/Starting-and-orchestrating-Bots-(Vision)#where-the-bots-run) - - - -

- -### Individual steps of the user that occur when interacting with our software -
See our Use-Case diagram

- -![](https://i.imgur.com/FakYLAh.png) +# Using Ark Automate +Here we state how Ark Automate is supposed to be used and which individual steps happen (on an abstract layer). +### User interaction with our software: Use Case Diagram +

See our Use Case Diagram

+![Use Case Diagram](https://i.imgur.com/FakYLAh.png)

@@ -130,6 +62,6 @@ See [here](https://github.com/bptlab/ark_automate/wiki/Starting-and-orchestratin - Providing an interface to expand activities with RPA apps, tasks, and properties - Parsing BPMN to SSOT (and back) - Parsing other modeling notation (flowchart f.e.) to SSOT (and back) -- Parsing SSOT to .robot (reverse not in scope) +- Parsing SSOT to .robot (and back)

From 8244caba8973b6fd4f5a311fec645ce7480cb895 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 14:38:30 +0200 Subject: [PATCH 134/149] Update Documentation-Single-Source-of-Truth.md --- wiki/Documentation-Single-Source-of-Truth.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wiki/Documentation-Single-Source-of-Truth.md b/wiki/Documentation-Single-Source-of-Truth.md index dea7251f..58338eee 100644 --- a/wiki/Documentation-Single-Source-of-Truth.md +++ b/wiki/Documentation-Single-Source-of-Truth.md @@ -77,7 +77,8 @@ No intermediate events are currently supported. ### Overview SSOT hierarchy -![](https://i.imgur.com/7yOqDZv.png) +![image](https://user-images.githubusercontent.com/36270527/120194098-705e4b00-c21d-11eb-9301-937447369e93.png) + ### Component: HEADER From 05a3610788864e9d07f49b9dfedee79c19f0814e Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Mon, 31 May 2021 14:39:30 +0200 Subject: [PATCH 135/149] Delete Team-Scrum-Process.md --- wiki/Team-Scrum-Process.md | 73 -------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 wiki/Team-Scrum-Process.md diff --git a/wiki/Team-Scrum-Process.md b/wiki/Team-Scrum-Process.md deleted file mode 100644 index 4cc8212c..00000000 --- a/wiki/Team-Scrum-Process.md +++ /dev/null @@ -1,73 +0,0 @@ -## Our current Scrum process is the following: - -### General -- One sprint is usually three weeks long. -- The teams' core work time is Monday-Wednesday (9 am-3 pm) and a fourth flexible day that each team member can set himself -- Each member of the team works about 32 hours per week - -### Meetings - -**1. Daily Scrum:** -Limited to 15 min the daily scrum takes place Monday, Tuesday and Wednesday at 9 am in MS Teams. -Only the core team is participating including Maximilian. -The structure the team agreed on is that every team member shortly answers the following three questions: -* What did I do yesterday that helped the Development Team achieve the sprint goal? -* What will I do today to help the Development Team achieve the sprint goal? -* Do I see any obstacle that will prevent me or the Development Team from achieving the Sprint Goal? - -**2. Sprint Planning:** -It usually takes place on the first day of the new sprint. It should never exceed 4 hours. -Only the core team is participating including Maximilian. The Scrum Master is inviting everyone. The goal is to define a sprint backlog and a sprint goal as well as the responsibilities for the different issues. We estimate the effort of the stories using Planning Poker. We decided to use the Fibonacci scale at the beginning of the 6th sprint. One story point corresponds to 2 man-hours. - -**3. Sprint Review:** -It usually takes place on the last day of the sprint. It takes about 1 hour. -The core team is participating as well as important Stakeholders like Prof. Weske, Tobias Metzke-Bernstein, Simon Siegert, Maximilian Völker. The Product Owner takes care of the invitations. -First, the Product Owner presents which stories of the backlog were done and the Development Team shows the product increment and explains what went well and what challenges they faced. Second, the stakeholders give feedback on the product increment and give valuable input for the next sprint. - -**4. Sprint Retrospective:** -It takes place directly 0.5 hours after the sprint review. It should not exceed 1.5 hours. Only the core team is participating. -The Scrum Master is inviting everyone. The goal is to reflect on the last sprint and find ways to improve the scrum process as well as the way the team works together. The Scrum Master informs Maximilian about any changes to the process and updates this wiki. - -### Artefacts -All the relevant scrum artifacts are stored here in this GitHub project. - -**Product Increment:** -* The current product increment can be found on the master branch. It is updated before every sprint review. - -**Product Backlog & Sprint Backlog:** -* Can be found in the "Projects" tab under "Kanban Board". -* For every user story, the definition of done is defined under the point "Conditions of satisfaction". -* New ideas for user stories can be sent to the product owner directly or an issue can be created in the column "User Story Ideas / Bug Reporting" - - -### Agreements - -We agreed on having a **Pull Request freeze on 14:00** the day before the sprint review. This means, that no further Pull Requests may be created until then, if the changes are supposed to be merged for the current sprint goal. The same day **at 18:00 we agreed on a merge freeze**, which means no further pull requests from feature branches are to be merged into dev for the release presented at the sprint review the next day. User stories that are merged after 18:00 will be presented at the next sprint review. - -### Action Points for this Sprint - -During our last retrospective we agreed on tackling the following action points: -* We listen attentively in the Daily Standup and do not occupy ourselves elsewhere. -* We have agreed on uniform abbreviations. HPI's public relations is abbreviated as `ÖA` and the Bachelorpodium is abbreviated as `BPod` -* We independently and attentively check the PRs we are assigned on the day before the review. This way we avoid frequent requests for the current status of the reviews. -* We review pull requests more conscientiously in the future. This has been left a bit behind. -* We agreed to define the core time of the bachelor project in our last sprint as the most important element. Likewise, everyone independently reviews their hours worked at the end of each day. -* The sprint backlog should be divided into two categories in this sprint. Issues of the first category should first be completed before the issues of the second priority group are processed. - -### Old Action Points -* Twice a week the team will have a common coffee break to talk about topics far away from work. This coffee break will take place on Mondays and Wednesdays from 16:00-16:30. -* The review will also be scheduled for 10:00 a.m. for future sprints. The Scrum Master thinks about an alternative form for the Daily before. -* The deadline for setting a PR until 14:00 should remain as a guideline. The release (merge to the main) and the deployment will always be executed on Tuesdays until EOB (18:30-19:00 at the latest). -* PRs must be reviewed within one business day. Own PRs should not be prioritized over other people's PRs. -* In the next sprint, a session will be held to address the question of how and whether we will continue to work on the software after the end of the project. -* Calls in the meeting channel should be named more meaningfully. Likewise, before a person joins, they should be asked if it is appropriate. -* The scrum master will take care of the coordination of all further presentations. For this purpose, he will consult the project supervisor. -* The Scrum master wants to interrogate when and how much work is still expected on the bachelors project in June so that we can plan the writing of our bachelors thesis. -* Calls between team members will be held in a "Teams-Meeting" in our Meeting Channel, so that other team members can feel free to join. -* We want to make the communication between team members and stakeholders more transparent. Therefore, we will from now on post important information from stakeholders in our teams and inform other team members about it in the next daily. -* We will delete the Quote-thread. -* The Scrum Master will open a thread regarding further distribution of the presentations which are supposed to be held. We then want to finally assign us to these presentations. -* Pull Requests that introduce more than 500 lines of changes need a more detailed description so that reviewers can understand the components, not only check for syntax. -* Work on spike issues is supposed to be stopped as soon as the estimated time has passed -* We want to figure out ways to find a balance between time spent on our bachelors project and the bachelors thesis. -* We need to define our programming style for issues, wether it's closer to extreme programming or more future proof implementations From 91fa8d17692cd96588864108bb2672d547e16f25 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Mon, 31 May 2021 15:03:03 +0200 Subject: [PATCH 136/149] Update frontend/src/api/routes/robots/robots.js Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- frontend/src/api/routes/robots/robots.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/api/routes/robots/robots.js b/frontend/src/api/routes/robots/robots.js index afc44c09..e9bbfd13 100644 --- a/frontend/src/api/routes/robots/robots.js +++ b/frontend/src/api/routes/robots/robots.js @@ -23,7 +23,7 @@ const getSsot = async (robotId) => { /** * @description Rename the robot in the ssot - * @param {String} robotId RobotId of the robot that will be renamed + * @param {String} robotId RobotId of the robot that will be renamed * @param {String} newRobotName String with the new RobotName * @returns {Object} Object containing robotName and starterId */ From ba931275909ee2aaf0a15e10089f13fe13edbf01 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Mon, 31 May 2021 15:03:11 +0200 Subject: [PATCH 137/149] Update frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- .../RobotInteractionExecutionSection.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx index 69ad368e..8900d002 100644 --- a/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx +++ b/frontend/src/components/pages/RobotInteractionCockpit/RobotInteractionSections/RobotInteractionExecutionSection/RobotInteractionExecutionSection.jsx @@ -23,7 +23,7 @@ const RobotInteractionExecutionSection = (props) => { /** * @description Displays the suitable status icon for robot execution * @param {String} status Current Status of the robot execution - * @returns {Object} Returns an icon component or undefined + * @returns {React.ReactElement} Returns an icon component or undefined */ const displayStatusIcon = (status) => { if (status === 'PASS' || status === 'successful') { From 6a1ce8566ea6cd772b5b48752948cd2dfbf0b142 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Mon, 31 May 2021 15:13:32 +0200 Subject: [PATCH 138/149] put comment back in --- server/api/routes/users/users.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/api/routes/users/users.test.js b/server/api/routes/users/users.test.js index e2e033d7..7b2be46a 100644 --- a/server/api/routes/users/users.test.js +++ b/server/api/routes/users/users.test.js @@ -43,6 +43,8 @@ describe('GET /users/{userId}/robots', () => { await ssotRetrievalController.getRobotList(request, response); const data = await response._getData(); expect(response.statusCode).toBe(200); + // Catches error "Received: serializes to the same string" + // Solution found here https://github.com/facebook/jest/issues/8475#issuecomment-537830532 expect(JSON.stringify(data[0]._id)).toEqual(JSON.stringify(testRobotId)); }); }); From 1495673f1b4eb4764d918bbe600665c7647e7d35 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 16:43:34 +0200 Subject: [PATCH 139/149] Update Vision-for-Ark-Automate.md --- wiki/Vision-for-Ark-Automate.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/Vision-for-Ark-Automate.md b/wiki/Vision-for-Ark-Automate.md index 48330147..f8d178a8 100644 --- a/wiki/Vision-for-Ark-Automate.md +++ b/wiki/Vision-for-Ark-Automate.md @@ -13,9 +13,9 @@ If you are interested in our 5-year vision, please contact us to get access to the file. Our vision with architecture and limits is stored on [HackMD](https://hackmd.io/@toUukITjSM6oWi52UMDSkA/Bk4kOnoqw). -# Architecture for 2021 +# Current Architecture -![2021 Architecture](https://user-images.githubusercontent.com/36270527/120189142-4144db00-c217-11eb-921e-1f9954666944.png) +![Current Architecture](https://user-images.githubusercontent.com/36270527/120189142-4144db00-c217-11eb-921e-1f9954666944.png) The **main architectural benefit** will be the modularity and interchangeability of the single components within the system. From 923cc05af23333d931962c74ba3100059f838864 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Mon, 31 May 2021 16:50:16 +0200 Subject: [PATCH 140/149] Update _Sidebar.md --- wiki/_Sidebar.md | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index 68b020ea..8936396a 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -1,24 +1,16 @@ Back to the [Wiki home](https://github.com/bptlab/ark_automate/wiki) - - About Ark_automate + - **About Ark Automate** - [Pitch](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Pitch) - - [Vision](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate) - - [Features to be implemented](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Until-summer-2021-we-want-to-implement-a-first-working-web-app-for-our-use-case) until the summer of 2021 - - [Architecture](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Architecture) + - [Architecture](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#current-architecture) + - [Interaction with our Software](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#using-ark-automate) until the summer of 2021 -- Documentation - - [The repo structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) +- **Documentation** + - [Repository Structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) - [Coding Standards](https://github.com/bptlab/ark_automate/wiki/Coding-standards) - - [Code documentation](https://bptlab.github.io/ark_automate/) - - [Our single source of truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) - - [Corporate identity of Ark_automate](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) - - [Team work](https://github.com/bptlab/ark_automate/wiki/Team-Scrum-process) + - [Code Documentation](https://bptlab.github.io/ark_automate/) + - [Concept Behind the Single Source of Truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) + - [Corporate Identity](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) - [Github Workflows](https://github.com/bptlab/ark_automate/wiki/Github-Workflows) - -- Concepts - - [Planned user interaction](https://github.com/bptlab/ark_automate/wiki/concept-Starting-and-orchestrating-Bots) in the summer of 2021 - -- Guides - - [Code documentation](https://github.com/bptlab/ark_automate/wiki/How-to-write-code-documentation) - - [Tests](https://github.com/bptlab/ark_automate/wiki/How-to-write-tests) - - [Style our components using css](https://github.com/bptlab/ark_automate/wiki/How-to-style-using-css) + - [Database Communication](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Database-and-Communication) + - [Testing Conventions](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Testing-Conventions) From 8e1b38e03c1654b339e3e33be9acb577a2897305 Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Mon, 31 May 2021 16:53:44 +0200 Subject: [PATCH 141/149] minor fixed of inconsistent naming --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 2 +- wiki/Documentation-Single-Source-of-Truth.md | 3 +-- wiki/Home.md | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 5d84ed2a..392a8fbc 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -51,7 +51,7 @@ const HeaderNavbar = (props) => { ark_automate Icon diff --git a/wiki/Documentation-Single-Source-of-Truth.md b/wiki/Documentation-Single-Source-of-Truth.md index 58338eee..d07a232e 100644 --- a/wiki/Documentation-Single-Source-of-Truth.md +++ b/wiki/Documentation-Single-Source-of-Truth.md @@ -2,7 +2,7 @@ ## What do we need a SSoT for? -The goal of Ark_automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. +The goal of Ark Automate is to have multiple interfaces altering/showing the same robot. For each robot, there will be a properties panel to change attributes, a view of the current .robot code and possibly multiple modeling interfaces. The user selects the modeling language he/she prefers and starts modeling the behavior of the robot (at least for now the user has to pre-select the modeling language). At the same time, the user can view/change the .robot code of the bot and/or update attributes via the property panel. To achieve that we need a single-source-of-truth(SSoT) for each robot. In the SSoT all necessary information is saved so that changes can be automatically applied to every interface. @@ -79,7 +79,6 @@ No intermediate events are currently supported. ![image](https://user-images.githubusercontent.com/36270527/120194098-705e4b00-c21d-11eb-9301-937447369e93.png) - ### Component: HEADER User information about a robot (creator, released for etc.) is stored in an additional file in the database. diff --git a/wiki/Home.md b/wiki/Home.md index 44cc6521..44989d1a 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -1,6 +1,6 @@ -# Welcome to the Ark_automate wiki! +# Welcome to the Ark Automate wiki! -Ark_automate is an open-source RPA tool that uses several modeling languages to create bots. +Ark Automate is an open-source RPA tool that uses several modeling languages to create bots. In our Wiki you can find the following: From 06dd5af6891cc6a7581563e933eb0f7d04ce4bc9 Mon Sep 17 00:00:00 2001 From: Kay Jenss <44369294+kej-jay@users.noreply.github.com> Date: Mon, 31 May 2021 17:00:46 +0200 Subject: [PATCH 142/149] Update Home.md --- wiki/Home.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/wiki/Home.md b/wiki/Home.md index 44989d1a..68e06e94 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -4,26 +4,20 @@ Ark Automate is an open-source RPA tool that uses several modeling languages to In our Wiki you can find the following: -- our [vision](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate) for this project including a [pitch](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Pitch), the [features to be implemented](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Until-summer-2021-we-want-to-implement-a-first-working-web-app-for-our-use-case) in the summer of 2021, the [architecture](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Architecture) and the [user interaction](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Using-Ark_automate) -- documentation regarding [the structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) of this project -- our [code documentation](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) hostet on GitHub Pages grouped by modules and classes -- documentation regarding [our single source of truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) -- documentation the [corporate identity of Ark_automate](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) -- documentation regarding our [team work](https://github.com/bptlab/ark_automate/wiki/Team-Scrum-process) -- concepts on how we think users to interact with [the bots](https://github.com/bptlab/ark_automate/wiki/concept-Starting-and-orchestrating-Bots) -- our own guides to learn how to - - write [code documentation](https://github.com/bptlab/ark_automate/wiki/How-to-write-code-documentation) - - write [tests](https://github.com/bptlab/ark_automate/wiki/How-to-write-tests) - - sytle [our components using css](https://github.com/bptlab/ark_automate/wiki/How-to-style-using-css) +- our [vision](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate) for this project including a pitch, the architecture and the user interaction +- documentation regarding [the structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-Structure) of this project +- our [code documentation](https://bptlab.github.io/ark_automate/) hostet on GitHub Pages grouped by modules and classes +- documentation regarding [our single source of truth](https://github.com/bptlab/ark_automate/wiki/Documentation-Single-Source-of-Truth) +- documentation the [corporate identity of Ark Automate](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) ## API documentation -The OpenApi documentation of the offered API can be found when fetching the /docs route from the running backend, which is up to date with everything in the Code, as it is generated at runtime. +The OpenApi documentation of the offered API can be found when fetching the `/docs` route from the running backend, which is up to date with everything in the Code, as it is generated at runtime. WHen running a local version of the software you can access the documentation using `localhost:5000/docs` ## How to contribute to the wiki -To contribute a page to the wiki, please create a markdown file in the `wiki` directory or edit an existing one. It will automatically be deployed as a wiki page once it is pushed onto the DEV branch. +To contribute a page to the wiki, please create a markdown file in the `/wiki` directory or edit an existing one. It will automatically be deployed as a wiki page once it is pushed onto the DEV branch. The page title will have the same name as the filename of your created file and will show hyphens as empty spaces. Therefore, we ask you to not use empty spaces in your filenames. > The deployment of wiki pages will overwrite the existing pages, so if you want to persist your article in the wiki, please go the route of creating a markdown file. From 5e1b1a0fe74ab716c0f422ea29994c4b74d5980f Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 1 Jun 2021 07:56:57 +0200 Subject: [PATCH 143/149] Update wiki/Coding-Standards.md Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- wiki/Coding-Standards.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/Coding-Standards.md b/wiki/Coding-Standards.md index dbf88537..b1021523 100644 --- a/wiki/Coding-Standards.md +++ b/wiki/Coding-Standards.md @@ -68,7 +68,7 @@ Another Code Formatting Tool being used is [Prettier](https://prettier.io/). Her - use `Robot` in all cases instead of `Bot` - use `Application` in all cases instead of `App` (in context of supported RPA Applications) - use **hyphens** for CSS-classes and CSS-ids consistently - For example, don't call the class `buttonBackground` and instead call it `button-background`. + - For example, don't call the class `buttonBackground` and instead call it `button-background`. ### General Code-Style - Do not use double empty lines From aa8eddded9ccd07145d4f6b4eb944008d602091b Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 1 Jun 2021 08:04:49 +0200 Subject: [PATCH 144/149] add Hot-To-Use-CSS --- wiki/How-To-Use-CSS.md | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 wiki/How-To-Use-CSS.md diff --git a/wiki/How-To-Use-CSS.md b/wiki/How-To-Use-CSS.md new file mode 100644 index 00000000..7dcbf2fe --- /dev/null +++ b/wiki/How-To-Use-CSS.md @@ -0,0 +1,71 @@ +# How to apply CSS in this Project + +## Use of styles via CSS + +In principle, before each use of CSS should be considered whether the use in the planned place is absolutely necessary. Special caution with: + +- **Changes of colors, font sizes, and fonts:** Should be urgently avoided since we always refer to the properties defined in the theme. +- **Add spacing (padding):** Should be urgently avoided, as AntD's Space component should be used for this. + +### Basic rules for styling: + +
See the rules +

+ +- we do **just use inline CSS with AntD components for 1-2 properties** -> all CSS code with more than two properties is outsourced to external files. +- **global CSS properties** (which cannot be specified in the theme) are only written to `Index.css` to prevent several sources of global style +- **local CSS properties** are written to a file next to the component where they occur and CSS modules are used for this purpose +- if **multiple components** need the **same customization**, the CSS property should be set in a CSS modules file next to the common parent component + +

+ +### CSS vs. CSS modules + +
When to use what? +

+ +In React the style of "normal" CSS files like _Example.css_ are defined globally. Therefore you don't need to explicitly import the CSS file to use the style. Thus be very careful when using normal CSS files and keep in mind that the style you define can be used in any file of the repository. +For example when you define the following style... + +```css +.button { + background-color: red; +} +``` + +... this might lead to confusion because whenever someone uses the class button now this style is applied no matter if it was intended or not. + +If you want to apply style just to specific files and not globally react has a solution called CSS modules. Instead of creating a file _Example.css_ you have to create _Example.module.css_. This file you have to explicitly import in every file you want to use it in. For example like this: + +```jsx +import styles from './Example.module.css'; +``` + +Now let's continue with this example. Let's say in _Example.module.css_ we have defined the following because we just want the buttons of this file to be green: + +```css +.button { + background-color: green; +} +``` + +In the file we would include the style in the following way: + +```jsx + +``` + +

+ +### Conventions + +
We agreed on +

+ +- naming: + For the naming of classes and ids please use **hyphens** consistently. + For example, don't call the class `buttonBackground` and instead call it `button-background`. +- sizing: + Try to use only relative units (vw,vh,rem,%) to size elements and **not** absolut units (px) + +

From fbdb258c65519ac6f73d7054f4b1e9ed0f12c9bb Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 1 Jun 2021 08:11:09 +0200 Subject: [PATCH 145/149] Update wiki/_Sidebar.md Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- wiki/_Sidebar.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index 8936396a..c5313f95 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -12,5 +12,5 @@ Back to the [Wiki home](https://github.com/bptlab/ark_automate/wiki) - [Concept Behind the Single Source of Truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) - [Corporate Identity](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) - [Github Workflows](https://github.com/bptlab/ark_automate/wiki/Github-Workflows) - - [Database Communication](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Database-and-Communication) - - [Testing Conventions](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Testing-Conventions) + - [Database Communication](https://github.com/bptlab/ark_automate/wiki/Database-and-Communication) + - [Testing Conventions](https://github.com/bptlab/ark_automate/wiki/Testing-Conventions) From 4f9278353b938cf2c44574f88884de531b77aeba Mon Sep 17 00:00:00 2001 From: Lukas Hueller Date: Tue, 1 Jun 2021 08:24:28 +0200 Subject: [PATCH 146/149] minor changes --- ...ocumentation-Communication-Local-Client.md | 18 +++++++++++++ wiki/Documentation-Single-Source-of-Truth.md | 2 +- wiki/Home.md | 2 +- wiki/_Sidebar.md | 27 ++++++++++--------- 4 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 wiki/Documentation-Communication-Local-Client.md diff --git a/wiki/Documentation-Communication-Local-Client.md b/wiki/Documentation-Communication-Local-Client.md new file mode 100644 index 00000000..e6fa0683 --- /dev/null +++ b/wiki/Documentation-Communication-Local-Client.md @@ -0,0 +1,18 @@ +# How the approach with socket.io was implemented our platform + +**Desktop app:** +Here we implemented a CLI that reads the userId the user enters, saves the userId and uses the userId as an authentication for the communication with the web app server. Once started, the desktop app connects with the server by using a socket connection. A socket connection is this bidirectional connection that exist between every client and server. Moreover we use the userId the user entered and ask the server if this socket connection can join the room userId (we have one room for every userId). Once the socket connection was added to the userId room we wait for robots to be executed. Because we are in the userId room we receive robot execution jobs of web frontends that are connected to the same room. + +**Database/Server:** +We implemented a jobs collection in MongoDB as well as a Mongoose jobs model. Every job has a robotId, a userId, a status (waiting/executing/success/failed) and an array of parameters that contains the arguments the user entered in the web frontend when starting the robot execution. + +**Server:** +Sets up a server and socket instance, establishes socket connection with the web frontend and the desktop app, groups sockets by userIds (by using the room concept), reacts on robot execution commands and forwards this command to the desktop app and updates the jobs collection in MongoDB continiously. + +**Web Frontend:** +Connects with the server using a socket connection. Also, like the dektop app, we join a userId specific room whenever the robot overview is rendered. Additionally, we send a robot execution job to the backend when the user clicks on the play button in the robot container. + +## Why we Use Socket.io + +In the end, we decided for socket.io as it is open-cource, well-supported, 'easy' to use, robust and websocket based enabling a bidirectional communication. +To get started it is recommended reading [this](https://socket.io/docs/v4/index.html) introduction to socket.io. Especially these two subpages [1](https://socket.io/docs/v4/server-socket-instance/) & [2](https://socket.io/docs/v4/client-socket-instance/) are relevant for this usecase. diff --git a/wiki/Documentation-Single-Source-of-Truth.md b/wiki/Documentation-Single-Source-of-Truth.md index d07a232e..9070f662 100644 --- a/wiki/Documentation-Single-Source-of-Truth.md +++ b/wiki/Documentation-Single-Source-of-Truth.md @@ -114,7 +114,7 @@ User information about a robot (creator, released for etc.) is stored in an addi } ``` -**parameter object extending the INSTRUCTION:** +**Parameter Object Extending the INSTRUCTION Element** ```json { diff --git a/wiki/Home.md b/wiki/Home.md index 68e06e94..c5b24f0d 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -5,8 +5,8 @@ Ark Automate is an open-source RPA tool that uses several modeling languages to In our Wiki you can find the following: - our [vision](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate) for this project including a pitch, the architecture and the user interaction -- documentation regarding [the structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-Structure) of this project - our [code documentation](https://bptlab.github.io/ark_automate/) hostet on GitHub Pages grouped by modules and classes +- documentation regarding [the structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-Structure) of this project - documentation regarding [our single source of truth](https://github.com/bptlab/ark_automate/wiki/Documentation-Single-Source-of-Truth) - documentation the [corporate identity of Ark Automate](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index 8936396a..05b13103 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -1,16 +1,19 @@ Back to the [Wiki home](https://github.com/bptlab/ark_automate/wiki) - - **About Ark Automate** - - [Pitch](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Pitch) - - [Architecture](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#current-architecture) - - [Interaction with our Software](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#using-ark-automate) until the summer of 2021 +- **About Ark Automate** + + - [Pitch](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#Pitch) + - [Architecture](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#current-architecture) + - [Interaction with our Software](https://github.com/bptlab/ark_automate/wiki/Vision-for-Ark-automate#using-ark-automate) until the summer of 2021 - **Documentation** - - [Repository Structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) - - [Coding Standards](https://github.com/bptlab/ark_automate/wiki/Coding-standards) - - [Code Documentation](https://bptlab.github.io/ark_automate/) - - [Concept Behind the Single Source of Truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) - - [Corporate Identity](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) - - [Github Workflows](https://github.com/bptlab/ark_automate/wiki/Github-Workflows) - - [Database Communication](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Database-and-Communication) - - [Testing Conventions](https://github.com/bptlab/ark_automate/wiki/Github-Workflows/Testing-Conventions) + - [Repository Structure](https://github.com/bptlab/ark_automate/wiki/Documentation-Folder-structure) + - [Code Documentation](https://bptlab.github.io/ark_automate/) + - [Github Workflows](https://github.com/bptlab/ark_automate/wiki/Github-Workflows) + - [Coding Standards](https://github.com/bptlab/ark_automate/wiki/Coding-standards) + - [How To Style Components](https://github.com/bptlab/ark_automate/wiki/How-To-Use-CSS) + - [Corporate Identity](https://github.com/bptlab/ark_automate/wiki/Documentation-Corporate-Identity) + - [Concept Behind the Single Source of Truth](https://github.com/bptlab/ark_automate/wiki/Documentation-single-source-of-truth) + - [Database Communication](https://github.com/bptlab/ark_automate/wiki/Database-and-Communication) + - [Communication with Local Client](https://github.com/bptlab/ark_automate/wiki/Documentation-Communication-Local-Client) + - [Testing Conventions](https://github.com/bptlab/ark_automate/wiki/Testing-Conventions) From 48df530d1efe4ba54cf52800cda64499f71e2f66 Mon Sep 17 00:00:00 2001 From: WolfgangDaniel <42138601+WolfgangDaniel@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:11:30 +0200 Subject: [PATCH 147/149] Update frontend/src/components/App.jsx Co-authored-by: Kay Jenss <44369294+kej-jay@users.noreply.github.com> --- frontend/src/components/App.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/App.jsx b/frontend/src/components/App.jsx index 3691d25d..d447885d 100644 --- a/frontend/src/components/App.jsx +++ b/frontend/src/components/App.jsx @@ -18,7 +18,7 @@ const App = () => ( - + Date: Tue, 1 Jun 2021 09:13:41 +0200 Subject: [PATCH 148/149] implement changes --- .../multiPageComponents/HeaderNavbar/HeaderNavbar.jsx | 2 +- server/socket/socketHelperFunctions.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx index 3846044b..a55cc4d1 100644 --- a/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx +++ b/frontend/src/components/multiPageComponents/HeaderNavbar/HeaderNavbar.jsx @@ -71,7 +71,7 @@ const HeaderNavbar = (props) => { {!onOverview && ( Robot Code - + )} diff --git a/server/socket/socketHelperFunctions.js b/server/socket/socketHelperFunctions.js index e5bc4854..85d4469a 100644 --- a/server/socket/socketHelperFunctions.js +++ b/server/socket/socketHelperFunctions.js @@ -58,7 +58,7 @@ exports.getRobotJobParameters = async (jobId) => { }; /** - * @description Fetches the ssot from the database and parses the ssot to robot code + * @description Fetches the user ids of all the users * @returns {Array} All user ids */ exports.getAllUserIds = async () => { From 6ae85e95226e854b50e565ccbdf7476ce21d6f97 Mon Sep 17 00:00:00 2001 From: lukashueller <36270527+lukashueller@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:19:07 +0200 Subject: [PATCH 149/149] Update wiki/Documentation-Communication-Local-Client.md Co-authored-by: Sandro Sp <38314662+SanJSp@users.noreply.github.com> --- wiki/Documentation-Communication-Local-Client.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/Documentation-Communication-Local-Client.md b/wiki/Documentation-Communication-Local-Client.md index e6fa0683..77d7d6f5 100644 --- a/wiki/Documentation-Communication-Local-Client.md +++ b/wiki/Documentation-Communication-Local-Client.md @@ -1,4 +1,4 @@ -# How the approach with socket.io was implemented our platform +# How the approach with socket.io was implemented on our platform **Desktop app:** Here we implemented a CLI that reads the userId the user enters, saves the userId and uses the userId as an authentication for the communication with the web app server. Once started, the desktop app connects with the server by using a socket connection. A socket connection is this bidirectional connection that exist between every client and server. Moreover we use the userId the user entered and ask the server if this socket connection can join the room userId (we have one room for every userId). Once the socket connection was added to the userId room we wait for robots to be executed. Because we are in the userId room we receive robot execution jobs of web frontends that are connected to the same room.